n点与最佳拟合曲线的近似
我有一个n点(2D)列表:P1(x0,y0),P2(x1,y1),P3(x2,y2)…点满足每个点都有唯一坐标的条件,以及每个点的坐标xi ,yi> 0和xi,yi是整数。
任务是编写一个算法来近似这些点
- 到曲线
y = | Acos (Bx) |
y = | Acos (Bx) |
最合适(接近或等于100%) - 因此系数A和B尽可能简单。
我想用C#编写一个程序,但对我来说最大的问题是找到合适的算法。 有没有人可以帮我这个?
将B
作为独立参数,可以使用最小二乘法求解A
的拟合,并计算拟合残差。
残留函数是复杂的,具有不同值的许多最小值和不规则行为。 无论如何,如果Xi
是整数,则该函数是周期性的,具有与Xi
的LCM
相关的周期。
下图显示了B
的拟合残差,从给定的样本点开始,从0
到2
和0
到10
。
基于近似搜索如何工作,我会在C ++中尝试:
// (global) input data #define _n 100 double px[_n]; // x input points double py[_n]; // y input points // approximation int ix; double e; approx aa,ab; // min max step recursions ErrorOfSolutionVariable for (aa.init(-100,+100.0,10.00,3,&e);!aa.done;aa.step()) for (ab.init(-0.1,+ 0.1, 0.01,3,&e);!ab.done;ab.step()) { for (e=0.0,ix=0;ix<_n;ix++) // test all measured points (e is cumulative error) { e+=fabs(fabs(aa.a*cos(ab.a*px[ix]))-py[ix]); } } // here aa.a,ab.a holds the result A,B coefficients
它使用上面链接的问题中的approx
类
- 您需要设置
min,max
和step
范围以匹配您的数据集 - 可以通过增加递归数来提高准确性
- 如果需要,可以提高性能
- 不是所有的点都使用不太准确的递归层
- 增加开始步骤(但如果太大则会使结果无效)
您还应该添加输入点和输出曲线图,以确定您是否接近解决方案。 如果没有关于输入点的更多信息,则很难更具体。 您可以更改差异计算e
以匹配任何所需的方法,这只是abs差异的总和(可以使用最小二乘或任何......)