C++三次样条插值代码
时间: 2023-11-08 11:04:14 浏览: 89
以下是C语言的三次样条插值代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAXN 1000
double x[MAXN], y[MAXN], a[MAXN], b[MAXN], c[MAXN], d[MAXN];
int n;
void input() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%lf%lf", &x[i], &y[i]);
}
}
void solve() {
double h[MAXN], alpha[MAXN], l[MAXN], mu[MAXN], z[MAXN];
for (int i = 0; i < n - 1; i++) {
h[i] = x[i + 1] - x[i];
}
for (int i = 1; i < n - 1; i++) {
alpha[i] = 3 * (y[i + 1] - y[i]) / h[i] - 3 * (y[i] - y[i - 1]) / h[i - 1];
}
l[0] = 1;
mu[0] = 0;
z[0] = 0;
for (int i = 1; i < n - 1; i++) {
l[i] = 2 * (x[i + 1] - x[i - 1]) - h[i - 1] * mu[i - 1];
mu[i] = h[i] / l[i];
z[i] = (alpha[i] - h[i - 1] * z[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] = (y[j + 1] - y[j]) / h[j] - h[j] * (c[j + 1] + 2 * c[j]) / 3;
d[j] = (c[j + 1] - c[j]) / (3 * h[j]);
a[j] = y[j];
}
}
void output() {
for (int i = 0; i < n - 1; i++) {
printf("S%d(x) = ", i);
if (fabs(d[i]) > 1e-6) {
printf("%lf(x - %lf)^3 + ", d[i], x[i]);
}
if (fabs(c[i]) > 1e-6) {
printf("%lf(x - %lf)^2 + ", c[i], x[i]);
}
if (fabs(b[i]) > 1e-6) {
printf("%lf(x - %lf) + ", b[i], x[i]);
}
printf("%lf\n", a[i]);
}
}
int main() {
input();
solve();
output();
return 0;
}
```
代码中,input函数用于读入数据;solve函数用于计算三次样条插值的系数;output函数用于输出结果。其中,a、b、c、d数组分别存储三次样条插值的系数。
阅读全文