c++ 非线性函数拟合
时间: 2023-08-13 09:54:42 浏览: 85
在C++中进行非线性函数拟合可以使用各种数值优化算法。以下是一个简单的示例代码,使用最小二乘法进行非线性函数拟合:
```cpp
#include <iostream>
#include <cmath>
#include <vector>
#include <eigen3/Eigen/Dense>
#include <unsupported/Eigen/NonLinearOptimization>
using namespace Eigen;
struct CostFunction
{
const std::vector<double>& xData;
const std::vector<double>& yData;
CostFunction(const std::vector<double>& x, const std::vector<double>& y) : xData(x), yData(y) {}
int operator()(const VectorXd& params, VectorXd& residuals) const
{
for (int i = 0; i < xData.size(); ++i)
{
double x = xData[i];
double y = yData[i];
residuals[i] = params[0] * exp(params[1] * x) + params[2] - y;
}
return 0;
}
};
int main()
{
std::vector<double> xData = {0.0, 1.0, 2.0, 3.0, 4.0};
std::vector<double> yData = {1.0, 2.0, 3.0, 4.0, 5.0};
int numParams = 3;
VectorXd params(numParams);
params << 1.0, 1.0, 1.0;
CostFunction costFunction(xData, yData);
NumericalDiff<CostFunction> numDiff(costFunction);
LevenbergMarquardt<NumericalDiff<CostFunction>> lm(numDiff);
lm.minimize(params);
std::cout << "Fitted parameters: " << params.transpose() << std::endl;
return 0;
}
```
上述代码使用Eigen库进行矩阵运算,并利用Eigen提供的非线性优化模块进行最小二乘法拟合。在这个例子中,我们假设要拟合的函数为 `y = a * exp(b * x) + c`,其中 `a`、`b`、`c` 是待拟合的参数。通过调整初始参数值和选择适当的优化算法,可以得到对给定数据点的最佳拟合结果。
请注意,这只是一个简单的示例,实际应用中可能需要根据具体问题进行更复杂的调整和优化。
阅读全文