python解zuobiaoxi方程_Python数值计算----------二维波动方程有限差分解

python解zuobiaoxi方程_Python数值计算----------二维波动方程有限差分解_第1张图片

波动现象在生活中非常常见,比如你随便扔一颗石子到平静的湖面上,一圈圈的波纹图案就会出现。波动现象的控制方程为波动方程,下面不要眨眼,请欣赏美丽的波纹:

正方形域内波反射图案

矩形区域波反射图案

三角形区域(一条边为无反射边界)波反射图案

只要我们求解出波动方程我们就可以得到上面美丽的图案,那么什么是波动方程呢,二维的波动方程它大概长这个样子:

python解zuobiaoxi方程_Python数值计算----------二维波动方程有限差分解_第2张图片

这个方程可以描述薄膜的振动,可以理解为波在一个绷紧的弹性膜中的传播。学过数理方程的小伙伴可能可以手算出这个方程在矩形区域里面的解析解,但是我们今天不求解析解,我们利用有限差分法数值求解波动方程,这里采用的语言是Python,Python这个语言很友好,可以说通俗易懂。既然要用有限差分法对方程求解,第一步就是要把上述的偏微分方程离散为差分方程(这里采用的是三点差分格式):

python解zuobiaoxi方程_Python数值计算----------二维波动方程有限差分解_第3张图片

上述差分方程U的上标为时间标,下标为空间标。将上述的方程做一些化简:

python解zuobiaoxi方程_Python数值计算----------二维波动方程有限差分解_第4张图片

其中:

python解zuobiaoxi方程_Python数值计算----------二维波动方程有限差分解_第5张图片

这样k+1时间步的结果就可以通过k和k-1时间步的结果推进得到,这里会有一个很关键的地方,比如当前时间步是k=0,k-1=-1这个是不存在的,我们没有负的时间步,那该怎么办呢?这里利用我们的初始条件我们可以外插得到我们-1时间步的结果:

ed2198567c0f9f55ac88a174ee3930ca.png

v0为初始状态下弹性膜中每一点的速度。为了保证求解的收敛性,三点差分格式要求步长比小于等于1:

python解zuobiaoxi方程_Python数值计算----------二维波动方程有限差分解_第6张图片

这里有一个注意的地方,除了初始条件(定义t=0时弹性膜上每一点位移与速度)之外我们还需要边界条件,用来定义弹性膜边界在以后的每个时刻的状态,如下图红线圈出的点是位于边界处的点,边界上的的值是不需要求解的,可以用边界条件计算得出。

python解zuobiaoxi方程_Python数值计算----------二维波动方程有限差分解_第7张图片

下面我们求解一个2X2方形区域内的波动方程,边界条件与初始条件如下:

d87e957c52bd5265791b47046d415838.png

528130e799b320f612c7f11a96a999c7.png

下面我要放出代码了,说实话如果没有上面的推导,直接去看代码很多人估计看不懂,如果真的对偏微分方程的数值解有兴趣可以看看《偏微分方程的数值解》李荣华版,如果大家想要电子书的话可以私信我。

import 

下面就是见证奇迹的时刻:

差分方程的推导很简单,但是如果没有推导明白的很难理解上面的程序,如果有疑问的小伙伴可以私信我,想要《偏微分方程数值解》的小伙伴也可以私信我。

你可能感兴趣的:(python解zuobiaoxi方程_Python数值计算----------二维波动方程有限差分解)