Skip to main content

椭圆型方程的有限元解法

第六章中把几种典型的微分方程边值问题(包括不同类型的边界条件)化成了等价的变分问题或求泛函的极值问题,并介绍了用 Ritz - Galerkin 方法求解的思想和过程。但正如在最后一节中所指出的,这个方法存在着坐标函数选取技术、计算量大等缺点,因而不能获得广泛的使用。 数学在当代由工程技术人员发展起来,并在 60 年代末 70 年代初由数学家奠定严格的数学基础的有限元方法是克服上述困难的一种行之有效的计算方法,目前它已在结构力学、弹性力学、流体力学等方面得到了极大范围的使用。 本章将介绍用有限元方法求解椭圆型方程的一些基本思想、方法和过程,限于篇幅,本书将不涉及抛物型方程和双曲型方程的有限元解法,它们的基本思路是类似的。 本章中将用字母CC(可带足标)来表示正常数,这些常数不依赖问题的真解、近似解和hhhh是与空间剖分有关的一个量),并且有时用同一个CC(带或不带足标)在不同的场合代表不同的常数,请读者阅读时加以注意。

基于变分问题的有限元方法

这里以问题

{ddx(pdudx)+ru=f,xI,u(0)=0,du(1)dx+au(1)=0(7.1)\begin{cases} -\frac{d}{dx}\left(p\frac{du}{dx}\right) + ru = f, & x \in I, \\ u(0) = 0, \quad \frac{du(1)}{dx} + au(1) = 0 \end{cases} \tag{7.1}

为例,介绍如何用有限元法求两点边值问题的近似解。

用有限元方法找问题(7.1)(7.1)的近似解的过程可以分为六步。

Step1:将数学物理问题化为等价的变分问题。这一步已由第六章解决了,这里不再重复。为方便起见,将与问题(7.1)(7.1)对应的变分问题再抄录一遍:

QE1(Iˉ)Q_E^1(\bar{I})中找一个函数uu^*,使满足:

a(u,v)=f(v),vQE1(Iˉ),(7.2)a(u^*, v) = f(v), \quad \forall v \in Q_E^1(\bar{I}),\tag{7.2}

其中

Iˉ=[0,1];\bar{I} = [0, 1]; a(u,v)=01[pdudxdvdx+ruv]dx+p(1)au(1)v(1);(7.3)a(u, v) = \int_0^1 \left[p\frac{du}{dx}\frac{dv}{dx} + ru v\right]dx + p(1)au(1)v(1);\tag{7.3} f(v)=01fvdx;(7.4)f(v) = \int_0^1 fv dx;\tag{7.4} QE1(Iˉ)={uuQ1(Iˉ),u(0)=0}.(7.5)Q_E^1(\bar{I}) = \{u \mid u \in Q^1(\bar{I}), u(0) = 0\}. \tag{7.5}

关于Q1(Iˉ)Q^1(\bar{I})的定义见第六章,而函数p,r,fp, r, f和常数aa满足定理 6.1 的条件,可知解是存在的,但不属于本书讨论范围。

第二步,对求解区域进行剖分。

问题(7.1)(7.1)是在区间Iˉ=[0,1]\bar{I} = [0, 1]上求解,因而对区间的剖分是简单的。用II中满足:

0=x0<x1<x2<<xn<xn+1=10 = x_0 < x_1 < x_2 < \cdots < x_n < x_{n+1} = 1

nn个结点xi(i=1,2,,n)x_i(i = 1, 2, \cdots, n)将区间II分割成n+1n + 1个互不包含的子区间:

Ii=[xi1,xi](i=1,2,,n+1),I_i = [x_{i-1}, x_i] \quad (i = 1, 2, \cdots, n + 1),

每一个IiI_i称为单元。记

hi=xixi1(i=1,2,,n+1),h_i = x_i - x_{i-1} \quad (i = 1, 2, \cdots, n + 1),

并记

h=max1in+1hi.h = max_{1\le i \le n+1} h_i.

Step3:形成单元上的形状函数。

通常将单元上的形状函数取为多项式。

我们知道,一个单变量的kk次多项式需k+1k + 1个条件才能确定,所以,要将II中的n+1n + 1个单元上的形状函数都确定,需要(n+1)(k+1)(n + 1)(k + 1)个条件。特别地,当选取的形状函数为线性函数,即为一次多项式时,共需要2(n+1)2(n + 1)个条件。

Step4:由形状函数构成试探函数空间VhV_h

试探函数空间VhV_h应满足如下要求:

  • (i) 问题(7.1)(7.1)(即变分问题(7.2)(7.2))的近似解uhu_h将在VhV_h中寻找。
  • (ii) 把VhV_h中的任一个函数uhu_h限制在IiI_i(i=1,2,,n+1i = 1, 2, \cdots, n + 1)上时,它是IiI_i上的一个形状函数。
  • (iii) VhV_h中的函数应满足一定的光滑性,至少应对任何函数uh,vhVhu_h, v_h \in V_h,a(uh,vh)a(u_h, v_h)f(vh)f(v_h)有意义。例如,取VhV_hC01C_0^1的一个子空间(光滑性的要求也可以提得更高一些,但此时将造成构造上的困难)。

对问题(7.1)(7.1),可根据以上要求构造试探函数空间:Vh={uhuhC1(Iˉ),uh限制在Ii上是k次多项式,uh(0)=0}V_h = \{u_h | u_h \in C^1(\bar{I}), u_h 限制在I_i上是k次多项式, u_h(0) = 0\}。要唯一确定VhV_h中的一个函数需要设置(n+1)(k+1)(n + 1)(k + 1)个条件。由于uhC1(Iˉ)u_h \in C^1(\bar{I}),即uhu_hx=xix = x_i处连续(i=1,2,,ni = 1, 2, \cdots, n)且uh(0)=0u_h(0) = 0,这共有n+1n + 1个限制条件,所以总共需设置(n+1)(k+1)n=(n+1)k+1(n + 1)(k + 1) - n = (n + 1)k + 1个条件,当k=1k = 1时,需要设置n+2n + 2个条件。

由于剖分时共设置了n+2n + 2个结点x0,x1,,xn,xn+1x_0, x_1, \cdots, x_n, x_{n+1},除了uh(x0)=0u_h(x_0) = 0外,还留下了n+1n + 1个结点x1,x2,,xn,xn+1x_1, x_2, \cdots, x_n, x_{n+1},当k=1k = 1时,这些结点的个数与需设置的条件个数正好相等,因此很自然地会想到,把所要设置的条件放到结点x=xix = x_i(i=1,2,,n+1i = 1, 2, \cdots, n + 1)上。

定理 7.1uh(x)u_h(x)Vh(1)V_h^{(1)}上的一个函数,那么uh=uh(x)u_h = u_h(x)Vh(1)V_h^{(1)}中存在唯一函数uh(x)u_h(x),满足: uh(xi)=ui(i=1,2,,n+1),u_h(x_i) = u_i \quad (i = 1, 2, \cdots, n + 1), 反之,给定了n+1n + 1个数{ui}i=1n+1\{u_i\}_{i=1}^{n+1},

uh(x)={u1xh1,x[0,x1],ui1xixhi+uixxi1hi,x[xi1,xi],i=2,3,,n+1,(7.7)u_h(x) = \begin{cases} u_1 \frac{x}{h_1}, & x \in [0, x_1], \\ u_{i-1} \frac{x_i - x}{h_i} + u_i \frac{x - x_{i-1}}{h_i}, & x \in [x_{i-1}, x_i], \quad i = 2, 3, \cdots, n + 1, \\ \end{cases} \tag{7.7}

显然,uh(x)Vh(1)u_h(x) \in V_h^{(1)},且uh(x)u_h(x)的唯一性也是显然的。

图 7.1 是相应(7.7)(7.7)式的函数图形。

定理 7.1 说明Vh(1)V_h^{(1)}中的函数全体{uh}\{u_h\}n+1n + 1维 Euclid 空间中的点全体{(u1,u2,,un+1)}\{(u_1, u_2, \cdots, u_{n+1})\}构成一个一一对应,因此Vh(1)V_h^{(1)}也是一个n+1n + 1维线性空间。

Vh(1)V_h^{(1)}中与{ei}i=1n+1\{e_i\}_{i=1}^{n+1}对应的一组基为{φi}i=1n+1\{\varphi_i\}_{i=1}^{n+1}(这里eie_iRn+1\mathbb{R}^{n+1}中的自然基,即ei=(0,0,,0,1,0,0,,0)e_i = (0, 0, \cdots, 0, 1, 0, 0, \cdots, 0),i=1,2,,ni = 1, 2, \cdots, n),按照(7.7)(7.7)式的对应关系,即有

φi(x)={xxi1hi,x[xi1,xi],xi+1xhi+1,x[xi,xi+1],0,在别处;(7.6)\varphi_i(x) = \begin{cases} \frac{x - x_{i-1}}{h_i}, & x \in [x_{i-1}, x_i], \\ \frac{x_{i+1} - x}{h_{i+1}}, & x \in [x_i, x_{i+1}], \\ 0, & \text{在别处}; \end{cases} \tag{7.6}

uh(x)=ui.u_h(x) = u_i.

证明 定理前半部分是显然的。

根据(7.6)(7.6)式,构造函数如下:

uh(x)={u1xh1,x[0,x1],ui1xixhi+uixxi1hi,x[xi1,xi],i=2,3,,n+1,(7.7)u_h(x) = \begin{cases} u_1 \frac{x}{h_1}, & x \in [0, x_1], \\ u_{i-1} \frac{x_i - x}{h_i} + u_i \frac{x - x_{i-1}}{h_i}, & x \in [x_{i-1}, x_i], \quad i = 2, 3, \cdots, n + 1, \\ \end{cases} \tag{7.7}

图 7.1 是相应(7.7)(7.7)式的函数图形。

图 7.1 是相应(7.7)(7.7)式的函数图形。

定理 7.1 说明 Vh(1)V_h^{(1)} 中的函数全体 {uh}\{u_h\}n+1n + 1 维 Euclid 空间中的点全体 {(u1,u2,,un+1)T}\{(u_1, u_2, \cdots, u_{n+1})^T\} 构成一个一一对应,因此 Vh(1)V_h^{(1)} 也是一个 n+1n + 1 维线性空间。

Vh(1)V_h^{(1)} 中与 {ei}i=1n+1\{e_i\}_{i=1}^{n+1} 对应的一组基为 {φi}i=1n+1\{\varphi_i\}_{i=1}^{n+1},这里 {ei}\{e_i\}Rn+1\mathbb{R}^{n+1} 中的自然基,即 ei=(0,0,,0i1,1,0,0,,0)Te_i = (\underbrace{0, 0, \cdots, 0}_{i-1个}, 1, 0, 0, \cdots, 0)^T,按照 (7.7) 式的对应关系,即有 (i=1,2,,n)(i = 1, 2, \cdots, n)

φi(x)={xxi1hi,x[xi1,xi],xi+1xhi+1,x[xi,xi+1],0,在别处;\varphi_i(x) = \begin{cases} \frac{x - x_{i-1}}{h_i}, & x \in [x_{i-1}, x_i], \\ \frac{x_{i+1} - x}{h_{i+1}}, & x \in [x_i, x_{i+1}], \\ 0, & \text{在别处}; \end{cases} φn+1(x)={xxnhn+1,x[xn,xn+1],0,在别处。\varphi_{n+1}(x) = \begin{cases} \frac{x - x_n}{h_{n+1}}, & x \in [x_n, x_{n+1}], \\ 0, & \text{在别处}。 \end{cases}

这组基中每一个基函数的形状由图 7.2 给出。

图 7.2 Vh(1)V_h^{(1)}中与{ei}i=1n+1\{e_i\}_{i=1}^{n+1}对应的基函数φi(x)\varphi_i(x)1in1 \leq i \leq n)的形状

于是满足(7.9)式的函数uhu_h可以用这组基表示为

uh(x)=i=1n+1uiφi(x)u_h(x) = \sum_{i=1}^{n+1} u_i \varphi_i(x)。

Step5:导出有限元方程。

根据(7.2)式确定uu^*一般说来是做不到的,因为此时其自由度数个数等于无穷大。有了试探函数空间VhV_h,就可以用一个近似问题代替原来的变分问题PP

变分问题PhP_h:在Vh(1)V_h^{(1)}中找一个uhu_h^*,使满足:

a(uh,vh)=f(vh),vhVh(1)(7.8)a(u_h^*, v_h) = f(v_h), \quad \forall v_h \in V_h^{(1)}。 \tag{7.8}

由变分问题PhP_h找到的解uhu_h^*称为变分问题PP(也即问题(7.1))在空间Vh(1)V_h^{(1)}中的近似解。

下面我们讨论k=1k = 1的情况。

显然,(7.8)式等价于

a(uh,φj)=f(φj),j=1,2,,n+1(7.9)a(u_h^*, \varphi_j) = f(\varphi_j), \quad j = 1, 2, \cdots, n + 1。 \tag{7.9}

uhu_h^*表示uh(x)u_h^*(x),便有

uh=i=1n+1uiφi(x)(7.10)u_h^* = \sum_{i=1}^{n+1} u_i^* \varphi_i(x)。 \tag{7.10}

代入(7.9)式,得到

i=1n+1a(φi,φj)ui=f(φj),j=1,2,,n+1,\sum_{i=1}^{n+1} a(\varphi_i, \varphi_j) u_i^* = f(\varphi_j), \quad j = 1, 2, \cdots, n + 1,

或写成矩阵形式:

Au=f,(7.11)A u^* = f, \tag{7.11}

这里

A=(a(φi,φj))(n+1)×(n+1),A = (a(\varphi_i, \varphi_j))_{(n+1) \times (n+1)}, u=(u1,u2,,un+1)T,u^* = (u_1^*, u_2^*, \cdots, u_{n+1}^*)^T, f=(f(φ1),f(φ2),,f(φn+1))Tf = (f(\varphi_1), f(\varphi_2), \cdots, f(\varphi_{n+1}))^T。

由(7.3)式和(7.4)式,有

a(φi,φj)=01[pdφidxdφjdx+rφiφj]dx+p(1)aφi(1)φj(1),(7.12)a(\varphi_i, \varphi_j) = \int_0^1 \left[p \frac{d\varphi_i}{dx} \frac{d\varphi_j}{dx} + r \varphi_i \varphi_j\right] dx + p(1) a \varphi_i(1) \varphi_j(1), \tag{7.12} f(φj)=01fφjdx(7.13)f(\varphi_j) = \int_0^1 f \varphi_j dx。 \tag{7.13}

初看起来,由(7.11)式、(7.12)式、(7.13)式决定的线性方程组的形式与 Ritz-Galerkin 方法得到的完全一样,但实际上它们之间的差别非常大。由φi(x)\varphi_i(x)的表达式易知:

{φiφj=0,ij>1,\begin{cases} \varphi_i \varphi_j = 0, \\ \text{当}|i - j| > 1, \end{cases}

因此a(φi,φj)=0(ij>1)a(\varphi_i, \varphi_j) = 0 (|i - j| > 1)。也就是说,(7.11)式中的系数矩阵AA是一个对称三对角矩阵,形成AA只需要计算2n+12n + 1a(φi,φj)a(\varphi_i, \varphi_j),所以比 Ritz 法大大地减少了工作量。

由于φj\varphi_j不为零的区间仅为[xj1,xj][x_{j-1}, x_j](当j=i1j = i - 1时)或 [xi1,xi+1][x_{i-1}, x_{i+1}](当j=ij = i时),而且φj(1)=0\varphi_j(1) = 0jn+1\forall j \neq n + 1),因此(7.12)、(7.13)式可写成

a(φi,φi1)=1hixi1xi[p(x)+r(x)(xxi1)(xxi)]dx,i=2,3,,n+1;(7.14)a(\varphi_i, \varphi_{i-1}) = \frac{1}{h_i} \int_{x_{i-1}}^{x_i} \left[-p(x) + r(x)(x - x_{i-1})(x - x_i)\right] dx, \quad i = 2, 3, \cdots, n + 1; \tag{7.14} f(φi)=xi1xif(x)xxi1hidx+xixi+1f(x)xi+1xhi+1dx,i=1,2,,n;(7.15)f(\varphi_i) = \int_{x_{i-1}}^{x_i} f(x) \frac{x - x_{i-1}}{h_i} dx + \int_{x_i}^{x_{i+1}} f(x) \frac{x_{i+1} - x}{h_{i+1}} dx, \quad i = 1, 2, \cdots, n; \tag{7.15} f(φn+1)=xnxn+1f(x)xxnhn+1dx;f(\varphi_{n+1}) = \int_{x_n}^{x_{n+1}} f(x) \frac{x - x_n}{h_{n+1}} dx; a(φi,φi)=1hi1xi1xi[p(x)+r(x)(xxi1)2]dx+1hixixi+1[p(x)+r(x)(xi+1x)2]dx,i=1,2,,n;(7.16)a(\varphi_i, \varphi_i) = \frac{1}{h_{i-1}} \int_{x_{i-1}}^{x_i} \left[p(x) + r(x)(x - x_{i-1})^2\right] dx + \frac{1}{h_i} \int_{x_i}^{x_{i+1}} \left[p(x) + r(x)(x_{i+1} - x)^2\right] dx, \quad i = 1, 2, \cdots, n; \tag{7.16} a(φn+1,φn+1)=1hn+1xnxn+1[p(x)+r(x)(xxn)2]dx+p(1)aa(\varphi_{n+1}, \varphi_{n+1}) = \frac{1}{h_{n+1}} \int_{x_n}^{x_{n+1}} \left[p(x) + r(x)(x - x_n)^2\right] dx + p(1)a。

一般说来,要精确得到公式(7.14)~(7.16)所确定的a(φi,φj)a(\varphi_i, \varphi_j)f(φj)f(\varphi_j)是不可能的,必须对它们采用数值积分的方法。从(7.14)~(7.16)式可以看到,对不同的iijj,所对应的积分区间是不同的,这样的表达形式不利于数值积分公式的使用,下面要把它们转化到同一个区间上去积分。

仿射变换

ξ=xxi1hi(7.17)\xi = \frac{x - x_{i-1}}{h_i} \tag{7.17}

将区间[xi1,xi][x_{i-1}, x_i]映照成[0,1][0, 1]。对(7.14)~(7.16)式利用(7.17)式便得到实际使用的公式:

a(φi,φi1)=01[p(xi1+hiξ)hi+hi2r(xi1+hiξ)ξ(1ξ)]dξ,i=2,3,,n+1;(7.18)a(\varphi_i, \varphi_{i-1}) = \int_0^1 \left[-\frac{p(x_{i-1} + h_i \xi)}{h_i} + h_i^2 r(x_{i-1} + h_i \xi)\xi(1 - \xi)\right] d\xi, \quad i = 2, 3, \cdots, n + 1; \tag{7.18} f(φi)=01f(xi1+hiξ)hiξdξ+01f(xi+hi+1ξ)hi+1(1ξ)dξ,i=1,2,,n;(7.19)f(\varphi_i) = \int_0^1 f(x_{i-1} + h_i \xi)h_i \xi d\xi + \int_0^1 f(x_i + h_{i+1} \xi)h_{i+1}(1 - \xi) d\xi, \quad i = 1, 2, \cdots, n; \tag{7.19} f(φn+1)=01f(xn+hn+1ξ)hn+1ξdξ;f(\varphi_{n+1}) = \int_0^1 f(x_n + h_{n+1} \xi)h_{n+1} \xi d\xi; a(φi,φi)=01[p(xi1+hiξ)hi+hi2r(xi1+hiξ)ξ2]dξ+01[p(xi+hi+1ξ)hi+1+hi+12r(xi+hi+1ξ)(1ξ)2]dξ,i=1,2,,n;(7.20)a(\varphi_i, \varphi_i) = \int_0^1 \left[\frac{p(x_{i-1} + h_i \xi)}{h_i} + h_i^2 r(x_{i-1} + h_i \xi)\xi^2\right] d\xi + \int_0^1 \left[\frac{p(x_i + h_{i+1} \xi)}{h_{i+1}} + h_{i+1}^2 r(x_i + h_{i+1} \xi)(1 - \xi)^2\right] d\xi, \quad i = 1, 2, \cdots, n; \tag{7.20} a(φn+1,φn+1)=01[p(xn+hn+1ξ)hn+1+hn+12r(xn+hn+1ξ)ξ2]dξ+p(1)aa(\varphi_{n+1}, \varphi_{n+1}) = \int_0^1 \left[\frac{p(x_n + h_{n+1} \xi)}{h_{n+1}} + h_{n+1}^2 r(x_n + h_{n+1} \xi)\xi^2\right] d\xi + p(1)a。

这样,只要选取某个适用于[0,1][0, 1]区间的数值求积公式

01f(x)dxk=1mωkf(xk)\int_0^1 f(x)dx \approx \sum_{k=1}^m \omega_k f(x_k)

(这里ωk\omega_k是权,xkx_k[0,1][0, 1]中的积分结点),就可以对所有的a(φi,φj)a(\varphi_i, \varphi_j)f(φj)f(\varphi_j)进行统一处理。

第六步,解线性代数方程组。

在利用数值积分得到方程组(7.11)后,再用数值代数方法解出

u=(u1,u2,,un+1)T,u^* = (u_1^*, u_2^*, \cdots, u_{n+1}^*)^T,

uh=i=1n+1uiφi(x)u_h^* = \sum_{i=1}^{n+1} u_i^* \varphi_i(x)

就是原问题(7.1)的近似解。

上面第一步到第六步就是用有限元方法求与两点边值问题对应的变分问题近似解的过程。