如何在 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.
我想知道如何表示第三个导数项:
在 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.