Galjorkin方法简介

昨天查文献的时候,某一篇文献在和我干的事情毫无关系的部分提到了这个方法。我想到暑研的时候,一位博后给我科普的有限元分析和这看起来很像,所以决定看一眼。看上去,这确实是一个适合“工业化”的求微分方程数值解的办法。这东西在英文里头叫做 Galerkin method,但是显然有一个 e 的转写丢失了关于发音的信息。

以一个例子来说明:泊松方程写作

2u~=f on Ω-\nabla^2\tilde{u}=f\ on \ \Omega

u~=0 on Ω\tilde{u} = 0\ on\ \partial \Omega

为了 解它,我们取定一个N维的空间X0NX_0^N,其基底是一些函数{ϕi}\left\{\phi_i\right\},其中任意的函数v,wv ,w满足(具体的缘由我没有细究。这里并不是非常简单。)Ωv2dV<,v=0 on Ω\int_\Omega v^2dV<\infty, v=0 \ on\ \partial\OmegaΩvwdV<\int_\Omega \nabla v\nabla wdV<\infty (这是最为常见的一种)。

这样的目的是用这些基底表示出解来。N取得越大,就越能够逼近正确的解。显然,对于解uu来说,一个本来应当是0的东西肯定需要和所有的基底函数垂直:

Ω(2uf)vdV=0 for v in X0N\int_\Omega (-\nabla^2 u-f)vdV=0\ for\ \forall v\ in\ X_0^N

分部积分之后,考虑到v在边界上是0这个性质,可以得到

ΩuvdV=ΩvfdV\int_\Omega \nabla u\nabla vdV=\int_\Omega vfdV

(值得注意的是,使用一种内积a(r,s)=ΩrsdVa(r, s)=\int_\Omega\nabla r\nabla sdV,会发现误差u~u\tilde{u}-u是和空间X0NX_0^N垂直的。这侧面说明了这个方法的合理性。)

然后将u,vu, v表示出来,写成

Ω(ϕiui)(ϕjvj)dV=ΩϕivifdV\int_\Omega \nabla(\sum\phi_iu_i)\nabla(\sum\phi_jv_j)dV=\int_\Omega\sum\phi_iv_i\cdot fdV

或者说

ΩuiϕiϕjvjdV=ΩϕivifdV\sum\sum\int_{\Omega}u_i\nabla \phi_i\nabla\phi_jv_jdV=\int_\Omega\sum\phi_iv_i\cdot fdV

记矩阵Aij=ΩϕiϕjdVA_{ij}=\int_\Omega\nabla\phi_i\nabla\phi_jdV, 向量bi=ΩϕifdVb_i=\int_\Omega\phi_ifdV

上式就是

vTAu=vTbv^TAu=v^TbAu=bAu=b

实际操作中,有两种选取ϕ\phi的方式,叫nodal和modal,顾名思义,(格)点和(波)模。前者就是把空间划分为格点{xi}\left\{x_i\right\}并令u(xi)=uiu(x_i)=u_i或者说ϕj(xi)=δij\phi_j(x_i)=\delta_{ij}。这种东西一看就很容易满足在边界处为0的条件。一般来说,有Lagrangian Polynomial这样全局都有值的做法,也有有限元中使用格点附近的线性函数(而在其他地方都是0)的做法。波模的例子比如一维正弦波。