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

249ce308abbd80718a54dd84d7c0bea8.png

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

e55ae51dfb9e1e65025491948ac730bd.gif
正方形域内波反射图案

926bb08169a439cfbfecc450e55b324a.gif
矩形区域波反射图案

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

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

87324e62610283432aff503a826f1461.png

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

7762f650c007ee4c5c36401b2e731ada.png

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

5831b7ccb38df3471923d895937247b9.png

其中:

1239aa3163edd38fe5893e68891c3bef.png

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

ed2198567c0f9f55ac88a174ee3930ca.png

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

0980e15ff42555c7ba4ceb2062487b14.png

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

0e4bfe9e17ba2d9e6d12680d0f228bb8.png

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

d87e957c52bd5265791b47046d415838.png

528130e799b320f612c7f11a96a999c7.png

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

import 

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

e1ecff1ba669bf60aa615a6500afacb9.gif

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值