python scipy наименьший квадрат подходит для комплексных чисел

У меня есть набор данных комплексных чисел, и я хотел бы найти параметры, которые лучше всего соответствуют данным. Можете ли вы разместить данные в комплексных числах, используя наименьший квадрат, как это реализовано в 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?


person user1972912    schedule 12.01.2013    source источник


Ответы (1)


Функция наименьших квадратов в scipy требует возврата реального остатка, потому что сложно сравнивать комплексные значения (например, 1+2j больше или меньше 2+1j?). Помните, что остаток — это, по сути, мера качества переданного набора параметров, он сообщает наименьшему квадрату, насколько он близок к истинному совпадению.

Что вы можете сделать, так это добавить ошибку (y-sim) в квадратуру, добавив эти строки после того, как вы вычислите «sim» в своей функции остатков:

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

Пока y и sim являются np.array из сложных, это будет работать и относительно эффективно.

person Adam Cadien    schedule 14.01.2013