最近在计算波动方程数值解时,发现网上很难找到比较详细实用的Matlab教程,所以我打算自己写一个,以一维弦的波动为例,从理论推导到代码实现,跟大家分享一下。
杜帅:一维波动方程数值解 Matlab 教程(从入门到出图)——1波动方程基本概念zhuanlan.zhihu.com前两篇已经讲了一维波动方程以及差分方法数值计算的基本知识,最后我们来看看如何用Matlab实现二阶偏微分方程的数值计算[1]:
一、一维波动方程的差分形式
微分方程
我们将自变量 x 和 t 离散化,分别均分为
和
份,步长分别为
和
,其中第 i 个 x 和 第 j 个 t 对应的位移为
根据二阶差商的写法,改写为差分形式
整理得
这样等号右边都是关于时间
和
的位移,只有左边是关于
的。
而对于位置
、
和
,初始条件里已经全部给出,所以只需要带入上式就可以循环计算出所有结果。
边界条件的差分形式
位移边界条件
即
应力边界条件
差分形式
即
二、Matlab程序实现
1、参数离散化
c
2、初始条件
我们设置初始位移 和初始速度均为零。
u = zeros(Nx, Nt);
3、循环计算
只需要从 j=2 开始循环时间,带入初始条件,计算下一时刻所有位置的位移。
其中二次差分可以利用Matlab的向量运算,避免再套循环。由于二次差分后少了两个元素,我们在两端补零即可,因为后边边界条件还会对两端进行修正,所以没有影响。
for
4、边界条件
上边代码中采用一端固定一端自由的边界条件。
若两端自由,可改为
u
若右端守恒力,可改为
u
5、图像显示
画出不同时刻的位移图,并存为动画
h
视频:
知乎视频www.zhihu.com教材推荐
高等应用数学问题的Matlab求解,豆瓣9.2分。
高等应用数学问题的MATLAB求解(豆瓣评分9.2)book.douban.com参考
- ^一维波动方程的数值解 http://wuli.wiki/online/W1dNum.html