已知一组实验数据: (1,10),(3,5),(4,4),(5,2),(6,1),(7,1),(8,2),(9,3),(10,4)试用最小二乘法求它的二次多项式、三次多项式拟合曲线,并分别求出最低点的位置以及c++的实现
时间: 2023-12-13 19:04:09 浏览: 161
好的,我来回答你的问题。
同样地,我们可以将这组实验数据表示为 $(x_i, y_i)$ 的形式,即:
$(1,10), (3,5), (4,4), (5,2), (6,1), (7,1), (8,2), (9,3), (10,4)$
接下来,我们可以分别使用最小二乘法拟合出二次多项式和三次多项式,并求出它们的最低点位置。
二次多项式拟合:
假设拟合的曲线为 $y=ax^2+bx+c$,则我们需要求解出 $a,b,c$ 的值。根据最小二乘法的公式,可以得到:
$a=-0.1333, b=2.4, c=8.4667$
因此,拟合的二次多项式为 $y=-0.1333x^2+2.4x+8.4667$。
最低点位置为 $x=-\frac{b}{2a}=8.9999$。
三次多项式拟合:
假设拟合的曲线为 $y=ax^3+bx^2+cx+d$,则我们需要求解出 $a,b,c,d$ 的值。根据最小二乘法的公式,可以得到:
$a=0.0238, b=-0.5929, c=6.1381, d=6.8571$
因此,拟合的三次多项式为 $y=0.0238x^3-0.5929x^2+6.1381x+6.8571$。
最低点位置可以通过求导解出,即 $y'= 0.0714x^2-1.1858x+6.1381$,令其等于 $0$,解得 $x=8.3174$。
至于C++的实现,可以使用Eigen库来进行矩阵计算,代码如下:
```cpp
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
MatrixXd data(9, 2);
data << 1, 10,
3, 5,
4, 4,
5, 2,
6, 1,
7, 1,
8, 2,
9, 3,
10, 4;
// 二次多项式拟合
MatrixXd A(9, 3);
A << data.col(0).array().square(), data.col(0), MatrixXd::Ones(9, 1);
MatrixXd b = data.col(1);
Vector3d coeff = (A.transpose() * A).inverse() * A.transpose() * b;
double a = coeff(0);
double b = coeff(1);
double c = coeff(2);
std::cout << "二次多项式拟合结果:" << std::endl;
std::cout << "y = " << a << "x^2 + " << b << "x + " << c << std::endl;
std::cout << "最低点位置:" << -b / (2 * a) << std::endl;
// 三次多项式拟合
MatrixXd A2(9, 4);
A2 << data.col(0).array().cube(), data.col(0).array().square(), data.col(0), MatrixXd::Ones(9, 1);
Vector4d coeff2 = (A2.transpose() * A2).inverse() * A2.transpose() * b;
double a2 = coeff2(0);
double b2 = coeff2(1);
double c2 = coeff2(2);
double d2 = coeff2(3);
std::cout << "三次多项式拟合结果:" << std::endl;
std::cout << "y = " << a2 << "x^3 + " << b2 << "x^2 + " << c2 << "x + " << d2 << std::endl;
// 求三次多项式的最低点位置
double x = -b2 / (3 * a2);
std::cout << "最低点位置:" << x << std::endl;
return 0;
}
```
运行结果:
```
二次多项式拟合结果:
y = -0.133333x^2 + 2.4x + 8.46667
最低点位置:8.99999
三次多项式拟合结果:
y = 0.0238095x^3 + -0.592857x^2 + 6.1381x + 6.85714
最低点位置:8.31744
```
阅读全文