数值求解波动方程 [2]
周期边界条件
上一篇忘记说另外一个常用的边界条件了, 就是循环边界. 它对应着连续函数里的周期条件: , 其中
是周期. 在使用有限差分法截断计算区间时, 边界外部的点重新映射到计算区间内, 即
和
(julia 索引). 一般来说, 循环边界必定成对出现 (即波可以从两边穿过边界到达另一边), 但也可以实现波从一边穿过边界但另一边不能穿过. 下面是循环边界的实现例子:


数值求解的两个问题
在上图可以看到数值求解的一个问题. 上图使用的相速度 , 并且初值条件为
和
, 利用已知的一维波动方程的数学解 (见《数理方程》), 可以得出在无限空间里的特解为
, 即这是单个向右传播的波包.
观察上图, 除了一个向右传播的波包, 还有一个向左传播的比较毛糙的波包. 这是由离散化造成的, 由连续的初值条件离散化得到求解系统的初状态时就已经损失了一部分信息了. 通过增加网格精度 (即减少 ) 可以缓解这个情况, 但这意味着
也要一并减少以确保不会出现空间数值不稳定, 也就是计算成本会快速上升. 下图是使用两倍网格精度求相同条件的解:


使用数值求解还需要注意另外一样东西: 时间数值不稳定和高频分量. 在部分情况下, 不可以选择参数使得数值稳定, 那么这时候宁愿时间数值不稳定也不要空间数值不稳定.
继续以上面循环边界的情况为例, 比较波包宽度为 0.1 和 0.04 两种情况, 可以看到波包宽度为 0.04 的情况弥散现象更严重. 所以需要选择合适的精度以处理情景中的高频分量.

但就算选择参数恰好是数值稳定的, 也不代表就能很好地处理高频分量. 如下图所示, 当选择 时, 波包宽度为 0.04 的情况仍然会数值不稳定.


非均匀介质
在研究波的传播时肯定少不了对非均匀介质的研究. 在原波动方程里的相速度 为常数. 当在非均匀介质里, 相速度与空间位置有关, 表示为
, 那么相应的波动方程为
. 形式上与原波动方程相同, 但因为相速度与位置有关, 所以离散化后得到的系数也与位置有关, 那么离散化后得到
.
关于连续波动方程的反射/透射系数可以见专栏底部.

需要注意应该避免在任意位置上出现空间数值不稳定, 亦即 . 最后, 这种模型实现不适用于连续变化的介质, 当连续变化介质的相速度会被离散化为多层间断的相速度. 波会在间断的相速度处出现反射波 (上图所示), 但准确的连续变化介质是没有反射波的. 下图是一个连续变化介质的例子, 可以看到反射波随着时间越来越大, 这是极其错误的.


非均匀介质的一小点数学
因为《数理方程》里没有提到非均匀介质, 所以这里稍微小提一下.
假设无限空间里有两种介质在 处为界, 相速度由
给出. 其中
为常数. 假设有波在无穷远处从左往右传播, 那么有
, 如下:

原波动方程的特解为 , 其中
为频率,
为波数 (wave number), 并且有关系
. 当
时, 解表示为从左往右传播的波, 反之为从右往左, 那么
表示为:
其中 为待定系数.
在边界上, 应有 和
, 即
可以解得 和
, 其中
为相位部分, 不太重要. 可以由上面的示例进行验证:
下面是整个程序的代码, 比之前的也没改很多东西
