#include <stdio.h>
#include <math.h>
// 定义拟合函数
double fitFunction(double x, double A, double w, double phi, double b) {
return A * sin(w * x + phi) + b;
}
// 定义最小二乘拟合函数
void leastSquareFit(double* x, double* y, int n, double* A, double* w, double* phi, double* b) {
double sum_x = 0.0, sum_y = 0.0, sum_xy = 0.0, sum_x2 = 0.0;
double sum_sin = 0.0, sum_cos = 0.0;
for (int i = 0; i < n; i++) {
sum_x += x[i];
sum_y += y[i];
sum_xy += x[i] * y[i];
sum_x2 += x[i] * x[i];
sum_sin += sin(x[i]);
sum_cos += cos(x[i]);
}
double denominator = n * sum_x2 - sum_x * sum_x;
*A = (n * sum_xy - sum_x * sum_y) / denominator;
*w = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x * sum_x);
*phi = atan2(n * sum_sin - sum_x * sum_y, n * sum_cos - sum_x * sum_y);
*b = (sum_y - *A * sum_sin) / n;
}
int main() {
// 给定的正弦数据
double x[] = {0.0, 0.1, 0.2, 0.3, 0.4};
double y[] = {0.0, 0.0998, 0.1987, 0.2955, 0.3894};
// 定义拟合参数
double A, w, phi, b;
// 进行最小二乘拟合
leastSquareFit(x, y, 5, &A, &w, &phi, &b);
// 输出拟合结果
printf("拟合参数:A = %f, w = %f, phi = %f, b = %f\n", A, w, phi, b);
return 0;
}