python scipy leastsq适合复杂的数字

时间:2013-01-12 18:53:19

标签: python scipy least-squares cmath

我有一个复数的数据集,我希望能够找到最适合数据的参数。您可以使用pyp中的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返回?

1 个答案:

答案 0 :(得分:2)

scipy中的最小二乘函数需要返回实数残差,因为难以比较复数值(例如,1 + 2j大于或小于2 + 1j?)。记住残差本质上是传入参数集质量的度量,它告诉最小值它与真实拟合的接近程度。

您可以做的是在正交中添加误差(y-sim),在残差函数中计算'sim'后附加这些行:

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

只要y和sim都是复杂的np.array,那么这将起作用并且相对有效。