波动现象在生活中非常常见,比如你随便扔一颗石子到平静的湖面上,一圈圈的波纹图案就会出现。波动现象的控制方程为波动方程,下面不要眨眼,请欣赏美丽的波纹:正方形域内波反射图案矩形区域波反射图案三角形区域(一条边为无反射边界)波反射图案
只要我们求解出波动方程我们就可以得到上面美丽的图案,那么什么是波动方程呢,二维的波动方程它大概长这个样子:
这个方程可以描述薄膜的振动,可以理解为波在一个绷紧的弹性膜中的传播。学过数理方程的小伙伴可能可以手算出这个方程在矩形区域里面的解析解,但是我们今天不求解析解,我们利用有限差分法数值求解波动方程,这里采用的语言是Python,Python这个语言很友好,可以说通俗易懂。既然要用有限差分法对方程求解,第一步就是要把上述的偏微分方程离散为差分方程(这里采用的是三点差分格式):
上述差分方程U的上标为时间标,下标为空间标。将上述的方程做一些化简:
其中:
这样k+1时间步的结果就可以通过k和k-1时间步的结果推进得到,这里会有一个很关键的地方,比如当前时间步是k=0,k-1=-1这个是不存在的,我们没有负的时间步,那该怎么办呢?这里利用我们的初始条件我们可以外插得到我们-1时间步的结果:
v0为初始状态下弹性膜中每一点的速度。为了保证求解的收敛性,三点差分格式要求步长比小于等于1:
这里有一个注意的地方,除了初始条件(定义t=0时弹性膜上每一点位移与速度)之外我们还需要边界条件,用来定义弹性膜边界在以后的每个时刻的状态,如下图红线圈出的点是位于边界处的点,边界上的