在 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 用于 Uv_mesh 用于 V.
  • 无通量边界条件是 FiPy 的默认设置,因此没有理由指定 U.faceGrad.constrain,等等。
    • 此外,这些方程中没有通量(因为它们是 ODE),因此设置边界通量没有意义。
  • 通常我会建议让你的方程更多 implicit, coupling them together, and sweeping,但 none 在这种情况下似乎对它们的演变有很大影响。