2013-03-04 70 views
6

我想對以下非線性方程進行根搜索,我在Python中執行它,但它不起作用。我的代碼是下面如何在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結果= scipy.optimize.fsolve(FUNC,[1 + 1J,1 + 1J])

C:\ Python27 \ lib中\站點包\ SciPy的\優化\ minpack.py在fsolve(FUNC,X0,指定參數時,fprime,full_output,col_deriv,xtol,maxfev,樂隊,epsfcn,因子,診斷)

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)) 
+4

它是如何工作的? – Blender 2013-03-04 23:31:07

+0

這是由於複數的單位「j」,似乎fsolve只能搜索真正的方程根並返回真正的根! – user2133730 2013-03-05 00:28:34

回答

6

fsolve發現的來自R^n個函數零點 - > R的類似功能root發現的來自R^n個函數零點 - > R 2米。

它看起來像你試圖從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] 

應該工作,但它可能是顯著快,直接做在實數,而不是反覆包裝成複雜和展開。

+0

這只是我真正解決問題的一個非常簡單的例子。真正的問題是一個5000深度的「斐波納契樣」分數,但在C^2中,所以似乎沒有希望將那個怪物改寫成R^4 – user2133730 2013-03-05 00:42:23

+0

,爲什麼在.optimize下沒有.root?當我「選項卡」優化。我可以找到.fsolve,但沒有.root。我使用Python27,學術版 – user2133730 2013-03-05 00:46:52

+0

你有什麼版本的scipy?正如鏈接文檔所說,「根」在0.11中是新的;因爲你似乎在使用EPD(因爲沒有像Python的「學術版本」這樣的東西),它可能仍然有一箇舊版本。 – Dougal 2013-03-05 04:40:44

1

你可以嘗試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是一個多精度庫,所以它的例程通常比較慢,但你可以試試看!

+0

你的意思是sympy而不是scipy,對吧? – NauticalMile 2016-10-07 15:44:31

+0

@NauticalMile你是對的。謝謝! – 2016-10-08 20:31:46