2015-04-27 30 views
0

我無法在gnuplot的4.4提高裝配在gnuplot的(通過限制參數的大小?)

0.0007629768 -0.1256279199 0.0698209297 
0.0007565689 0.5667065856 0.0988522507 
0.00071274  1.3109126758 0.7766233743 

f1(x) = -a1 * x + b1 
a1 = 28000 
fit f1(x) "56demo.csv" using 1:2:3 via a1, b1  
plot "56demo.csv" using 1:2:3 with yerrorbars title "56%", \ 
f1(x) notitle 

這收斂擬合以下數據到其是高於予想的a1和b1的值。 幾個類似的測試收斂到他們應該在的範圍內的值,但由於某些原因,這些不會。

具體來說,我想大約有 a1 = 28000。

我正在尋找某種方法來達到當地的最低標準。我試着讓適合的限度更小,但我沒有那麼幸運。 是否可以設置a1和b1的值的上限?這是我想嘗試的一種方式。

謝謝

+0

對不起,但是如果你有一個數據文件,你不能操縱一些擬合參數來得到想要的結果。您有兩個數據點的錯誤率很低,而一個錯誤的錯誤率很高。如果您將錯誤報告給擬合程序,那麼錯誤較大的數據點的重量會減輕。在任何情況下,我都不會相信你從三個數據點得到的擬合結果... – Christoph

回答

0

擬合最常用的方法是卡方(χ²)方法。卡方是表達

enter image description here

其中x ,Y 和σ是數據點與誤差在y和F(X)是描述模型函數你的數據。該函數具有一些參數,目標是爲參數找到這些值,對此,這個表達式具有全局最小值。像gnuplot這樣的程序會嘗試這組參數的幾組值,以找到χ²最小的一組值。

一般來說,有些事情可能會出錯,這通常意味着該算法找到了局部最小值,而不是全局值。例如,當參數的初始值不好時會發生這種情況。它有助於儘可能好地估計初始值。

另一個問題是,該算法在參數值集之間使用的步長太大。例如,如果您在較寬的高峯上有一個非常窄的峯值,就會發生這種情況。通常,最終將得到一個描述兩個相同峯值之和的參數集,它描述了寬峯,而忽略了窄峯。同樣,一個好的初始值集合將會有所幫助。您也可以先保持峯值位置不變(即不在gnuplot中的via -list中)並適合所有其他參數,然後將所有參數放入第二個命令中。

但是,如果f(x)是一個線性函數,這個問題就不存在了!
你可以將f(x)替換爲m * x + b並進行數學運算。結果是χ2在參數空間中是一個拋物線,它有一個唯一的最小值,也可以明確計算。 因此,如果gnuplot爲您提供了該數據的一組參數,那麼即使您不喜歡該結果,該結果也是絕對正確的。

+0

Gnuplot使用非線性擬合,獨立於選擇函數來擬合。這意味着擬合算法只能找到χ2的局部最小值,並且也是最簡單的擬合,即具有兩個點的線性擬合函數可以給出錯誤的結果。考慮一個包含兩行'776649600 -0.227587'和'798249600 -0.056367'的數據文件。現在,使用'f(x)= a * x + b; A = B = 1;通過a,b'使用1:2擬合f(x)'test.dat'給出錯誤結果'a = -1.44846e-09'和'b = 1'(都是5.0和4.6.6)。值來自[適合使用Gnuplot的時間序列](http://stackoverflow.com/q/29445324/2604213) – Christoph