c语言实现最小二乘拟合多项式
时间: 2023-10-11 17:10:52 浏览: 247
以下是C语言实现最小二乘拟合多项式的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAXN 100
int n; // 数据点个数
double x[MAXN], y[MAXN]; // 数据点坐标
int m; // 拟合多项式的最高次数
double a[MAXN]; // 多项式系数
void input() {
printf("请输入数据点个数n:");
scanf("%d", &n);
printf("请输入数据点坐标:\n");
for (int i = 0; i < n; i++) {
printf("x[%d] = ", i);
scanf("%lf", &x[i]);
printf("y[%d] = ", i);
scanf("%lf", &y[i]);
}
printf("请输入拟合多项式的最高次数m:");
scanf("%d", &m);
}
void fit() {
double s[MAXN][MAXN], t[MAXN];
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= m; j++) {
s[i][j] = 0.0;
for (int k = 0; k < n; k++) {
s[i][j] += pow(x[k], i+j);
}
}
t[i] = 0.0;
for (int k = 0; k < n; k++) {
t[i] += y[k] * pow(x[k], i);
}
}
for (int i = 0; i <= m; i++) {
for (int j = i+1; j <= m; j++) {
double r = s[j][i] / s[i][i];
for (int k = i; k <= m; k++) {
s[j][k] -= r * s[i][k];
}
t[j] -= r * t[i];
}
}
for (int i = m; i >= 0; i--) {
for (int j = i+1; j <= m; j++) {
t[i] -= s[i][j] * a[j];
}
a[i] = t[i] / s[i][i];
}
}
void output() {
printf("拟合多项式为:\n");
for (int i = m; i >= 0; i--) {
if (i == m) {
printf("%.2lf * x^%d", a[i], i);
} else if (i == 0) {
if (a[i] >= 0) {
printf(" + %.2lf", a[i]);
} else {
printf(" - %.2lf", -a[i]);
}
} else {
if (a[i] >= 0) {
printf(" + %.2lf * x^%d", a[i], i);
} else {
printf(" - %.2lf * x^%d", -a[i], i);
}
}
}
printf("\n");
}
int main() {
input();
fit();
output();
return 0;
}
```
该程序通过输入数据点的坐标和拟合多项式的最高次数,使用最小二乘法求解多项式系数,并输出拟合多项式。
阅读全文