昨天查文献的时候,某一篇文献在和我干的事情毫无关系的部分提到了这个方法。我想到暑研的时候,一位博后给我科普的有限元分析和这看起来很像,所以决定看一眼。看上去,这确实是一个适合“工业化”的求微分方程数值解的办法。这东西在英文里头叫做 Galerkin method,但是显然有一个 e 的转写丢失了关于发音的信息。
以一个例子来说明:泊松方程写作
−∇2u~=f on Ωu~=0 on ∂Ω
为了 解它,我们取定一个N维的空间X0N,其基底是一些函数{ϕi},其中任意的函数v,w满足(具体的缘由我没有细究。这里并不是非常简单。)∫Ωv2dV<∞,v=0 on ∂Ω 和 ∫Ω∇v∇wdV<∞ (这是最为常见的一种)。
这样的目的是用这些基底表示出解来。N取得越大,就越能够逼近正确的解。显然,对于解u来说,一个本来应当是0的东西肯定需要和所有的基底函数垂直:
∫Ω(−∇2u−f)vdV=0 for ∀v in X0N
分部积分之后,考虑到v在边界上是0这个性质,可以得到
∫Ω∇u∇vdV=∫ΩvfdV
(值得注意的是,使用一种内积a(r,s)=∫Ω∇r∇sdV,会发现误差u~−u是和空间X0N垂直的。这侧面说明了这个方法的合理性。)
然后将u,v表示出来,写成
∫Ω∇(∑ϕiui)∇(∑ϕjvj)dV=∫Ω∑ϕivi⋅fdV
或者说
∑∑∫Ωui∇ϕi∇ϕjvjdV=∫Ω∑ϕivi⋅fdV
记矩阵Aij=∫Ω∇ϕi∇ϕjdV, 向量bi=∫ΩϕifdV
上式就是
vTAu=vTb或Au=b
实际操作中,有两种选取ϕ的方式,叫nodal和modal,顾名思义,(格)点和(波)模。前者就是把空间划分为格点{xi}并令u(xi)=ui或者说ϕj(xi)=δij。这种东西一看就很容易满足在边界处为0的条件。一般来说,有Lagrangian Polynomial这样全局都有值的做法,也有有限元中使用格点附近的线性函数(而在其他地方都是0)的做法。波模的例子比如一维正弦波。