如何在Python中进行非线性复根查找

8 投票
2 回答
12150 浏览
提问于 2025-04-17 17:56

我想对以下非线性方程进行根搜索,我在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])

C:\Python27\lib\site-packages\scipy\optimize\minpack.py中的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))

2 个回答

4

你可以试试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是一个多精度计算的库,所以它的运行速度通常比较慢,但你可以试试看!

6

fsolve 是一个用来寻找函数零点的工具,适用于从实数空间 R^n 到实数 R 的函数。类似的,root 这个函数可以用来寻找从 R^n 到 R^m 的函数零点。

看起来你想找的是从复数空间 C^2 到 C^2 的函数零点,按照我所知道的,scipy.optimize 目前不直接支持这个功能。不过,你可以尝试把它写成一个从 R^4 到 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]

这样应该可以工作,不过直接在实数上操作可能会快很多,而不是反复地在复数和实数之间转换。

撰写回答