数值求解波动方程 [3]
完美匹配层
之前提到的几种截断方式: Dirichlet 边界, Neumann 边界和循环边界, 这几种截断方式都有一个共同特征: 就是波会在边界处反射回来 (循环边界可以看作一边的波被"反射"到另一边). 但对于实际应用来说, 很多情况下要求边界不能产生反射, 以避免反射波对内部区域造成影响. 因为不存在反射波, 对于内部区域来说, 波好像消散在无限空间里.
有一种实现无反射"边界"的技术叫完美匹配层 (perfectly matched layer), 简称 PML. 准确来说这不是一个边界条件, 而是一个靠近边界的区域. 在对 PML 进行展开细说之前, 首先要对波动方程进行开刀.

引入一个新量 使得
, 代入波动方程方程
得
, 即
.
如此一元二阶微分方程 分解为二元一阶微分方程组
.
题外话: 可以记 , 则有
, 其中
是反厄米算符. 一般地, 如果一个方程可以写为
形式, 并且
为反厄米算符, 那么
就会产生 "类波" 解: 麦克斯韦方程组, 薛定谔方程, Lamé-Navier 方程都符合. 这也是为什么薛定谔方程又叫薛定谔波动方程, 有些人别整天揪着 "薛定谔波动方程" 不放了, 是薛定谔 "波动" 方程, 不是薛定谔 "波动方程".

PML 背后的思想就是变换坐标, 来看看变换坐标如何做到 "吸收" 波.
定义坐标变换 , 其中
. 当
时, 坐标变换为自身, 那么
的图像可以展示为

改变 后可以得到:

可以看到波在 的区域内呈指数下降, 如同波在这个区域内被 "吸收" 了一样. 实际上,
在施加坐标变换
得到
, 其中项
即表现为指数衰减.

当使用 PML 包围内部区域, 并且在 PML 外进行截断, 既然波在 PML 区域内呈指数衰减, 那么只要 PML 足够厚, 波在到达边界时可以变得足够小, 即使波在边界处被反射, 反射波也无法在内部区域产生足够大的影响.

PML 内使用的坐标变换称为 PML 变换. PML 变换与上面展示的坐标变换类似: 由 得到
. 在 PML 变换里记
, 但坐标变换为
, 引入频率
的原因是上面求得的衰减项
与波数
有关, 而频率和波数又有
, 也就是说衰减速度于频率成正比, 这会造成低频分量无法有效地被吸收. 在引入频率后对应的衰减项为
, 衰减速度与频率无关. 为了确保波在 PML 内总是衰减的, 应该有
.

下面以一维做例子, 二元一阶微分方程组版的一维波动方程为 . 初值条件
可以根据关系变为
.
计算过程以 为例: 在 PML 内有
和
, 即
. 施加 PML 变换
, 得到
, 然后得到
, 即
.
同理可得 . 在内部区域里, 应该有
, 这时 PML 版本波动方程退化为普通的波动方程, 而在 PML 区域内则有
.
这里选取 作为
的离散化也不会造成太大问题 (节省内存), 那么 PML 版波动方程离散化为
. 并且这种实现不存在数值稳定的参数选择, 最多只能做到较小的时间数值不稳定.

需要注意的是, 在连续波动方程里, PML 是无论 如何选取都是没有反射波的, 但离散化后则不是这样, 为了确保离散化后的 PML 仍然没有反射, 需要满足
具有连续的二阶或三阶导数.
这里介绍一个常用具有连续二阶导数的 : 以右边界为例, 假设
为 PML, 那么可以选取
, 其中
为
的最大值, 对于不同位置不同厚度的 PML 可以使用坐标变换把这个 σ 映射过去. 刚刚说过, 尽管 PML 可以快速吸收波, 但截断的边界仍会产生微小的反射波返回内部区域, 当选取 Dirichlet 或 Neumann 边值条件时, 反射波的相对大小由
给出, 其中
为 PML 的厚度. 那么 PML 系统如下图所示:


下面是实现的效果:

一般来说, s 应该选取 40~80, 这里选 30 只是为了直观地看到反射波. 选取太高的值可能会造成空间数值不稳定, 如下图所示


代码:
