6

我一直在測試已發表在文獻中的一種算法,該算法涉及在Matlab和Python中求解一組'm'非線性方程。非線性方程組涉及包含複數的輸入變量,因此得到的解決方案也應該是複雜的。截至目前,我已經能夠通過使用下面的代碼行獲得在Matlab不錯的成果:從Python中的非線性方程組中找到復​​數根

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'算法存在於函數根源下。在蟒蛇這種算法不能處理複雜的根源,當我運行下面幾行:

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中的複雜的非線性方程。

非常感謝您

回答

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使用:該函數的實部和虛部同時解決,將輸入參數的實部和虛部視爲獨立。