#include <stdio.h>
#include <stdlib.h>
#define N 100
void spline(double x[], double y[], double b[], double c[], double d[], int n);
double cubicSplineEval(double x[], double y[], double b[], double c[], double d[], int n, double xval);
int main() {
double x[N], y[N], b[N], c[N], d[N];
int i;
for (i = 0; i < N; i++) {
x[i] = i;
y[i] = x[i] * x[i] - x[i] + 3;
}
spline(x, y, b, c, d, N);
printf("Cubic Spline Interpolation results:\n");
for (i = 0; i < N; i += 1) {
printf("f(%5.2f) = %8.4f\n", x[i], cubicSplineEval(x, y, b, c, d, N, x[i]));
}
return 0;
}
void spline(double x[], double y[], double b[], double c[], double d[], int n) {
double h;
int i;
double *a = malloc((n - 1) * sizeof(double));
for (i = 0; i < n - 1; i++) {
h = x[i + 1] - x[i];
a[i] = (3 / h) * (y[i + 1] - y[i]) - (3 / h) * (y[i] - y[i - 1]);
}
c[0] = 0.0;
for (i = 1; i < n - 1; i++) {
double l = 2 * (x[i + 1] - x[i - 1]) - (x[i] - x[i - 1]) * c[i - 1];
c[i] = (a[i] - (x[i] - x[i - 1]) * c[i - 1]) / l;
b[i] = a[i + 1] - (x[i + 2] - x[i + 1]) * c[i + 1];
b[i] /= x[i + 2] - x[i];
d[i] = (c[i + 1] - c[i]) / (3 * (x[i + 2] - x[i]));
}
b[n - 1] = 0.0;
c[n - 1] = 0.0;
d[n - 1] = 0.0;
free(a);
}
double cubicSplineEval(double x[], double y[], double b[], double c[], double d[], int n, double xval) {
int i = 0, j = n - 1;
while (i < j) {
int m = (i + j) / 2;
if (xval < x[m])
j = m;
else
i = m + 1;
}
double dx = xval - x[i];
return y[i] + b[i] * dx + c[i] * dx * dx + d[i] * dx * dx * dx;
}