请给出用三次样条插值求函数的C++代码
时间: 2023-12-01 19:05:08 浏览: 31
以下是用三次样条插值求函数的C代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_N 100
typedef struct {
double x, y;
} Point;
typedef struct {
double a, b, c, d, x;
} Segment;
Point points[MAX_N];
Segment segments[MAX_N];
int n;
double f(double x) {
// 定义待求函数
return sin(x);
}
void input() {
// 读入数据
printf("请输入数据点个数n:");
scanf("%d", &n);
printf("请输入数据点:\n");
for (int i = 0; i < n; i++) {
scanf("%lf%lf", &points[i].x, &points[i].y);
}
}
void calc() {
// 计算三次样条插值
double h[MAX_N], p[MAX_N], q[MAX_N], r[MAX_N], u[MAX_N], v[MAX_N], w[MAX_N], z[MAX_N];
for (int i = 0; i < n - 1; i++) {
h[i] = points[i + 1].x - points[i].x;
p[i] = (points[i + 1].y - points[i].y) / h[i];
}
for (int i = 1; i < n - 1; i++) {
q[i] = h[i - 1] / (h[i - 1] + h[i]);
r[i] = h[i] / (h[i - 1] + h[i]);
u[i] = 6 * (p[i] - p[i - 1]) / (h[i - 1] + h[i]);
}
v[1] = u[1];
for (int i = 2; i < n - 1; i++) {
v[i] = u[i] - q[i] * v[i - 1];
}
w[n - 2] = v[n - 2];
for (int i = n - 3; i >= 1; i--) {
w[i] = v[i] - r[i] * w[i + 1];
}
for (int i = 0; i < n - 1; i++) {
segments[i].a = (w[i + 1] - w[i]) / (6 * h[i]);
segments[i].b = w[i] / 2;
segments[i].c = (points[i + 1].y - points[i].y) / h[i] - h[i] * (2 * w[i] + w[i + 1]) / 6;
segments[i].d = points[i].y;
segments[i].x = points[i].x;
}
}
double interpolate(double x) {
// 插值函数
for (int i = 0; i < n - 1; i++) {
if (x >= segments[i].x && x <= segments[i + 1].x) {
double dx = x - segments[i].x;
return segments[i].a * dx * dx * dx + segments[i].b * dx * dx + segments[i].c * dx + segments[i].d;
}
}
return NAN;
}
void output() {
// 输出结果
printf("请输入要查询的x值:");
double x;
scanf("%lf", &x);
printf("f(%g) = %g\n", x, f(x));
printf("s(%g) = %g\n", x, interpolate(x));
}
int main() {
input();
calc();
output();
return 0;
}
```