Python Scipy Lesssq encaja con números complejos

Tengo un conjunto de datos de números complejos y me gustaría poder encontrar los parámetros que mejor se ajusten a los datos. ¿Puede ajustar los datos en números complejos utilizando la herramienta Lesssq implementada por scipy en Python?

Por ejemplo, mi código es algo como esto:

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= x0=np.array[1, 2, 3, 4] res = leastsq(residuals,x0, args=(z,x)) 

Sin embargo, a los residuals no les gusta trabajar con mi número complejo, me aparece el error:

 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 

Supongo que necesito trabajar solo con flotantes / dobles en lugar de números complejos. En ese caso, ¿cómo puedo evaluar las partes reales y complejas por separado y luego agruparlas en una única métrica de error para que los residuals regresen?

Related of "Python Scipy Lesssq encaja con números complejos"

La función de mínimos cuadrados en scipy quiere que se devuelva un residuo real porque es difícil comparar valores complejos (por ejemplo, ¿es 1 + 2j mayor o menor que 2 + 1j?). Recuerde que el residual es esencialmente una medida de la calidad del conjunto de parámetros pasados, le dice a lesssq qué tan cerca del verdadero ajuste es.

Lo que puede hacer es agregar el error (y-sim) en cuadratura, agregando estas líneas después de calcular ‘sim’ en su función de residuos:

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

Siempre que y y sim sean np.array’s de complejos, entonces esto funcionará y es relativamente eficiente.