2014-06-13 115 views
0

我是iPython的新手,需要解決一個特定的曲線擬合問題,我有這個概念,但是我的編程知識還有限。我有實驗數據(x, y)擬合到一個具有四個係數(a,b,c,d)的方程(曲線擬合),我想將這些係數(例如a)中的一個固定到一個特定值並重新設計我的實驗數據(非線性最小二乘)。係數b,c和d並不相互獨立,這意味着它們通過方程組相關。帶約束方程的ipython非線性最小二乘法

更適合使用curve_fitlmfit

我curve_fit開始這樣:

def fitfunc(x,a,b,c,d): 
    return a+b*x+c/x+log10(x)*d 
popt, fitcov = curve_fit(fitfunc, x, y) 

或像這樣的代碼lmfit

import scipy as sp 
from lmfit import minimize, Parameters, Parameter, report_fit 

def fctmin(params, x, y): 
    a = params['a'].value 
    b = params['b'].value 
    c = params['c'].value 
    d = params['d'].value 

    model = a+b*x+c/x+d*np.log10(x) 

    return model - y 

#create parameters 
params = Parameters() 
params.add('a', value = -89) 
params.add('b', value =b) 
params.add('c', value = c) 
params.add('d', value = d) 

#fit leastsq model 
result = minimize(fctmin, params, args=(x, y)) 

#calculate results 
final = y + result.residual 
report_fit(params) 
+0

這裏的關鍵似乎是你的係數不是獨立的。如果他們是,'curve_fit'應該很好地完成這項工作。但是,您似乎無法處理上述任一解決方案中的依賴關係,因此不能保證'curve_fit'或'lmfit'的輸出將保持該依賴關係。你能解決一個或多個自變量的相關方程嗎? – Jsl

回答

0

我承認到被偏置。 curve_fit()被設計爲通過假設您將y(x)數據擬合到y(x,參數)的模型來簡化scipy.optimize.leastsq(),所以傳遞給curve_fit()的函數是一個將計算適合值的模型。 lmfit有點更一般和更靈活,因爲你的目標函數必須返回最小二乘意義上的數組,但是你的目標函數必須返回「模型數據」而不是「模型」

但是,lmfit具有的功能看起來完全符合您的需求:修復模型中的一個參數,而無需重新編寫目標函數。
也就是說,你可以說

params.add('a', value = -89, vary=False) 

和參數 'A' 將保持固定。要用curve_fit()來做到這一點,你必須重寫你的模型函數。

另外,你說b,c和d通過方程相關,但是不提供細節。使用lmfit,您可能可以將這些方程作爲約束。你有

params.add('b', value =b) 
params.add('c', value = c) 
params.add('d', value = d) 

雖然我沒有看到b值。即使假設有一個值,也會創建三個具有相同起始值的獨立變量。你可能意思是「改變b,強制c和d得到相同的值」。 lmfit可以做到這一點:

params.add('b', value = 10) 
params.add('c', expr = 'b') 
params.add('d', expr = 'c') 

這將有一個獨立變量,並且對於C的值將被強制爲a〜b的(和d至c)的值。您可以使用(大約)任何有效的Python語句作爲約束約束表達式,比如:

params.add('b', value = 10) 
params.add('c', expr = 'sqrt(b/10)') 
params.add('d', expr = '1-c') 

我認爲這可能是諸如此類的事情,你要尋找的。

+0

謝謝!它正是我所尋找的。我還發現,如果我想在後面的公式中使用如此計算的係數,我需要使用:a = params ['a']。值 b = params ['b']。值 c = params ['c']。值 d = params ['d']。value –

相關問題