【发布时间】:2019-02-15 01:49:21
【问题描述】:
我尝试使用 Matlab 函数 Pdepe (https://www.mathworks.com/help/matlab/ref/pdepe.html) 解决对流-扩散-反应问题的一维耦合偏微分方程。与扩散项相比,在对流项较高的情况下,此功能无法正常工作。 因此,我搜索并找到了使用 Python 库 FiPy 来解决我的 PDEs 系统的选项。 我的初始条件是 4*L/10 的 u1=1
我的耦合方程具有以下形式:
du1/dt = d/dx(D1 * du1/dx) + g * x * du1/dx - mu1 * u1 / (K + u1) * u2
du2/dt = d/dx(D2 * du2/dx) + g * x * du2/dx + mu2 * u1 / (K + u1) * u2
我尝试通过结合 FiPy 示例(examples.convection.exponential1DSource.mesh1D、examples.levelSet.advection.mesh1D、examples.cahnHilliard.mesh2DCoupled)来编写它。
以下行不是一个工作示例,而是我第一次尝试编写代码。这是我第一次使用 FiPy(在文档的测试和示例之外),所以对于普通用户来说,这似乎完全没有抓住重点。
from fipy import *
g = 0.66
L = 10.
nx = 1000
mu1 = 1.
mu2 = 1.
K = 1.
D1 = 1.
D2 = 1.
mesh = Grid1D(dx=L / 1000, nx=nx)
x = mesh.cellCenters[0]
convCoeff = g*(x-L/2)
u10 = 4*L/10 < x < 6*L/10
u20 = 1.
u1 = CellVariable(name="u1", mesh=mesh, value=u10)
u2 = CellVariable(name="u2", mesh=mesh, value=u20)
## Neumann boundary conditions
u1.faceGrad.constrain(0., where=mesh.facesLeft)
u1.faceGrad.constrain(0., where=mesh.facesRight)
u2.faceGrad.constrain(0., where=mesh.facesLeft)
u2.faceGrad.constrain(0., where=mesh.facesRight)
sourceCoeff1 = -1*mu1*u1/(K+u1)*u2
sourceCoeff2 = 1*mu2*u1/(K+u1)*u2
eq11 = (TransientTerm(var=u1) == DiffusionTerm(coeff=D1, var=u1) + ConvectionTerm(coeff=convCoeff))
eq21 = (TransientTerm(var=u2) == DiffusionTerm(coeff=D2, var=u2) + ConvectionTerm(coeff=convCoeff))
eq12 = ImplicitSourceTerm(coeff=sourceCoeff1, var=u1)
eq22 = ImplicitSourceTerm(coeff=sourceCoeff2, var=u2)
eq1 = eq11 & eq12
eq2 = eq21 & eq22
eqn = eq1 & eq2
vi = Viewer((u1, u2))
for t in range(100):
u1.updateOld()
u2.updateOld()
eqn.solve(dt=1.e-3)
vi.plot()
感谢您的任何建议或更正。 如果您碰巧知道针对此类特定问题的好教程,我会很乐意阅读它,因为我没有找到比 FiPy 文档中的示例更好的东西。
【问题讨论】:
-
不清楚您要就什么问题寻求建议/更正?如果只是整体代码审查,我建议在codereview.stackexchange.com 发帖。
-
谢谢,没听说过。把它贴出来可能会更好。
-
有四个方程,但只有两个变量。变量的数量必须等于方程的数量才能有一个封闭的解决方案。