如何在 Fipy 中表示三阶导数

How to represent third order derivative in Fipy

我想知道如何表示第三个导数项:

在 Fipy 中 python。我知道扩散项表示为

DiffusionTerm(coeff=D)

和更高阶扩散项

DiffusionTerm(coeff=(Gamma1, Gamma2))

但是想不出一种方法来表示这个三阶导数。谢谢

向量 v 是根据(标量)解变量定义的吗?如果没有,就直接写出术语:

v.divergence.faceGrad.divergence

如果 v 是解变量(比如 \phi)的函数,则没有像高阶扩散那样的机制来执行此操作,但确实没有必要(也没有必要用于高阶扩散)。将方程拆分为两个二阶偏微分方程并将它们耦合:

\partial \phi / \partial t = \nabla^2 \nabla\cdot\vec{v}

可以改写为

\partial \phi / \partial t = \nabla^2 \psi \
\psi = \nabla\cdot\vec{v}

这将是

TransientTerm(var=phi) == DiffusionTerm(var=psi)
ImplicitSourceTerm(var=psi) == ConvectionTerm(coeff=v, var=???)

我需要更多地了解 v 和你的全套方程式,以便进一步建议 ConvectionTerm 应该是什么样子。

[鉴于这些术语来自 Korteweg-de Vries equation] 的信息添加的注释:

虽然 not strictly true v 不是 KdV 方程中某些 phi 的函数,但仍然无法将 \partial^3 v / \partial x^3 项转换成 FiPy 可以轻松使用的形式。如果 v 是标量,则 \partial^3 v / \partial x^3 是向量。如果 v 是矢量,则 \partial^3 v / \partial x^3 是标量或张量。除非你用单位向量点它,否则无法使这个术语的等级与其他术语一致,在这种情况下,它只是一些没有有效隐式表示的来源。

归根结底,一维方程总是具有误导性。了解什么是标量和什么是矢量至关重要。 FiPy 作为一种有限体积代码,在求解时应用散度定理,因此有必要知道何时处理通量的散度(FiPy 可以隐式处理)或只是一些随机偏导数(它不能)。

看了KdV方程的推导,长波逼近和变量代入太多了,矢量微积分的痕迹都丢掉了。因此,这不是 FiPy 具有有效形式的 PDE。你可以写成v.faceGrad.divergence.grad.dot([[1]]),FiPy应该接受这个,但是它不会很有效地解决。

此外,由于 KdV 方程是关于波传播的并且本质上是双曲线的,因此 FiPy 确实不太适合(FiPy 的底层算法通常需要一些扩散元素才能收敛)。你可以看看 Clawpack or hp-FEM.