2013-01-12 66 views
1

我有一個複數的數據集,我希望能夠找到最適合數據的參數。你可以使用Python中的scipy實現的leastsq來適合複雜數據中的數據嗎?python scipy leastsq適合複數

例如,我的代碼是這樣的:

import cmath 
from scipy.optimize import leastsq 
def residuals(p,y,x): 
     L,Rs,R1,C=p 
     denominator=1+(x**2)*(C**2)*(R1**2) 
     sim=complex(Rs+R1/denominator,x*L-(R1**2)*x*C/denominator) 
     return(y-sim) 

z=<read in data, store as complex number> 
x0=np.array[1, 2, 3, 4] 
res = leastsq(residuals,x0, args=(z,x)) 

然而,residuals不喜歡和我的複數的工作,我得到的錯誤:

File "/tmp/tmp8_rHYR/___code___.py", line 63, in residuals 
    sim=complex(Rs+R1/denominator,x*L-(R1**_sage_const_2)*x*C/denominator) 
    File "expression.pyx", line 1071, in sage.symbolic.expression.Expression.__complex__ (sage/symbolic/expression.cpp:7112) 
TypeError: unable to simplify to complex approximation 

我猜我只需要使用浮動/雙打而不是複雜的數字。在那種情況下,我怎樣才能分別評估真實和複雜的零件,然後將它們歸併爲一個單一的錯誤指標,以便返回residuals

回答

2

scipy中的最小二乘函數想要返回一個實際殘差,因爲難以比較複數值(例如,1 + 2j大於或小於2 + 1j?)。請記住,殘差基本上是傳入參數集的質量的度量,它告訴leastsq與真實擬合的距離有多接近。

你可以做什麼是正交添加錯誤(Y-SIM),附加這些線路在您的殘差函數計算「卡」後:

a = y-sim 
return a.real**2 + a.imag**2 

只要y和SIM卡都是NP .ray的複雜的,那麼這將工作,並相對有效。