有限元分析【1】是一种数值求解微分方程组的方法。它最初起源于土木工程和航空航天的弹性和结构分析问题,现在被应用于包括材料形变、传热学、流体力学在内的各种工程问题。
【1】有限元分析(Finite Element Analysis,FEA)有时又被称作有限元方法(Finite Element Method,FEM),二者基本可以混用,微小的区别在于,FEM 侧重于整套理论而 FEA 侧重于应用 FEM 于具体工程问题。
为了快速了解有限元,我们组织了一个有限元讨论班。我们希望揭去有限元神秘的外衣,只需要几个十几分钟就能替代一学期的本科有限元介绍课程。我们选择了经典的 Jacob Fish 和 Ted Belytschko 的《A First Course in Finite Elements》作为教材。整个讨论班分为三个部分:一维问题的有限元、高维标量场的有限元、高维矢量场的有限元。我们会先讲一部分,然后做一个 “编程挑战”,用简单的 Python 代码确认我们理解的是对的。
有限元的具体操作如下。首先把问题的区域划分为很多子集,比如三角形(四面体)或者四边形(六面体),每个子集被称作 “元素”(element)。之后用一系列局域在这些子集上的函数展开微分方程的解,这个展开肯定是近似,不过我们有理由相信只要我们子集划分足够细密和合理,这个近似就足够好,这些局域在子集上的函数称为 “shape function”。于是一个微分方程就被简化为一个代数方程问题了,未知量是用 shape functions 展开的系数,而且当微分方程是线性的时,我们获得的代数方程也是线性的,或者说我们获得了一个线性方程组。只要解出这个线性方程组,我们就获得了原来微分方程的解的一个近似。
在这个过程中,我们需要先把原方程写为变分法的形式【2】,这在有限元方法中被称为 “弱形式”,而原来的方程就被称作 “强形式”。之后选择一些 shape functions 张成试探解并代入弱形式,你会开心地发现,你获得了一个线性方程组,只要调用一些成熟的解线性方程组的包就可以轻松获得结果。有限元讨论班 1 讨论了其中的具体操作,之后有限元讨论班 2 回顾了公式的推导,并且做了一个简单的 Python 实现。
【2】注意,只是变分法的形式,其内核仍然是朴素的,所以不了解变分法并不影响理解有限元。
有限元讨论班 1 和有限元讨论班 2 构成了第一部分,一维问题的有限元。有限元讨论班 3 和 有限元讨论班 4 将第一部分的知识推广到高维,有限元讨论班 5、有限元讨论班 7、有限元讨论班 8 是对应的编程挑战,它们一起构成了第二部分,高维标量场的有限元。那有限元讨论班 6 呢?它和有限元讨论班 9 一起属于第三部分,高维矢量场的有限元。由于有限元中涉及的矩阵都是稀疏矩阵,我们还另外讨论了一下 Python 中的稀疏矩阵。总结一下是
第一部分,一维问题的有限元:1(理论)、2(编程)
第二部分,高维标量场的有限元:3(理论)、4(理论)、5(编程)、7(编程推导的理论)、8(编程)
第三部分,高维矢量场的有限元:6(理论)、9(理论)、在做了(编程)
编外:Python 中的七种稀疏矩阵,应该用哪个?
我们这个讨论班是全息的,就是说这个课程的一部分就可以替代整体。比如
2 会回顾 1 的内容
4 会回顾 3
5 会回顾 3 和 4
7 很仔细地用 Python 推导了 3 和 4 中的公式(是的 Python 可以推公式)
9 会回顾 6
所以时间紧张的同学可以,1、2 择一,3、4 择一,只看 5 跳过 7、8,6、9 择一,便可大致了解有限元。
所有的视频都很短,我们尽力压缩到十几分钟。代码可以在 Github 搜索 FEMdemo 获得。希望我们的讨论班能帮助大家更好地理解有限元。