我想知道如何表示第三个导数:
在 Fipy python 中。我知道扩散项表示为
DiffusionTerm(coeff=D)
和高阶扩散项为
DiffusionTerm(coeff=(Gamma1, Gamma2))
但是想不出一种方法来表示这个第三个导数。谢谢
向量 v 是根据(标量)解变量定义的吗?如果没有,只需明确地写下术语:
v.divergence.faceGrad.divergence
如果 v 是解变量的函数(例如 \phi),那么就没有机制可以像高阶扩散那样做到这一点,但实际上不需要(也不需要高阶扩散)。将您的方程拆分为两个二阶 PDE 并将它们耦合:
\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 方程的信息,添加了注释]:
虽然严格来说它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或hp-FEM。