用C实现最小二乘法拟合曲线
时间: 2024-12-02 16:15:35 浏览: 15
在C语言中,我们可以使用数组存储数据点,并通过最小二乘法计算线性回归线,即找到一条直线,使得所有数据点到这条直线的距离之和最小。这里是一个简单的示例,假设我们有一个二维数组`x_data[]`和对应的`y_data[]`,用于表示x和y值:
```c
#include <stdio.h>
#include <math.h>
// 定义数据点数量
#define DATA_POINTS 5
double mean(double arr[], int n) {
double sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
return sum / n;
}
void least_squares(double x_data[], double y_data[], double *m, double *b) {
int n = DATA_POINTS;
double x_sum = 0, y_sum = 0, xy_sum = 0, x_pow = 0;
// 计算均值
double x_mean = mean(x_data, n);
double y_mean = mean(y_data, n);
// 根据公式计算斜率和截距
*m = (n * xy_sum - x_sum * y_sum) / (n * x_pow - x_sum * x_sum);
*b = y_mean - (*m * x_mean);
}
int main() {
double x_data[DATA_POINTS] = {1, 2, 3, 4, 5};
double y_data[DATA_POINTS] = {2, 3.5, 4.8, 6, 7}; // 示例数据点
double m, b;
// 调用函数求解最小二乘线
least_squares(x_data, y_data, &m, &b);
printf("拟合的直线方程为: y = %.2fx + %.2f\n", m, b);
return 0;
}
```
这个程序首先计算了x和y的平均值,然后利用最小二乘法公式计算出最佳拟合的直线斜率(m)和截距(b),最后打印出拟合的直线表达式。
阅读全文