【发布时间】:2019-04-21 18:12:37
【问题描述】:
我试图展示扩散的灰色斯科特模型。即使我觉得我的代码非常接近正确,我仍然会收到一堆运行时警告错误。我的离散化有问题吗?
import numpy as np
import matplotlib.pyplot as plt
#parameters
N=128
F=.042
k=.062
Du=(2**-5)*(N**2/6.25)
Dv=(1**-5)*(N**2/6.25)
tend=1000
dt=tend/N
t=0
#start arrays
U=np.ones((N,N))
V=np.zeros((N,N))
#Initial Value Boxes (20x20 in middle)
low=int(((N/2)-10))
high=int(((N/2)+10))+1
U[low:high,low:high]=.5
V[low:high,low:high]=.25
#Random Noise
U+=.01*np.random.random((N,N))
V+=.01*np.random.random((N,N))
#Laplace
def Laplace(f):
return np.roll(f,1)+np.roll(f,-1)+np.roll(f,1,axis=False)+np.roll(f,-1,axis=False)-4*f
#Solve
pstep=100
for t in range(tend):
U+=((Du*Laplace(U))-(U*V*V)+(F*(1-U)))
V+=((Dv*Laplace(V))+(U*V*V)-(V*(F+k)))
if t%pstep ==0:
print(t//pstep)
plt.imshow(U, interpolation='bicubic',cmap=plt.cm.jet)
【问题讨论】:
-
一个问题是,您应该分别计算
dU和dV,然后分别计算U+=dU和V+=dV,否则您使用更新后的U 来计算V。但这并不t 完全解决了数值不稳定性。我认为您可能计算 Du 和 Dv 错误?价值似乎很高