在 python 中使用 FIPY 计算联立偏微分方程
Computing simultaneous Partial differential equation using FIPY in python
我正在尝试使用 fipy 解决 pde,因为我是新手;我无法调试我的代码中的错误。
它没有给出任何空间模式,只是在一段时间内给出不同的单色方块。The equation which I'm trying to solve are-
(∂u(x,y,t))/∂t=G_1 (u,v)+d_11 ∇^2 u+d_12 ∇^2 v 和
(∂v(x,y,t))/∂t=G_2 (u,v)+d_21 ∇^2 u+d_22 ∇^2 v
from fipy import *
nx=ny=200
dx=dy=0.25
L=dx*nx
dt=0.01
E=1.0
A=0.91881 #Alpha
B=0.0327 #Beta
D=0.05 #Delta
G=0.15 #Gamma
d11=0.1
d12=0.01
d21=0.5
d22=1.5
mesh =Grid2D(dx=dx,dy=dy,nx=nx,ny=ny)
u=CellVariable(name='u Variable',mesh=mesh) #pray
v=CellVariable(name='v Variable',mesh=mesh) #predator
u.setValue(GaussianNoiseVariable(mesh=mesh,mean=0.18,variance=0.01))
v.setValue(GaussianNoiseVariable(mesh=mesh,mean=0.6,variance=0.01))
eq_u=(TransientTerm(coeff=1,var=u)==u*(1-u)-(u*v*E)/(u+A*v)+ImplicitDiffusionTerm(coeff=d11,var=u)+ImplicitDiffusionTerm(coeff=d12,var=v))
eq_v=(TransientTerm(coeff=1,var=v)==B*v*(1-v)+(u*v*G)/(u+A*v)-D*v+ImplicitDiffusionTerm(coeff=d21,var=u)+ImplicitDiffusionTerm(coeff=d22,var=v))
#creating viewer
if __name__ == "__main__":
viewer_u=Viewer(vars=u,datamin=0.16,datamax=0.18)
viewer_u.plot()
viewer_v=Viewer(vars=v,datamin=0.0,datamax=0.4)
viewer_v.plot()
#solving
steps=250
for step in range(steps):
eq_u.solve(var=u,dt=dt)
eq_v.solve(var=v,dt=dt)
if __name__ == "__main__":
viewer_u.plot()
viewer_v.plot()
- 这些方程是常微分方程,而不是偏微分方程。 FiPy 可能能够解决它们,但还有其他工具可以更好地解决 ODE,例如 SciPy 的
odeint
and scikits.odes
.
- 我不确定你所说的“它没有给出任何图案,只是在一段时间内给出了不同的单色方块”是什么意思。随机初始条件似乎没有进化,但如果我将
dt
增加到 1.0,那么 V
会进化到大约 0.5 的统一值。 U
对我来说似乎没有进化,但这是某种显示故障。 V
进化到 0.598,U
进化到 0.179。 space 中没有模式(如果这是您所期望的),因为这些方程没有空间依赖性;它们在时间上只有偏导数,所以绝对没有什么可以导致变量从一个单元格流动到另一个单元格。
- 你似乎在这里逃脱了它,但你的变量应该总是在同一个网格上定义,而不是
u_mesh
用于 U
和 v_mesh
用于 V
.
- 无通量边界条件是 FiPy 的默认设置,因此没有理由指定
U.faceGrad.constrain
,等等。
- 此外,这些方程中没有通量(因为它们是 ODE),因此设置边界通量没有意义。
- 通常我会建议让你的方程更多 implicit, coupling them together, and sweeping,但 none 在这种情况下似乎对它们的演变有很大影响。
我正在尝试使用 fipy 解决 pde,因为我是新手;我无法调试我的代码中的错误。 它没有给出任何空间模式,只是在一段时间内给出不同的单色方块。The equation which I'm trying to solve are-
(∂u(x,y,t))/∂t=G_1 (u,v)+d_11 ∇^2 u+d_12 ∇^2 v 和
(∂v(x,y,t))/∂t=G_2 (u,v)+d_21 ∇^2 u+d_22 ∇^2 v
from fipy import *
nx=ny=200
dx=dy=0.25
L=dx*nx
dt=0.01
E=1.0
A=0.91881 #Alpha
B=0.0327 #Beta
D=0.05 #Delta
G=0.15 #Gamma
d11=0.1
d12=0.01
d21=0.5
d22=1.5
mesh =Grid2D(dx=dx,dy=dy,nx=nx,ny=ny)
u=CellVariable(name='u Variable',mesh=mesh) #pray
v=CellVariable(name='v Variable',mesh=mesh) #predator
u.setValue(GaussianNoiseVariable(mesh=mesh,mean=0.18,variance=0.01))
v.setValue(GaussianNoiseVariable(mesh=mesh,mean=0.6,variance=0.01))
eq_u=(TransientTerm(coeff=1,var=u)==u*(1-u)-(u*v*E)/(u+A*v)+ImplicitDiffusionTerm(coeff=d11,var=u)+ImplicitDiffusionTerm(coeff=d12,var=v))
eq_v=(TransientTerm(coeff=1,var=v)==B*v*(1-v)+(u*v*G)/(u+A*v)-D*v+ImplicitDiffusionTerm(coeff=d21,var=u)+ImplicitDiffusionTerm(coeff=d22,var=v))
#creating viewer
if __name__ == "__main__":
viewer_u=Viewer(vars=u,datamin=0.16,datamax=0.18)
viewer_u.plot()
viewer_v=Viewer(vars=v,datamin=0.0,datamax=0.4)
viewer_v.plot()
#solving
steps=250
for step in range(steps):
eq_u.solve(var=u,dt=dt)
eq_v.solve(var=v,dt=dt)
if __name__ == "__main__":
viewer_u.plot()
viewer_v.plot()
- 这些方程是常微分方程,而不是偏微分方程。 FiPy 可能能够解决它们,但还有其他工具可以更好地解决 ODE,例如 SciPy 的
odeint
andscikits.odes
. - 我不确定你所说的“它没有给出任何图案,只是在一段时间内给出了不同的单色方块”是什么意思。随机初始条件似乎没有进化,但如果我将
dt
增加到 1.0,那么V
会进化到大约 0.5 的统一值。U
对我来说似乎没有进化,但这是某种显示故障。V
进化到 0.598,U
进化到 0.179。 space 中没有模式(如果这是您所期望的),因为这些方程没有空间依赖性;它们在时间上只有偏导数,所以绝对没有什么可以导致变量从一个单元格流动到另一个单元格。 - 你似乎在这里逃脱了它,但你的变量应该总是在同一个网格上定义,而不是
u_mesh
用于U
和v_mesh
用于V
. - 无通量边界条件是 FiPy 的默认设置,因此没有理由指定
U.faceGrad.constrain
,等等。- 此外,这些方程中没有通量(因为它们是 ODE),因此设置边界通量没有意义。
- 通常我会建议让你的方程更多 implicit, coupling them together, and sweeping,但 none 在这种情况下似乎对它们的演变有很大影响。