【问题标题】:python scipy leastsq fit with complex numberspython scipy leastsq 适合复数
【发布时间】:2013-01-15 06:35:38
【问题描述】:

我有一个复数数据集,我希望能够找到最适合数据的参数。您可以使用 Python 中的 scipy 实现的 minimumsq 将数据拟合为复数吗?

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

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

【问题讨论】:

    标签: python scipy least-squares cmath


    【解决方案1】:

    scipy 中的最小二乘函数希望返回一个真实的残差,因为它很难比较复杂的值(例如 1+2j 是大于还是小于 2+1j?)。请记住,残差本质上是对传入参数集质量的衡量,它告诉 leastsq 它与真实拟合的接近程度。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 2013-08-09
      • 2017-07-22
      • 2015-10-04
      相关资源
      最近更新 更多