具有 Neumann 边界条件的 Scipy OdeInt 求解器

计算科学 pde Python 边界条件 scipy
2021-12-08 22:26:18

scipy.odeint用来解决Fisher-Kolmogorov方程:

ut=uxx+u(1u)

代码可以在这里找到。

从 Ablowitz 和 Zeppetella 我们知道解析解是:

u(x,t)=11+e(56t+6x6)2

现在,如果我们将解析解与使用 ODE 积分器获得的数值解进行比较,我们会得到以下结果:

在此处输入图像描述

红色:分析,蓝色:OdeInt

默认情况下scipy.odeint使用狄利克雷边界条件。

我想知道以下内容:

1) odeInt 应该使用什么样的边界条件来与解析解进行比较?

2)我应该如何使用 scipy.odeint 包含这些边界条件?

2个回答

从 Ablowitz 和 Zeppetella 我们知道解析解是:

u(x,t)=11+e(56t+6x6)2

通常,解析解需要施加边界条件。这个表达式的推导中有没有用到?如果是这样,在实施旨在复制此解析解的数值解时,您必须使用相同的边界条件。

默认情况下scipy.odeint使用狄利克雷边界条件。

我认为这里可能存在误解。在空间中对 PDE 进行半离散化后,边界条件由离散化而非 ODE 求解器强制执行。ODE 求解器需要初始条件,而不是边界条件。

我想知道以下内容:

1)我应该使用什么样的边界条件odeint来与解析解进行比较?

您应该使用用于推导解析解的相同边界条件。(往上看。)

2)我应该如何使用这些边界条件scipy.odeint

您应该通过离散化包含这些边界条件。有关如何执行此操作的示例,请参阅 LeVeque 的有限差分书(书籍网站)、Strikwerda 的有限差分书等。之前的 SciComp.StackExchange 问题涵盖了基础知识:

  • Dirichlet 边界条件相当于将表示边界点的方程的右侧设置为零,并在这些方程上设置初始条件以匹配连续体问题中边界条件的离散版本。
  • Neumann 边界条件相当于用(可能)修改的有限差分模板替换控制这些边界上的自由度的 ODE,以逼近导数。这些修改过的模板可以是单面的,也可以是与内部相同的模板,但使用鬼点。您应该查阅教科书(例如 LeVeque 或 Strikwerda)以了解详细信息。

至于 1),如果你想验证收敛顺序等,我首先将边界处的精确解的值规定为时间相关的 Dirichlet BC。也就是说,在边界处,使用作为 Dirichlet 值。请注意正确选择以匹配您正在计算的时间步长。这样,您可以验证内部离散化的收敛顺序,而不必担心 BC。xleftu(xleft,t)t

不幸的是,至于 2),我不知道如何在 scipy.odeint 中执行此操作,所以我无法帮助您。