z=ax+by+c的最小二乘拟合C语言代码
时间: 2023-12-09 14:04:54 浏览: 118
下面是使用最小二乘法拟合直线的C语言代码:
```c
#include <stdio.h>
#include <math.h>
#define MAX_N 1000
double x[MAX_N], y[MAX_N]; // 数据
int n; // 数据个数
int main()
{
double sum_x = 0, sum_y = 0, sum_xy = 0, sum_x2 = 0;
double a, b, c;
// 读入数据
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%lf%lf", &x[i], &y[i]);
sum_x += x[i];
sum_y += y[i];
sum_xy += x[i] * y[i];
sum_x2 += x[i] * x[i];
}
// 求解 a, b, c
double denom = n * sum_x2 - sum_x * sum_x;
if (fabs(denom) < 1e-6) {
printf("无法拟合直线\n");
return 0;
}
a = (n * sum_xy - sum_x * sum_y) / denom;
b = (sum_x2 * sum_y - sum_xy * sum_x) / denom;
c = sum_y / n - a * sum_x / n - b * sum_x2 / n;
// 输出结果
printf("拟合直线: y = %.2f x + %.2f\n", a, c);
return 0;
}
```
解释:
首先读入数据,然后按照最小二乘法的公式计算出 a, b, c 的值。这里使用了一个变量 denom 来避免重复计算。如果分母为零,则无法拟合直线,输出错误信息即可。
最后输出拟合直线的表达式。
阅读全文