Как вы повышаете CellVariables или ImplicitSourceTerms до уровня власти в FiPy?
С 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()
В соответствии с некоторым кодом, который я видел, я также пытался заменить CellVariables на ImplicitSourceTerm, но это выдает ошибку, поскольку передача 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 также дает ошибки.
1 ответ
В вашем первом решении нет ничего неправильного, за исключением того, что явные источники могут не сходиться так быстро, как неявные источники.
ImplicitSourceTerm
представляет некоторый коэффициент, умноженный на переменную, для которой решается проблема (коэффициент по умолчанию равен 0, что бесполезно, поэтому необходимо явно указать 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)
Затем вы должны использовать развертки.