我想对以下非线性方程进行根搜索,我在Python中进行,但它不起作用。我的代码在下面
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
当我运行它时,它显示错误:
---> 30 result = scipy.optimize.fsolve(func,[1 + 1j,1 + 1j])
在fsolve中的<:C:\ Python27 \ lib \ site-packages \ scipy \ optimize \ minpack.py(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,
- &GT; 125 maxfev,ml,mu,epsfcn,factor,diag)
126 else:
127 _check_func('fsolve', 'fprime', Dfun, x0, args, n, (n,n))
答案 0 :(得分:6)
fsolve
从R ^ n - &gt;中找到函数的零。 R.类似函数root
从R ^ n - >找到函数的零。 R 1米。
看起来你正试图从C ^ 2中找到一个函数的零 - &gt; C ^ 2,据我所知scipy.optimize不直接支持 - 但你可以尝试从R ^ 4写一个函数 - &gt; R ^ 4然后使用root
。例如,类似于:
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]
应该可行,但直接在实数上执行它可能要快得多,而不是反复包装到复杂和展开中。
答案 1 :(得分:1)
你可以试试mpmath的findroot(sympy):
from mpmath import findroot
#Your code here
ans = findroot([z1,z2],(0,0))
print(ans)
返回:
[(-0.302169479251962 - 0.651084739625981j)]
[(-0.348915260374019 - 0.174457630187009j)]
这是您系统的解决方案 Mpmath是一个多精度库,因此它的例程通常较慢,但你可以尝试一下!