在python中从非线性方程组求复根

2024-10-01 11:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在测试一个已经发表在文献中的算法,该算法涉及在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中,此算法无法处理复杂的根,当我运行以下行时:

^{pr2}$

我得到以下错误:

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

我试过使用其他一些算法,比如“broyden2”和“anderson”,但是它们比Matlab差得多,而且只有在处理初始条件后才能给出好的结果。函数'fsolve'也不能处理复杂变量。在

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

非常感谢


Tags: lambda函数代码算法ones文献optionseq
1条回答
网友
1楼 · 发布于 2024-10-01 11:32:07

当我遇到这类问题时,我试图将函数重写为实部和虚部的数组。例如,如果f是接受复杂输入数组x的函数(为了简单起见,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:函数的实部和虚部同时求解,将输入参数的实部和虚部视为独立的。在

相关问题 更多 >