-->

蟒蛇SciPy的leastsq适合用复数(python scipy leastsq fit with

2019-08-06 14:47发布

我有复数的数据集,我希望能够找到最适合的数据参数。 你能适应在使用leastsq复数数据由SciPy的Python中实现?

例如,我的代码是这样的:

 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返回?

Answer 1:

在SciPy的最小二乘函数想要一个实际残余返回,因为它是难以比较复杂的值(例如是1 + 2J大于或小于2 + 1J?)。 记住残留在本质上是一套传递参数的质量的度量,它告诉leastsq是多么接近真实的配合。

你可以做的是正交添加错误(Y-SIM),附加这些线路在您的残差功能计算“卡”后:

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

只要y和SIM是复杂的,那么这将工作,是相对有效的两个np.array的。



文章来源: python scipy leastsq fit with complex numbers