具有对数函数的非线性曲线拟合

时间:2013-12-11 16:41:58

标签: matlab curve-fitting nonlinear-functions

我有一组数据点对(y,x)。 我想使用表单

来拟合一个函数
y = c * x * log2(x)

我想找到c的值。 Matlab lsqcurvefit不适用于此。它似乎停留在当地的最佳状态。

有关如何操作的任何建议吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

正如cdbitesky所写,估算c的最简单方法是计算逐点比率并采用均值:

c_est = mean(y ./ (x .* log2(x)));

另一种方法是使用Matlab的矩阵除法,它执行最小二乘拟合:

c_est = y / (x .* log2(x));

估算c的最佳方法只有在您了解了数据(如果有的话)与理想方程y = c * x * log2(x)的偏差时才能得出。您的数据是否被加性噪声或乘法性损坏?这种噪音来自哪里?等

答案 1 :(得分:1)

使用一些权重w[k],计算总和

yxlx超过w[k]*y[k]*x[k]*log2(x[k])

xlx2超过w[k]*sqr(x[k]*log2(x[k])),其中sqr(u)=u*u

然后c的估算值为yxlx/xlx2

可以选择标准砝码w[k]=1或调整砝码

w[k]=1/( 1+sqr( x[k]*log2(x[k]) ) )

甚至更适应

w[k]=1/( 1+sqr( x[k]*log2(x[k]) ) +sqr( y[k] ) ) 

因此x,y的较大值不会过度影响估计值。对于某些中间策略,将这些表达式的平方根作为权重。


数学:这些公式是由估计问题的公式作为加权最小二乘问题得出的

sum[ w(x,y)*(y-c*f(x))^2 ]        over (x,y) in Data 

扩展为

sum[ w(x,y)*y^2 ] 
     -2*c* sum[ w(x,y)*y*f(x) ] 
          + c^2 * sum[ w(x,y)*f(x)^2 ]      over (x,y) in Data 

最小值位于

c = sum[ w(x,y)*y*f(x) ] / sum[ w(x,y)*f(x)^2 ]

w(x,y)应该与(x,y)处的误差方差近似相反,所以如果你期望误差的大小一致,那么w(x,y)= 1,如果错误增长与x和y成正比,那么w(x,y)= 1 /(1 + x ^ 2 + y ^ 2)或类似是一个明智的选择。