C++ 写一个 曲线拟合的代码
时间: 2023-12-01 19:53:27 浏览: 23
曲线拟合是指根据一组离散的数据点,找到一条或多条函数曲线来描述这些数据点的趋势。常见的曲线拟合方法包括多项式拟合、最小二乘法、样条插值等。下面是一个使用最小二乘法进行多项式拟合的 C++ 代码示例:
```c++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// 多项式拟合函数
vector<double> polyfit(vector<double> x, vector<double> y, int degree) {
int n = x.size();
vector<double> coefficients(degree + 1, 0);
vector<double> xpow(2 * degree + 1, 0);
vector<double> b(degree + 1, 0);
// 初始化 xpow
for (int i = 0; i < 2 * degree + 1; i++) {
xpow[i] = 0;
for (int j = 0; j < n; j++) {
xpow[i] += pow(x[j], i);
}
}
// 初始化 b
for (int i = 0; i < degree + 1; i++) {
b[i] = 0;
for (int j = 0; j < n; j++) {
b[i] += pow(x[j], i) * y[j];
}
}
// 构建系数矩阵
vector<vector<double>> A(degree + 1, vector<double>(degree + 1, 0));
for (int i = 0; i < degree + 1; i++) {
for (int j = 0; j < degree + 1; j++) {
A[i][j] = xpow[i + j];
}
}
// 解线性方程组
for (int k = 0; k < degree + 1; k++) {
for (int i = k + 1; i < degree + 1; i++) {
double factor = A[i][k] / A[k][k];
for (int j = k; j < degree + 1; j++) {
A[i][j] -= factor * A[k][j];
}
b[i] -= factor * b[k];
}
}
for (int k = degree; k >= 0; k--) {
for (int i = k - 1; i >= 0; i--) {
double factor = A[i][k] / A[k][k];
for (int j = degree; j >= k; j--) {
A[i][j] -= factor * A[k][j];
}
b[i] -= factor * b[k];
}
}
for (int i = 0; i < degree + 1; i++) {
coefficients[i] = b[i] / A[i][i];
}
return coefficients;
}
int main() {
vector<double> x = {1, 2, 3, 4, 5};
vector<double> y = {2.1, 4.3, 6.5, 8.7, 11.2};
vector<double> coefficients = polyfit(x, y, 2);
for (int i = 0; i < coefficients.size(); i++) {
cout << "a" << i << ": " << coefficients[i] << endl;
}
return 0;
}
```
上面的代码实现了一个多项式拟合函数 `polyfit`,它接受两个向量 `x` 和 `y`,分别表示离散数据点的横坐标和纵坐标,以及一个整数 `degree`,表示多项式的次数。函数返回一个向量 `coefficients`,里面存储了多项式的系数。在上面的示例中,我们使用二次多项式拟合了数据点 `(1, 2.1), (2, 4.3), (3, 6.5), (4, 8.7), (5, 11.2)`,并输出了拟合出的多项式的系数。
需要注意的是,上面的代码只是一个简单的示例,实际应用中可能需要考虑更多的问题,比如数据的缺失、异常值的处理等。