多项式最小二乘插值法 c++
时间: 2023-09-04 16:15:03 浏览: 56
以下是一个使用多项式最小二乘插值法的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_N 100
double x[MAX_N], y[MAX_N];
double coef[MAX_N]; // 保存多项式系数
// 多项式最小二乘拟合
void polyfit(int n, int m) {
double a[MAX_N][MAX_N], b[MAX_N], c[MAX_N];
int i, j, k;
// 初始化矩阵
for (i = 0; i <= m; i++) {
c[i] = 0.0;
for (j = 0; j <= m; j++) {
a[i][j] = 0.0;
}
}
// 构造矩阵
for (i = 0; i < n; i++) {
b[i] = y[i];
for (j = 0; j <= m; j++) {
c[j] += pow(x[i], j) * y[i];
for (k = 0; k <= m; k++) {
a[j][k] += pow(x[i], j+k);
}
}
}
// 解线性方程组
for (j = 0; j <= m; j++) {
for (i = j+1; i <= m; i++) {
double temp = a[i][j] / a[j][j];
c[i] -= temp * c[j];
for (k = j; k <= m; k++) {
a[i][k] -= temp * a[j][k];
}
}
}
coef[m] = c[m] / a[m][m];
for (i = m-1; i >= 0; i--) {
coef[i] = c[i];
for (j = i+1; j <= m; j++) {
coef[i] -= a[i][j] * coef[j] / a[i][i];
}
coef[i] /= a[i][i];
}
}
int main() {
int n, m, i;
printf("请输入数据点个数: ");
scanf("%d", &n);
printf("请输入多项式阶数: ");
scanf("%d", &m);
printf("请输入数据点(x,y):\n");
for (i = 0; i < n; i++) {
scanf("%lf %lf", &x[i], &y[i]);
}
polyfit(n, m);
printf("多项式系数:\n");
for (i = 0; i <= m; i++) {
printf("a%d = %lf\n", i, coef[i]);
}
return 0;
}
```
该程序通过输入一组数据点的x和y坐标,以及要拟合的多项式阶数m,使用多项式最小二乘插值法计算出拟合多项式的系数,最后输出这些系数。在程序中,我们使用了高斯消元法来解线性方程组。