2015-12-14 132 views
1

我剛開始使用Python,所以我可能會問一個不那麼微妙的問題,但經過相當多的研究後,我無法解決此錯誤。 我實際上正在嘗試使用Gray-Scott模型來解決物理問題,但我被卡在代碼的最後:結果不被視爲數字,並且在方塊中遇到溢出,添加,乘法和。減去。Python:運行時警告:在正方形中遇到溢出,添加,乘法,減法

這裏的任何人都有絲毫的想法,這是從哪裏來的?

謝謝!

這是我試圖解決這個問題初始條件:

n = 192 
Du, Dv, F, k = 0.00016, 0.00008, 0.035, 0.065 
dh = 5/(n-1) 
T = 8000 
dt = .9 * dh**2/(4*max(Du,Dv)) 
nt = int(T/dt) 

uvinitial = numpy.load('./uvinitial.npz') 

Uin = uvinitial['U'] 
Vin = uvinitial['V'] 

現在,這裏是我的功能:

def Nd1(U,V) : 
    return - U*(V)**2 + F*(1-U) 


def Nd2(U,V) : 
    return U*(V)**2 -(F+k)*V 


def gray_scott_solve(Du, Dv, dh, dt, nt, Uin, Vin, Nd1, Nd2): 

    Uplus = Uin.copy() 
    Vplus = Vin.copy() 

    for n in range(nt): 

     U = Uplus.copy() 
     V = Vplus.copy() 

     Uplus[1:-1,1:-1] = (Nd1(U[1:-1,1:-1], V[1:-1,1:-1]) + Du/(dh**2) \ 
          *(U[2:,1:-1] + U[:-2,1:-1] - 4*U[1:-1,1:-1]) \ 
          + U[1:-1,2:] + U[1:-1,:-2])*dt \ 
          + U[1:-1,1:-1] 

     Uplus[:,-1] = Uplus[:,-2]  
     Uplus[-1,:] = Uplus[-2,:] 
     Uplus[:,0] = Uplus[:,1] 
     Uplus[0,:] = Uplus[1,:] 

     Vplus[1:-1,1:-1] = (Nd2(U[1:-1,1:-1], V[1:-1,1:-1]) + Du/(dh**2) \ 
          *(V[2:,1:-1] + V[:-2,1:-1] - 4*V[1:-1,1:-1]) \ 
          + V[1:-1,2:] + V[1:-1,:-2])*dt \ 
          + V[1:-1,1:-1] 

     Vplus[:,-1] = Vplus[:,-2] 
     Vplus[-1,:] = Vplus[-2,:] 
     Vplus[:,0]= Vplus[:,1] 
     Vplus[0,:]= Vplus[1,:] 


    return U, V 

我現在想打印我期待的結果爲:

U, V = gray_scott_solve(Du, Dv, dh, dt, nt, Uin, Vin, Nd1, Nd2) 

print(U[100,::40]) 

我終於得到這個錯誤:

[ nan nan nan nan nan] 

C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:2: RuntimeWarning: overflow encountered in square from ipykernel import kernelapp as app 
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:2: RuntimeWarning: overflow encountered in multiply from ipykernel import kernelapp as app 
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:5: RuntimeWarning: overflow encountered in square 
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:5: RuntimeWarning: overflow encountered in multiply 
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:11: RuntimeWarning: invalid value encountered in add 
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:11: RuntimeWarning: overflow encountered in multiply 
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:11: RuntimeWarning: invalid value encountered in subtract 
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:18: RuntimeWarning: invalid value encountered in add 
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:18: RuntimeWarning: overflow encountered in multiply 
C:\Users\Anto\Anaconda3\lib\site-packages\ipykernel\__main__.py:18: RuntimeWarning: invalid value encountered in subtract 
+1

看起來您正在使用行的方法(https://en.wikipedia.org/wiki/Method_of_lines)將PDE近似爲ODE系統,然後使用歐拉方法(https:// en。 wikipedia.org/wiki/Euler_method)來解決ODE。你確定你所選擇的dt是否足夠小以確保歐拉方法穩定? –

+0

嗯,我不知道它被稱爲線的方法,但是,這是我正在嘗試做的。 我確實用更小的'dt'擺脫了錯誤信息,但不幸的是我的老師(我是一名物理系學生)想讓我用這個特定的dt找到答案。我會繼續搜索,也許嘗試一個不太不穩定的方法,非常感謝! –

回答

1

正如你這寫的,你的空間一步,dh,將等於零在Python 2:

n = 192 
... 
dh = 5/(n - 1) 

如果您正在使用python 3,那麼衛生署會適當地被視爲浮動。否則,正如@WarrenWeckesser所述,您正在使用線的方法並與前向歐拉方法及時集成,該方法使用您的一組約束(您說您的導師指定了您的時間步和其他參數值)顯然是不穩定的。但是,使用Runge Kutta Two方法將適用於您的dt(我驗證了這一點),但您的講師可能提到了您應該使用的時間集成。

無論如何,如果龍格庫塔兩個似乎令人生畏,使用二階中央空間的方法:

u_{n+1} = u_{n-1} + 2 * dt * f(t_n,u_n) 

其中f(t,u)是右手側和u_{n-1}u在時間t_{n-1}值,或向後歐拉方法。

+0

我會嘗試你提出的兩種方法,這不是我的老師所期望的,但他會理解,如果能夠以這種方式獲得好的結果。對我來說,這將是非常好的練習!非常感謝您的幫助。 –