0

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

在此处输入图像描述

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

DiffusionTerm(coeff=D)

和高阶扩散项为

DiffusionTerm(coeff=(Gamma1, Gamma2))

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

4

1 回答 1

2

向量 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 底层算法通常需要一些扩散元素才能收敛)。你可以看看Clawpackhp-FEM

于 2019-09-04T17:10:58.513 回答