n点与最佳拟合曲线的近似

时间:2015-04-08 07:47:50

标签: c# algorithm math 2d curve-fitting

我有一个n点(2D)列表:P1(x0,y0),P2(x1,y1),P3(x2,y2)...... 点满足每个点具有唯一坐标以及每个点xi,yi>的坐标的条件。 0和xi,yi是整数。

任务是编写一个算法来近似这些点

  • 到最适合的曲线y = | Acos (Bx) |(接近或等于100%)
  • 并且系数A和B尽可能简单。

我想用C#编写程序,但对我来说最大的问题是找到合适的算法。有没有人可以帮我这个?

2 个答案:

答案 0 :(得分:0)

B作为一个独立参数,您可以使用最小二乘法求解A的拟合,并计算拟合残差。

残留函数复杂,具有许多不同值的最小值,并且具有不规则的行为。无论如何,如果Xi是整数,则该函数是周期性的,其周期与LCM的{​​{1}}相关。

下面的图表显示Xi的拟合余量从B0以及20不等,并带有给定的样本点。< / p>

enter image description here enter image description here

答案 1 :(得分:0)

基于How approximation search works我会在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差异的总和(可以使用最小二乘或任何...)