我剛開始使用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
看起來您正在使用行的方法(https://en.wikipedia.org/wiki/Method_of_lines)將PDE近似爲ODE系統,然後使用歐拉方法(https:// en。 wikipedia.org/wiki/Euler_method)來解決ODE。你確定你所選擇的dt是否足夠小以確保歐拉方法穩定? –
嗯,我不知道它被稱爲線的方法,但是,這是我正在嘗試做的。 我確實用更小的'dt'擺脫了錯誤信息,但不幸的是我的老師(我是一名物理系學生)想讓我用這個特定的dt找到答案。我會繼續搜索,也許嘗試一個不太不穩定的方法,非常感謝! –