用矩阵实现多项式曲线拟合的c++代码
时间: 2024-04-20 10:23:19 浏览: 115
以下是使用矩阵实现多项式曲线拟合的 C++ 代码示例:
```cpp
#include <iostream>
#include <vector>
#include <Eigen/Dense>
using namespace Eigen;
// 多项式曲线拟合函数
VectorXd polynomialCurveFit(const MatrixXd& X, const VectorXd& y, int degree) {
// 构建矩阵 A 和向量 b
int n = X.rows();
MatrixXd A(n, degree + 1);
VectorXd b = y;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= degree; j++) {
A(i, j) = std::pow(X(i), j);
}
}
// 使用最小二乘法求解多项式系数
VectorXd coeffs = A.colPivHouseholderQr().solve(b);
return coeffs;
}
int main() {
// 样本数据集
std::vector<double> x_data = {1.0, 2.0, 3.0, 4.0, 5.0};
std::vector<double> y_data = {1.2, 1.9, 3.2, 3.8, 5.1};
int n = x_data.size(); // 样本数量
// 将样本数据转换为矩阵形式
MatrixXd X(n, 1);
VectorXd y(n);
for (int i = 0; i < n; i++) {
X(i) = x_data[i];
y(i) = y_data[i];
}
// 设置多项式的阶数
int degree = 2;
// 多项式曲线拟合
VectorXd coeffs = polynomialCurveFit(X, y, degree);
// 输出拟合的多项式系数
std::cout << "拟合的多项式系数为:\n" << coeffs << std::endl;
return 0;
}
```
这个示例代码使用了 Eigen 库来进行矩阵运算和最小二乘法求解。在 `polynomialCurveFit` 函数中,构建了一个矩阵 A 和向量 b,其中 A 的每一行表示样本数据的 x 值的不同幂次项,b 则直接使用样本数据的 y 值。然后使用 `colPivHouseholderQr().solve(b)` 方法使用最小二乘法求解多项式的系数。
在 `main` 函数中,给定了一个样本数据集,将其转换为矩阵形式,并设置了多项式的阶数为 2。然后调用 `polynomialCurveFit` 函数进行多项式曲线拟合,并输出拟合的多项式系数。
请注意,运行此示例代码之前,需要先安装并配置好 Eigen 库。你可以从官方网站(https://eigen.tuxfamily.org/)下载并安装 Eigen 库。
阅读全文