最小二乘法曲线拟合c++
时间: 2023-11-15 22:56:52 浏览: 180
最小二乘法曲线拟合(C++)
4星 · 用户满意度95%
最小二乘法是一种常用的曲线拟合方法,可以用于拟合线性和非线性函数。在C++中,可以通过以下步骤实现最小二乘法曲线拟合:
1. 定义数据点的坐标数组,包括x和y坐标。
2. 定义拟合函数的形式,例如线性函数y = a*x + b。
3. 定义误差函数,即每个数据点到拟合函数的距离的平方和。
4. 使用最小二乘法求解拟合函数的参数,使得误差函数最小化。
5. 输出拟合函数的参数。
以下是一个简单的C++代码示例,用于拟合一个二次函数y = a*x^2 + b*x + c:
```c++
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
// 定义数据点坐标数组
double x[] = {1, 2, 3, 4, 5};
double y[] = {1.2, 3.5, 8.1, 14.2, 22.5};
int n = sizeof(x) / sizeof(x[0]);
// 定义拟合函数的形式
auto f = [](double a, double b, double c, double x) -> double {
return a * pow(x, 2) + b * x + c;
};
// 定义误差函数
auto error = [&](double a, double b, double c) -> double {
double sum = 0;
for (int i = 0; i < n; i++) {
double e = y[i] - f(a, b, c, x[i]);
sum += pow(e, 2);
}
return sum;
};
// 使用最小二乘法求解拟合函数的参数
double a = 1, b = 1, c = 1;
double alpha = 0.01; // 学习率
int max_iter = 10000; // 最大迭代次数
for (int i = 0; i < max_iter; i++) {
double da = 0, db = 0, dc = 0;
for (int j = 0; j < n; j++) {
double e = y[j] - f(a, b, c, x[j]);
da += -2 * e * pow(x[j], 2);
db += -2 * e * x[j];
dc += -2 * e;
}
a -= alpha * da;
b -= alpha * db;
c -= alpha * dc;
}
// 输出拟合函数的参数
cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
return 0;
}
```
阅读全文