2013-01-12 39 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的复杂的,那么这将工作,并相对有效。