#include <stdio.h>
#include <stdlib.h>
#define N 100
void spline(double x[], double y[], double b[], double c[], double d[], int n) {
double h;
int i;
double *alpha = malloc((n - 1) * sizeof(double));
double *l = malloc(n * sizeof(double));
double *mu = malloc(n * sizeof(double));
double *z = malloc(n * sizeof(double));
for (i = 0; i < n - 1; i++) {
h = x[i + 1] - x[i];
alpha[i] = (3 / h) * (y[i + 1] - y[i]) - (3 / h) * (y[i] - y[i - 1]);
}
l[0] = 1;
mu[0] = 0;
z[0] = 0;
for (i = 1; i < n - 1; i++) {
h = x[i + 1] - x[i];
l[i] = 2 * (x[i + 1] - x[i - 1]) - h * mu[i - 1];
mu[i] = h / l[i];
z[i] = (alpha[i] - h * z[i - 1]) / l[i];
}
l[n - 1] = 1;
for (i = n - 2; i >= 0; i--) {
c[i] = z[i] - mu[i] * c[i + 1];
b[i] = alpha[i] - (x[i + 1] - x[i]) * (c[i + 1] + 2 * c[i]) / 3;
d[i] = (c[i + 1] - c[i]) / (3 * (x[i + 1] - x[i]));
}
b[n - 1] = 0;
c[n - 1] = 0;
d[n - 1] = 0;
free(alpha);
free(l);
free(mu);
free(z);
}
double cubicSplineEval(double x[], double y[], double b[], double c[], double d[], int n, double xe) {
int i;
for (i = 0; i < n - 1; i++) {
if (xe >= x[i] && xe < x[i + 1]) {
break;
}
}
double h = x[i + 1] - x[i];
double a = y[i];
double xe_minus_xi = xe - x[i];
return a + b[i] * xe_minus_xi + c[i] * xe_minus_xi * xe_minus_xi + d[i] * xe_minus_xi * xe_minus_xi * xe_minus_xi;
}
int main() {
double x[N] ;
double y[N] ;
double b[N], c[N], d[N];
for (int i = 0; i < N; i++) {
x[i] = i;
y[i] = x[i] * x[i] - x[i] + 3;
}
spline(x, y, b, c, d, N);
double xe;
xe = 81.0;;
double ye = cubicSplineEval(x, y, b, c, d, N, xe);
printf("在x=%f处的插值结果是: %f\n", xe, ye);
xe = 81.6;;
ye = cubicSplineEval(x, y, b, c, d, N, xe);
printf("在x=%f处的插值结果是: %f\n", xe, ye);
xe = 82.0;;
ye = cubicSplineEval(x, y, b, c, d, N, xe);
printf("在x=%f处的插值结果是: %f\n", xe, ye);
return 0;
}