Cómo hacer una raíz compleja no lineal para encontrar en Python

Quiero hacer una búsqueda de raíz para las siguientes ecuaciones no lineales, lo hago en Python pero no funciona. mi código está abajo

from pylab import * import scipy import scipy.optimize def z1(x,y): temp=1+1j+x+2*y; return temp def z2(x,y): temp=-1j-2*x+sqrt(3)*y; return temp def func(x): temp=[z1(x[0],x[1])-1.0/(1-1.0/(z2(x[0],x[1]))),1-2.0/(z2(x[0],x[1])-4.0/z1(x[0],x[1]))] return temp result=scipy.optimize.fsolve(func,[1+1j,1+1j]) print result 

cuando lo ejecuto, muestra errores:

—> 30 resultado = scipy.optimize.fsolve (func, [1 + 1j, 1 + 1j])

C: \ Python27 \ lib \ site-packages \ scipy \ optimise \ minpack.py en fsolve (func, x0, args, fprime, full_output, col_deriv, xtol, maxfev, band, epsfcn, factor, diag)

 123 maxfev = 200*(n + 1) 124 retval = _minpack._hybrd(func, x0, args, full_output, xtol, 

-> 125 maxfev, ml, mu, epsfcn, factor, diag)

 126 else: 127 _check_func('fsolve', 'fprime', Dfun, x0, args, n, (n,n)) 

fsolve encuentra ceros de funciones de R ^ n -> R. La función similar root encuentra ceros de funciones de R ^ n -> R ^ m.

Parece que estás tratando de encontrar ceros de una función de C ^ 2 -> C ^ 2, que por lo que sé, scipy.optimize no admite directamente, pero puedes intentar escribir una función de R ^ 4 -> R ^ 4 y luego usar root . Por ejemplo, algo a lo largo de las líneas de:

 def func_as_reals(x): r1, c1, r2, c2 = x a, b = func([complex(r1, c1), complex(r2, c2)]) return [a.real, a.imag, b.real, b.imag] 

debería funcionar, aunque podría ser significativamente más rápido hacerlo directamente en los números reales en lugar de envolverse repetidamente en complejo y desenvolver.

Podrías probar el findroot ( sympy ) de mpmath :

 from mpmath import findroot #Your code here ans = findroot([z1,z2],(0,0)) print(ans) 

Devoluciones:

 [(-0.302169479251962 - 0.651084739625981j)] [(-0.348915260374019 - 0.174457630187009j)] 

Que es una solución de tu sistema.
Mpmath es una biblioteca multiprecisión, por lo que las rutinas son generalmente más lentas, ¡pero puedes intentarlo!