Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to do nonlinear complex root finding in Python

I want to do a root search for the following nonlinear equations, I do it in Python but it doesn't work. my code is below

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

when I run it, it shows errors:

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

C:\Python27\lib\site-packages\scipy\optimize\minpack.py in 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))
like image 453
user2133730 Avatar asked Mar 04 '13 23:03

user2133730


2 Answers

fsolve finds zeros of functions from R^n -> R. The similar function root finds zeros of functions from R^n -> R^m.

It looks like you're trying to find zeros of a function from C^2 -> C^2, which as far as I know scipy.optimize doesn't support directly - but you could try writing it a function from R^4 -> R^4 and then using root. For example, something along the lines of:

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]

should work, though it might be significantly faster to do it directly on the real numbers instead of repeatedly wrapping into complex and unwrapping.

like image 165
Danica Avatar answered Oct 14 '22 15:10

Danica


You could try mpmath's findroot(sympy):

from mpmath import findroot

#Your code here

ans = findroot([z1,z2],(0,0))
print(ans)

Returns:

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

which is a solution of your system.
Mpmath is a multiprecision library so it's routines are generally slower, but you could give it a try!

like image 27
Javier Garcia Avatar answered Oct 14 '22 17:10

Javier Garcia