给定(某条曲线上)多个点,选择合适的函数(可以是一个也可以多个)构造它们的最小二乘拟合,比较拟合函数和原函数的图像及误差。C++
时间: 2023-11-28 17:48:26 浏览: 36
以下是一个基于多项式函数的最小二乘拟合的样例代码。首先,我们需要定义一个多项式函数类:
```cpp
class Polynomial {
public:
Polynomial(std::vector<double> coeffs) : coeffs_(coeffs) {}
double operator()(double x) const {
double result = 0.0;
double power = 1.0;
for (const auto& c : coeffs_) {
result += c * power;
power *= x;
}
return result;
}
private:
std::vector<double> coeffs_;
};
```
然后,我们可以定义一个函数来计算多项式函数的系数:
```cpp
std::vector<double> polyfit(const std::vector<double>& x, const std::vector<double>& y, int degree) {
assert(x.size() == y.size());
int n = x.size();
Eigen::MatrixXd A(n, degree + 1);
Eigen::VectorXd B(n);
for (int i = 0; i < n; ++i) {
double power = 1.0;
for (int j = 0; j <= degree; ++j) {
A(i, j) = power;
power *= x[i];
}
B(i) = y[i];
}
auto coeffs = (A.transpose() * A).ldlt().solve(A.transpose() * B);
return std::vector<double>(coeffs.data(), coeffs.data() + coeffs.size());
}
```
这个函数使用了Eigen库来求解线性方程组。现在,我们可以使用这些代码来拟合一个曲线:
```cpp
int main() {
std::vector<double> x{0, 1, 2, 3, 4, 5};
std::vector<double> y{1, 3, 2, 5, 7, 8};
auto coeffs = polyfit(x, y, 2);
Polynomial f(coeffs);
for (double xi = 0; xi <= 5; xi += 0.1) {
std::cout << xi << " " << f(xi) << std::endl;
}
return 0;
}
```
这个程序将会输出多项式函数的拟合结果。如果你想尝试其他的函数,只需要修改多项式函数类即可。