已知:已有很多数据,根据生成曲线方程 并 求得y=0时 其多个方程解。
例如:x = [-5,- 4,- 3,- 2,- 1,0,1,2]
y = [-4697,- 1374,- 251, - 8, 3, - 2, 1, 84]
1、求其最小二乘法 k 阶多项式的拟合方程。
2、根据拟合方程求其与横坐标交点。
步骤:1、我们要写一个根据已知数据,求拟合方程参数的方法。
2、已知方程后,要写一个根据方程求解的方法
先已知的方法有很多,例如穷举法、二分法、牛顿-莱布利兹法、梯度法、碰撞体积法等等,各有优劣。博主这次根据自己的使用场景使用的是牛顿法。
a、牛顿法比较重要的是使用前提条件,连续可导(博主的使用场景是必定满足的,故就不考虑了)(基本知识,不记得可以去百度一下)
b、牛顿法的初值判断(这个其实看似容易,如果想准确,其实并不简单)
c、求导算法(基本知识可以去百度一下)
d、根据求出的解带入原方程,以此判断是否需要继续迭代。
纪要
工具使用:VS2022,百度在线图形计算器Desmos
使用相关库:MathNet
一、获得拟合参数方法
/// <summary>
/// 将点 (x,y) 拟合为 k 阶多项式 y 的最小二乘法,返回其最佳拟合参数为[p0, p1, p2,..., pk] 数组 p0、p1 分别指0次系数、1次系数
/// </summary>
/// <param name="xdata">x数组</param>
/// <param name="ydata">y数组</param>
/// <param name="order">拟合次数/多项式阶数</param>
/// <returns>拟合参数数组</returns>
public static double[] PolynomialPara(double[] xdata, double[] ydata, int order)
{
return Fit.Polynomial(xdata, ydata, order);
}
运行
static double[] Xdata = { -5, -4, -3, -2, -1, 0, 1, 2 };
static double[] Ydata = { -4697, -1374, -251, -8, 3, -2, 1, 84 };
double[] _para = PolynomialPara(Xdata,Ydata,5);
结果
根据拟合参数,其实对应的k阶多项式方程就显而易见了