#include <stdio.h>#include <stdio.h>
#include <stdlib.h>
#define N 100
typedef struct {
double x;
double y;
} Point;
void cubicSpline(Point points[], int n, double a[], double b[], double c[], double d[]) {
double h[N - 1], alpha[N - 1], l[N], mu[N], z[N];
for (int i = 0; i < n - 1; i++) {
h[i] = points[i + 1].x - points[i].x;
alpha[i] = (points[i + 1].y - points[i].y) / h[i];
}
l[0] = 1;
mu[0] = 0;
z[0] = 0;
for (int i = 1; i < n - 1; i++) {
l[i] = 2 * (points[i + 1].x - points[i - 1].x) - h[i - 1] * mu[i - 1];
mu[i] = h[i] / l[i];
z[i] = (alpha[i] - alpha[i - 1] * h[i - 1]) / l[i];
}
l[n - 1] = 1;
z[n - 1] = 0;
c[n - 1] = 0;
for (int j = n - 2; j >= 0; j--) {
c[j] = z[j] - mu[j] * c[j + 1];
b[j] = alpha[j] - h[j] * (c[j + 1] + 2 * c[j]) / 3;
d[j] = (c[j + 1] - c[j]) / h[j];
}
}
void printSplineCoefficients(int n, double a[], double b[], double c[], double d[]) {
for (int i = 0; i < n - 1; i++) {
printf("Segment %d: a = %lf, b = %lf, c = %lf, d = %lf\n", i, a[i], b[i], c[i], d[i]);
}
}
double cubicSplineEval(Point points[], double b[], double c[], double d[], int n, double xe) {
int i;
for (i = 0; i < n - 1; i++) {
if (xe >= points[i].x && xe < points[i+1].x) {
break;
}
}
double h = points[i + 1].x - points[i].x;
double a = points[i].y;
double xe_minus_xi = xe - points[i].x;
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() {
Point points[N];
double a[N], b[N], c[N], d[N];
for (int i = 0; i < N; i++) {
points[i].x = (double)i;
points[i].y = (points[i].x * points[i].x);
}
cubicSpline(points, N, a, b, c, d);
printSplineCoefficients(N, a, b, c, d);
printf("Cubic Spline Interpolation results:\n");
for (int i = 0; i < N; i += 1) {
printf("f(%5.2f) = %8.4f %8.4f %8.4f\n", points[i].x+0.5, cubicSplineEval(points, b, c, d, N, points[i].x+0.5), ((points[i].x + 0.5)* (points[i].x + 0.5)), (cubicSplineEval(points, b, c, d, N, points[i].x + 0.5)- ((points[i].x + 0.5) * (points[i].x + 0.5))));
}
return 0;
}