2013-07-23 89 views
1

我遇到了適合nlinfit的問題。我似乎無法弄清楚如何改善體型。減少TolX或TolFun並沒有改變coeff中的值。nlinfit不適合

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

+1

是否可以縮放或標準化數據,以便每個元素的大小接近1?如果保存了比例因子,則可以在擬合後「解除歸一化」。 – horchler

回答

2

它似乎是你處理非常小的數字,所以可能存在浮點精度問題。爲什麼你不能將表達式轉換爲不同於,然後擬合,然後逆向變換? 例如:

採取1/model的改造,現在你只是一個簡單的多項式擬合,

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

在那裏你可以使用polyfitpolyval,然後採取1/result ...

+1

像這樣轉換模型可能同樣危險 - 至少[它可以用於指數擬合](http://www.mathworks.com/help/stats/examples/pitfalls-in-fitting-nonlinear-models-by -transforming到linearity.html)。人們需要注意並通過查看殘差等來確認結果。 – horchler

1

我適合模擬的數據看起來與您的相似,但不縮放:

enter image description here

訣竅在於檢查您的數據 - 在x〜40和〜150之間信號幅度從〜1.5降至〜1.0。然而,如果你檢查這個函數,很明顯它的值不應該低於1,所以它不能正確地建模數據。

這個數據是通過包括初始幅度更適合:

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

望着擬合函數繪製到您的數據看起來還包括縮放參數的地方。

包括一個振幅參數可以改善原始功能,但不一定安全:您的數據很嘈雜,而且沒有太大下降,所以您可以預期您的不確定性(和相關性)很大。

在擬合之前縮放數據可能在這裏沒有什麼幫助,因爲您沒有數據到x = 0,也不知道合適的縮放因子應該是多少。