从Python中的非线性方程组中找到复​​数根

2024-03-14

我一直在测试一种已在文献中发表的算法,该算法涉及在 Matlab 和 Python 中求解一组“m”非线性方程。非线性方程组涉及包含复数的输入变量,因此所得解也应该是复数。到目前为止,我已经能够通过使用以下代码行在 Matlab 中获得相当好的结果:

lambdas0 = ones(1,m)*1e-5;
options = optimset('Algorithm','levenberg-marquardt',...
'MaxFunEvals',1000000,'MaxIter',10000,'TolX',1e-20,...
'TolFun',1e-20);

Eq = @(lambda)maxentfun(lambda,m,h,g);
[lambdasf]  = fsolve(Eq,lambdas0,options);

其中 h 和 g 分别是复矩阵和向量。对于大范围的初始值,该解收敛得非常好。

我一直试图在 Python 中模仿这些结果,但收效甚微。数值求解器的设置似乎有很大不同,“levenburg-marquardt”算法存在于函数根下。在 python 中,该算法无法处理复杂的根,当我运行以下几行时:

lambdas0 = np.ones(m)*1e-5

sol = root(maxentfun, lambdas0, args = (m,h,g), method='lm', tol = 1e-20, options = {'maxiter':10000, 'xtol':1e-20})

lambdasf = sol.x

我收到以下错误:

minpack.error: Result from function call is not a proper array of floats.

我尝试过使用其他一些算法,例如“broyden2”和“anderson”,但它们远不如 Matlab,并且只有在尝试了初始条件后才给出不错的结果。函数“fsolve”也不能处理复杂变量。

我想知道是否有什么我应用不正确的地方,以及是否有人知道如何在 Python 中正确求解复杂的非线性方程。

非常感谢


当我遇到此类问题时,我尝试将函数重写为实部和虚部的数组。例如,如果f是您的函数,它需要复杂的输入数组x (say x为简单起见,尺寸为 2)

from numpy import *
def f(x):
    # Takes a complex-valued vector of size 2 and outputs a complex-valued vector of size 2
    return [x[0]-3*x[1]+1j+2, x[0]+x[1]]  # <-- for example

def real_f(x1):
    # converts a real-valued vector of size 4 to a complex-valued vector of size 2
    # outputs a real-valued vector of size 4
    x = [x1[0]+1j*x1[1],x1[2]+1j*x1[3]]
    actual_f = f(x)
    return [real(actual_f[0]),imag(actual_f[0]),real(actual_f[1]),imag(actual_f[1])]

新功能,real_f可用于fsolve:同时求解函数的实部和虚部,将输入参数的实部和虚部视为独立的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从Python中的非线性方程组中找到复​​数根 的相关文章

随机推荐