用矩阵求最小二乘法C语言
时间: 2024-01-13 22:49:13 浏览: 119
最小二乘法是一种用于拟合数据的方法,它可以用来找到一条直线或曲线,使得该直线或曲线与数据点之间的误差最小。矩阵方法是一种常用的最小二乘法求解方法,下面是用C语言实现的最小二乘法:
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 100
#define M 10
int main()
{
int i, j, k, m;
float x[N], y[N], a[M], b[M][M], c[M][M], d[M], t;
int n;
printf("请输入数据点数(1<=n<=%d):", N);
scanf("%d", &n);
printf("请输入数据:\n");
for (i = 0; i < n; i++)
{
scanf("%f%f", &x[i], &y[i]);
}
printf("请输入多项式次数(1<=m<=%d):", M);
scanf("%d", &m);
// 初始化矩阵b和d
for (i = 0; i <= m; i++)
{
for (j = 0; j <= m; j++)
{
b[i][j] = 0;
}
d[i] = 0;
}
// 计算矩阵b和d
for (i = 0; i < n; i++)
{
t = 1;
for (j = 0; j <= m; j++)
{
d[j] += y[i] * t;
t *= x[i];
for (k = 0; k <= j; k++)
{
b[j][k] += t;
}
}
}
// 计算矩阵c
for (i = 0; i <= m; i++)
{
for (j = 0; j <= m; j++)
{
c[i][j] = b[i][j];
if (i == j)
{
c[i][j] += 1;
}
}
}
// 高斯消元求解系数矩阵a
for (i = 0; i <= m; i++)
{
t = c[i][i];
for (j = i + 1; j <= m; j++)
{
c[i][j] /= t;
}
d[i] /= t;
for (j = i + 1; j <= m; j++)
{
t = c[j][i];
for (k = i + 1; k <= m; k++)
{
c[j][k] -= c[i][k] * t;
}
d[j] -= d[i] * t;
}
}
// 回代求解系数矩阵a
for (i = m; i >= 0; i--)
{
t = d[i];
for (j = i + 1; j <= m; j++)
{
t -= a[j] * c[i][j];
}
a[i] = t;
}
// 输出结果
printf("多项式系数为:\n");
for (i = 0; i <= m; i++)
{
printf("a[%d] = %f\n", i, a[i]);
}
return 0;
}
```
该程序通过输入数据点和多项式次数,利用矩阵方法求解最小二乘法拟合的多项式系数,并输出结果。
阅读全文