![b194c25e8a5d4e407323aa9e2d31b1ac.png](https://img-blog.csdnimg.cn/img_convert/b194c25e8a5d4e407323aa9e2d31b1ac.png)
2.1 前言
承接上一篇文章,前面我们已经介绍了一维声波方程有限元求解:
蓝不是蓝:有限单元法(Finite Element Method)实现声波方程模拟(Part 1)zhuanlan.zhihu.com![c7417855aedd0c3a950e80020bef72a2.png](https://img-blog.csdnimg.cn/img_convert/c7417855aedd0c3a950e80020bef72a2.png)
这一部分将一维问题提升到二维问题。不知道大家有没有发现,在一维问题中,我们是通过矩阵相乘的方式来求解,得到的解
2.2 二维声波方程有限元求解
2.2.1 算法推导
对于二维声波方程,我们先写成一个简写形式:
![9cb43241696abf8124a9f04f5980e6e0.png](https://img-blog.csdnimg.cn/img_convert/9cb43241696abf8124a9f04f5980e6e0.png)
我们同样使用伽辽金(Galerkin )方法将该微分方程变成弱形式。并引入一个二维基函数
![60a6c02374f9d4d7c04db2ca48e5b2af.png](https://img-blog.csdnimg.cn/img_convert/60a6c02374f9d4d7c04db2ca48e5b2af.png)
对上式关于空间项的积分使用分部积分法则:
![f056d4146623a7905a6bd556309d6b5d.png](https://img-blog.csdnimg.cn/img_convert/f056d4146623a7905a6bd556309d6b5d.png)
将上式代入公式(14)后得到:
![3de8c653e2cf001701bf1fc38931c425.png](https://img-blog.csdnimg.cn/img_convert/3de8c653e2cf001701bf1fc38931c425.png)
这里我们仍然使用一维情况下类似的边界条件:
![a14bf4f51536530a47c5c5c196561492.png](https://img-blog.csdnimg.cn/img_convert/a14bf4f51536530a47c5c5c196561492.png)
消掉边界条件这一项后,再利用基函数插值近似我们的解(
![0e60a73eec99b7e74645ad4ac30af720.png](https://img-blog.csdnimg.cn/img_convert/0e60a73eec99b7e74645ad4ac30af720.png)
最终得到的公式为:
![c135b5e5cc6e97dd9fa8fd56ea236276.png](https://img-blog.csdnimg.cn/img_convert/c135b5e5cc6e97dd9fa8fd56ea236276.png)
时间项我们采用二阶差分格式,则上式的隐式差分格式为:
![286a475de021f9c72e06bc720505db23.png](https://img-blog.csdnimg.cn/img_convert/286a475de021f9c72e06bc720505db23.png)
简写成矩阵形式:
![85df21998a1c372729b757fc06cfa6fa.png](https://img-blog.csdnimg.cn/img_convert/85df21998a1c372729b757fc06cfa6fa.png)
同样的,简写成矩阵形式的显式差分格式为:
![02571b9d4b6ca7cab71b0ea008f715b2.png](https://img-blog.csdnimg.cn/img_convert/02571b9d4b6ca7cab71b0ea008f715b2.png)
其中的质量矩阵
![58c4f9824344d14b3761c4835ae900f8.png](https://img-blog.csdnimg.cn/img_convert/58c4f9824344d14b3761c4835ae900f8.png)
那么,我们先利用公式(21)和(22)求出
2.2.2 网格剖面
在这里我们使用三角形单元构建一个非结构化网格,事实上如果让我们自己来构建一个很复杂的非结构化网格是比较费力的,我们可以使用MATLAB自带的网格生成函数来帮助我们完成网格生成。
这部分代码为:
function [p,e,t] = unstructured()
[p, e, t] = initmesh('squareg', 'hmax', 0.08);%单元初始化
[p,e,t] = refinemesh('squareg',p,e,t);%单元加密
end
其中
返回值 | 含义 |
---|---|
p | 在点矩阵p中,第一行和第二行包含网格中节点编号对应的x和y坐标。 |
e | 在边界矩阵e中,第一行和第二行包含每一段边界起始点和结束点的索引,第三和第四行包含起始和结束参数值,第五行包含边界段编号,第六和第七行包含左侧和右侧子域编号。 |
t | 在三角形单元矩阵t中,前三行包含三角形三个角点的索引,按逆时针顺序给出,第四行包含子域编号。 |
上述代码生成的网格为:
![a0e783445e6638c380cba92c466bce1d.png](https://img-blog.csdnimg.cn/img_convert/a0e783445e6638c380cba92c466bce1d.png)