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是整数,则该函数是周期性的,具有与XiLCM相关的周期。

下图显示了B的拟合残差,从给定的样本点开始,从02010

在此处输入图像描述在此处输入图像描述

基于近似搜索如何工作,我会在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,maxstep范围以匹配您的数据集
  • 可以通过增加递归数来提高准确性
  • 如果需要,可以提高性能
    • 不是所有的点都使用不太准确的递归层
    • 增加开始步骤(但如果太大则会使结果无效)

您还应该添加输入点和输出曲线图,以确定您是否接近解决方案。 如果没有关于输入点的更多信息,则很难更具体。 您可以更改差异计算e以匹配任何所需的方法,这只是abs差异的总和(可以使用最小二乘或任何......)