我对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
答案 0 :(得分:2)
看起来你正在处理非常小的数字,因此可能存在浮点精度问题。为什么不将表达式转换为不同的,然后拟合,然后逆变换? 例如:
将1/model
作为转换,现在你只有一个简单的多项式拟合,
model_new=(x,a)=1+a*x.^2
您可以使用polyfit
和polyval
,然后选择1/result
...
答案 1 :(得分:1)
我适合看起来与你的相似的模拟数据,没有缩放:
诀窍是检查您的数据 - 您的信号幅度在x~40和~150之间从~1.5降至~1.0。然而,如果你检查函数,很明显它的值不应该低于1,所以它无法正确建模数据。
通过包括初始幅度来更好地拟合这些数据:
model_new = @(a,x) a(1)./(1 + a(2)*x.^2);
查看绘制到数据上的拟合函数,看起来您还在某处包含了缩放参数。
包括幅度参数可以改善原始功能,但不一定安全:您的数据噪音很大,而且不会下降太多,因此您可以预期您的不确定性(和相关性)会很大。
在拟合之前缩放数据可能在这里没有用,因为你没有数据低至x = 0并且不知道应该是什么样的适当缩放因子。