使用FiPy(Python库)我想解决下面显示的pdes系统的耦合问题。下面的代码有效,但没有给出正确的解决方案。
p, q, r, s = 2, 1, 2, 0
Du, Dv = 0.0004, 0.04
mesh = Grid1D(nx=500, Lx=5.)
U = CellVariable(name = 'U',mesh=mesh, hasOld=True, value=1.)
V = CellVariable(name = 'V',mesh=mesh, hasOld=True, value=2.)
eqU = TransientTerm(var=U) == DiffusionTerm(coeff=Du, var=U) - U + (U**p)/(V**q)
eqV = TransientTerm(var=V) == DiffusionTerm(coeff=Dv, var=V) - V + (U**r)/(V**s)
viewerV = Viewer(vars=V)
viewerU = Viewer(vars=U)
timeStepDuration = 0.1
steps = 1000
eqn = eqU & eqV
for t in range(500):
U.updateOld()
V.updateOld()
eqn.solve(dt=1.e-3)
viewerV.plot()
viewerU.plot()
根据我看到的一些代码,我也尝试用ImplicitSourceTerm替换CellVariables,但这会产生错误,因为将ImplicitSourceTerm作为幂p不能以这种方式完成。 但是,我找不到任何关于如何完成的文档:
eqU = TransientTerm(var=U) == DiffusionTerm(coeff=Du, var=U) - ImplicitSourceTerm(var=U) + ((ImplicitSourceTerm(var=U)**p)/(ImplicitSourceTerm(var=V)**q))
eqV = TransientTerm(var=V) == DiffusionTerm(coeff=Dv, var=V) - ImplicitSourceTerm(var=V) + ((ImplicitSourceTerm(var=U)**r)/(ImplicitSourceTerm(var=V)**s))
尝试提高U.value ** p也会出错。
答案 0 :(得分:0)
你的第一个解决方案没有任何本质上的错误,除了明确的来源可能不会像隐式来源那样迅速收敛。
ImplicitSourceTerm
表示要解决的变量的一些系数乘以(默认系数为0,which is useless,因此您必须明确说明coeff=1.
)。
您的条款可以表示为
eqU = TransientTerm(var=U) == DiffusionTerm(coeff=Du, var=U) - ImplicitSourceTerm(var=U, coeff=1.) + ImplicitSourceTerm(var=U, coeff=(U**(p-1))/V**q)
eqV = TransientTerm(var=V) == DiffusionTerm(coeff=Dv, var=V) - ImplicitSourceTerm(var=V, coeff=1.) + ImplicitSourceTerm(var=U, coeff=(U**(r-1))/V**s)
然后你应该使用扫描。