1

我在使用 nlinfit 时遇到问题。我似乎无法弄清楚如何提高合身性。减少 TolX 或 TolFun 并没有改变 coeffs 中的值。

 model = @(a,x) 1./(1 + a*x.^2); 
 model0 = [1e13];  
 opts = statset('TolX', 1e-25, 'TolFun', 1e-25); 
 coeffs = nlinfit(freqData, noiseData, model, model0, opts);

这是我的适合。 http://i.imgur.com/v1dkd4X.png

4

2 回答 2

2

似乎您正在处理非常小的数字,因此可能存在浮点精度问题。为什么不将表达式转换为不同的,然后拟合,然后逆变换?例如:

1/model变​​换为例,现在你只有一个简单的多项式拟合,

model_new=(x,a)=1+a*x.^2

在哪里可以使用polyfitand polyval,然后使用1/result...

于 2013-07-23T22:57:17.723 回答
1

我拟合了与您的相似的模拟数据,没有缩放:

在此处输入图像描述

诀窍是检查您的数据 - 您的信号幅度在 x~40 和 ~150 之间从 ~1.5 下降到 ~1.0。但是,如果您检查该函数,很明显它的值不应低于 1,因此它无法正确建模数据。

通过包含初始幅度,该数据更适合:

model_new = @(a,x) a(1)./(1 + a(2)*x.^2); 

查看绘制在数据上的拟合函数,您似乎还在某处包含了缩放参数。

包含幅度参数会改进原始函数,但不一定安全:您的数据有噪声,并且下降幅度不大,因此您可以预期不确定性(和相关性)很大。

在拟合之前缩放数据在这里可能没有真正的帮助,因为您没有数据到 x=0 并且不知道适当的缩放因子应该是什么。

于 2013-07-24T04:37:04.077 回答