首页 > 解决方案 > 在 python 中使用 FIPY 计算联立偏微分方程

问题描述

我试图使用 fipy 解决 pde,因为我是新手;我无法调试代码中的错误。它没有给出任何空间图案,而只是在一段时间内给出不同的单色方块。我要解决的方程式是-

(∂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()

标签: pythonfipy

解决方案


  • 这些方程是 ODE,而不是 PDE。FiPy 可能能够解决这些问题,但还有其他工具可以更好地解决 ODE,例如 SciPyodeintscikits.odes.
  • 我不确定您所说的“它没有给出任何图案,而只是在一段时间内给出不同的单色方块”是什么意思。随机初始条件似乎没有进化,但如果我增加到dt1.0,则V进化到大约 0.5 的统一值。U对我来说似乎没有进化,但这是某种显示故障。V进化到 0.598 并U进化到 0.179。空间中没有模式(如果这是您所期望的),因为这些方程没有空间依赖性;它们在时间上只有偏导数,因此绝对没有什么可以导致变量从一个单元格流向另一个单元格。
  • 您似乎在这里逃脱了它,但是您的变量应该始终在同一个网格上定义,而不是u_meshforUv_meshfor V
  • 无通量边界条件是 FiPy 中的默认值,因此没有理由指定U.faceGrad.constrain等。
    • 此外,这些方程中没有通量(因为它们是 ODE),因此设置边界通量没有意义。
  • 通常我会建议让你的方程更隐含,将它们耦合在一起,然后扫描,但在这种情况下,这些似乎都没有对它们的演变产生太大影响。

推荐阅读