曲线拟合的最小二乘法源代码c语言
时间: 2023-09-25 10:06:14 浏览: 79
下面是一段使用最小二乘法进行曲线拟合的C语言代码:
```c
#include <stdio.h>
#include <math.h>
#define MAX_POINTS 100 // 最大数据点数
// 数据点结构体
typedef struct {
double x, y;
} Point;
// 求和函数
double sum(double a[], int n) {
double s = 0;
for (int i = 0; i < n; i++) {
s += a[i];
}
return s;
}
// 求平均值函数
double mean(double a[], int n) {
return sum(a, n) / n;
}
// 求方差函数
double variance(double a[], int n) {
double m = mean(a, n);
double s = 0;
for (int i = 0; i < n; i++) {
s += (a[i] - m) * (a[i] - m);
}
return s / n;
}
// 求协方差函数
double covariance(Point data[], int n) {
double mx = mean(data->x, n);
double my = mean(data->y, n);
double s = 0;
for (int i = 0; i < n; i++) {
s += (data[i].x - mx) * (data[i].y - my);
}
return s / n;
}
// 拟合函数,返回拟合的二次函数系数
void quadratic_fit(Point data[], int n, double *a, double *b, double *c) {
double x[MAX_POINTS], y[MAX_POINTS];
for (int i = 0; i < n; i++) {
x[i] = data[i].x;
y[i] = data[i].y;
}
double sx = sum(x, n);
double sy = sum(y, n);
double sxx = sum(x * x, n);
double sxy = covariance(data, n);
double sxxx = sum(x * x * x, n);
double sxxy = sum(x * x * y, n);
double sxxxx = sum(x * x * x * x, n);
double a1 = (n * sxy - sx * sy) / (n * sxx - sx * sx);
double a2 = (sy - a1 * sx) / n;
double a3 = (n * sxxy - sxxx * sy) / (n * sxxxx - sxxx * sx);
double a4 = (sy - a3 * sx * sx) / n;
*a = a1;
*b = a2;
*c = a3;
}
int main() {
Point data[MAX_POINTS];
int n;
double a, b, c;
printf("请输入数据点数量:");
scanf("%d", &n);
printf("请输入数据点:\n");
for (int i = 0; i < n; i++) {
scanf("%lf%lf", &data[i].x, &data[i].y);
}
quadratic_fit(data, n, &a, &b, &c);
printf("拟合的二次函数为:y = %.2fx^2 + %.2fx + %.2f\n", a, b, c);
return 0;
}
```
使用最小二乘法进行曲线拟合有很多种方法,这里演示的是拟合二次函数的方法。在主函数中,首先输入数据点的数量和坐标,然后调用`quadratic_fit`函数进行拟合,最后输出拟合的二次函数系数。`quadratic_fit`函数中,先计算出各个统计量,然后根据公式计算出系数,并将其保存到指针参数中。注意,这里使用了变长数组和指针参数,需要编译器支持C99标准。