首页 文章

从python中的非线性方程组中寻找复杂的根

提问于
浏览
6

我一直在测试一种已经在文献中发表的算法,该算法涉及在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中复杂的非线性方程式 .

非常感谢你

1 回答

  • 5

    当我遇到这种类型的问题时,我尝试将我的函数重写为实部和虚部的数组 . 例如,如果 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 :函数的实部和虚部同时求解,将输入参数的实部和虚部视为独立部分 .

相关问题