数值分析插值法实验C语言
时间: 2023-09-28 17:12:14 浏览: 167
本实验使用C语言编写了三种常用的插值方法:拉格朗日插值、牛顿插值和分段线性插值。这些方法可以用于从给定的离散数据点集中估计未知函数值。
以下是实验代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 拉格朗日插值
double lagrange_interpolation(double x[], double y[], int n, double xi) {
double yi = 0.0;
for (int i = 0; i < n; i++) {
double li = 1.0;
for (int j = 0; j < n; j++) {
if (j != i) {
li *= (xi - x[j]) / (x[i] - x[j]);
}
}
yi += y[i] * li;
}
return yi;
}
// 牛顿插值
double newton_interpolation(double x[], double y[], int n, double xi) {
double *coeff = (double *) malloc(n * sizeof(double));
double yi = y[0];
coeff[0] = 1.0;
for (int i = 1; i < n; i++) {
coeff[i] = 1.0;
for (int j = i - 1; j >= 0; j--) {
coeff[j + 1] -= coeff[j] * x[i];
}
yi += coeff[i] * y[i];
}
for (int i = n - 2; i >= 0; i--) {
yi = yi * (xi - x[i]) + coeff[i];
}
free(coeff);
return yi;
}
// 分段线性插值
double linear_interpolation(double x[], double y[], int n, double xi) {
int i = 0;
while (i < n && x[i] <= xi) i++;
if (i == 0) return y[0];
if (i == n) return y[n - 1];
double k = (y[i] - y[i - 1]) / (x[i] - x[i - 1]);
double b = y[i - 1] - k * x[i - 1];
return k * xi + b;
}
int main() {
int n = 6;
double x[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
double y[] = {1.0, 4.0, 9.0, 16.0, 25.0, 36.0};
double xi = 3.5;
printf("x = ");
for (int i = 0; i < n; i++) {
printf("%.2f ", x[i]);
}
printf("\n");
printf("y = ");
for (int i = 0; i < n; i++) {
printf("%.2f ", y[i]);
}
printf("\n");
printf("xi = %.2f\n", xi);
printf("Lagrange interpolation: %.2f\n", lagrange_interpolation(x, y, n, xi));
printf("Newton interpolation: %.2f\n", newton_interpolation(x, y, n, xi));
printf("Linear interpolation: %.2f\n", linear_interpolation(x, y, n, xi));
return 0;
}
```
在这个例子中,我们使用了一个二次函数的数据点集来演示这三种插值方法的用法。我们将x和y数组作为输入,这些数组包含了数据点的坐标。我们还指定了要在哪个位置进行插值,即xi。
在main函数中,我们首先打印出数据点的坐标和要进行插值的位置。然后,我们调用三种插值方法来计算xi处的估计函数值,并将结果打印到控制台上。
在这个例子中,我们使用了相同的数据点集和插值位置,但是实际上这些值可以根据具体问题进行调整。此外,我们还可以使用其他插值方法,如样条插值、多项式插值等。
阅读全文