有限元方法基础-以二维拉普拉斯方程为例(附程序)

10 篇文章 12 订阅

前言

本文从零介绍有限元方法,包括每一步的数学推导,同时附程序开发指南。可以方便新手入门。

问题描述

问题区域

在这里插入图片描述

偏微分方程

∇ 2 u ( x , y ) = 0      i n    Ω     ( 1 ) u = g            o n     Γ u     ( 2 ) q = ∂ u ∂ n ⃗ = 0     o n     Γ q     ( 3 ) \nabla^2u(x, y) = 0 \ \ \ \ in \ \ \Omega \ \ \ (1) \\ u = g \ \ \ \ \ \ \ \ \ \ on \ \ \ \Gamma_u \ \ \ (2) \\ q = \frac{\partial u}{\partial \vec{n}} = 0 \ \ \ on \ \ \ \Gamma_q \ \ \ (3) \\ 2u(x,y)=0    in  Ω   (1)u=g          on   Γu   (2)q=n u=0   on   Γq   (3)
a). 其中 Ω \Omega Ω 为矩形 ABCD 减去内部矩形 EFGH 的区域。
b). 其中 Γ u \Gamma_u Γu 为矩形 EFGH 的边界。
c). 其中 Γ q \Gamma_q Γq 为矩形 ABCD 的边界。

变分问题(弱形式)

任取函数 v ( x , y ) ∈ V v(x, y) \in V v(x,y)V 乘在方程 (1) 两端并在区域 Ω \Omega Ω 上积分得到如下方程:
∫ Ω v ( x , y ) ∗ ∇ 2 u ( x , y ) d s = 0         ( 4 ) \int _{\Omega} v(x,y)*\nabla^2u(x, y) ds= 0 \ \ \ \ \ \ \ (4) Ωv(x,y)2u(x,y)ds=0       (4)
对方程 (4) 运用 Green 公式(可以参考博客 边界元方法(一)二重积分的分步积分公式 章节)可得到如下方程:
∫ Ω ∇ u ⋅ ∇ v d s − ∫ ∂ Ω ( ∇ u ⋅ n ) v d w = 0         ( 5 ) \int_{\Omega} \nabla u \cdot \nabla vds - \int_{\partial \Omega} (\nabla u \cdot \mathbf{n})vdw= 0 \ \ \ \ \ \ \ (5) ΩuvdsΩ(un)vdw=0       (5)
∂ Ω = Γ u + Γ q \partial \Omega = \Gamma_u + \Gamma_q Ω=Γu+Γq 方程 (5) 等价于下面的方程:
∫ Ω ∇ u ⋅ ∇ v d s − ∫ Γ q ( ∇ u ⋅ n ) v d w − ∫ Γ u ( ∇ u ⋅ n ) v d w = 0         ( 6 ) \int_{\Omega} \nabla u \cdot \nabla vds - \int_{\Gamma_q} (\nabla u \cdot \mathbf{n})vdw - \int_{\Gamma_u} (\nabla u \cdot \mathbf{n})vdw= 0 \ \ \ \ \ \ \ (6) ΩuvdsΓq(un)vdwΓu(un)vdw=0       (6)
因等式 (2) 我们可以选择最初的 v ( x , y ) = 0    o n     Γ u v(x, y) = 0 \ \ on \ \ \ \Gamma_u v(x,y)=0  on   Γu 则方程 (6) 边成如下形式:
∫ Ω ∇ u ⋅ ∇ v d s − ∫ Γ q ( ∇ u ⋅ n ) v d w = 0.         ( 7 ) \int_{\Omega} \nabla u \cdot \nabla vds - \int_{\Gamma_q} (\nabla u \cdot \mathbf{n})vdw = 0. \ \ \ \ \ \ \ (7) ΩuvdsΓq(un)vdw=0.       (7)
再将等式 (3) 带入到等式 (7) 中可以得到如下的最终弱形式:
T h e n    t h e    w e a k    f o r m u l a t i o n    i s    t o    f i n d    u ∈ U    s u c h    t h a t Then \ \ the \ \ weak \ \ formulation \ \ is \ \ to \ \ find \ \ u \in U \ \ such \ \ that Then  the  weak  formulation  is  to  find  uU  such  that
∫ Ω ∇ u ⋅ ∇ v d s = 0            ( 8 ) \int_{\Omega} \nabla u \cdot \nabla vds = 0 \ \ \ \ \ \ \ \ \ \ (8) Ωuvds=0          (8)
f o r    a n y    v ∈ V for \ \ any \ \ v \in V for  any  vV
其中
U : = { u ∈ C 0 ( Ω ) ∣ u = g , ( x , y ) ∈ Γ u }      ( 9 )   V : = { v ∈ C 0 ( Ω ) ∣ v = 0 , ( x , y ) ∈ Γ u }      ( 10 ) U := \{u \in C^0(\Omega) | u = g, \quad (x,y) \in \Gamma_u \} \ \ \ \ (9) \\\ V := \{v \in C^0(\Omega) | v = 0, \quad (x,y) \in \Gamma_u \} \ \ \ \ (10) U:={uC0(Ω)u=g,(x,y)Γu}    (9) V:={vC0(Ω)v=0,(x,y)Γu}    (10)

有限元离散

The Galerkin formulation : find u h ∈ U h Γ u_h \in U_h^{\Gamma} uhUhΓ such that
a ( u h , v h ) = ∫ Ω ∇ u h ⋅ ∇ v h d s = 0        ( 11 ) a(u_h, v_h) = \int_{\Omega} \nabla u_h \cdot \nabla v_hds = 0 \ \ \ \ \ \ (11) a(uh,vh)=Ωuhvhds=0      (11)
for any v h ∈ V h Γ v_h \in V_h^{\Gamma} vhVhΓ.

V h : = { u h ∈ C ( T h ) ∣ u h ∣ E i ∈ P 1 ∀ E i ∈ T h }     ( 12 )     U h Γ : = { ψ h ∈ V h ∣ ψ h ∣ Γ u = g }     ( 13 )     V h Γ : = { ϕ h ∈ V h ∣ ψ h ∣ Γ u = 0 }     ( 14 ) V_h := \{ u_h \in C(T_h) | \quad u_h | _{E_i} \in P_1 \quad \forall E_i \in T_h \} \ \ \ (12) \\\ \\\ U_h^{\Gamma} := \{ \psi_h \in V_h | \quad \psi_h |_{\Gamma_u} = g \} \ \ \ (13) \\\ \\\ V_h^{\Gamma} := \{ \phi_h \in V_h | \quad \psi_h |_{\Gamma_u} = 0 \} \ \ \ (14) Vh:={uhC(Th)uhEiP1EiTh}   (12)  UhΓ:={ψhVhψhΓu=g}   (13)  VhΓ:={ϕhVhψhΓu=0}   (14)
Where P 1 P_1 P1 is a collection of linear polynomial spaces.

T h : = { E n , n = 1 , ⋯   , n u m M e s h E l e m e n t s } T_h:=\{ E_n, \quad n = 1, \cdots, numMeshElements\} Th:={En,n=1,,numMeshElements} ,其中 E i E_i Ei 为离散的网格单元,以下用三角形单元介绍。

二维线性有限元 : 参考基函数

L a g r a n g e Lagrange Lagrange 型的节点基函数为例。考虑参考三角形单元 E ^ = △ A ^ 1 B ^ 1 C ^ 1 \hat{E}=\bigtriangleup \hat{A}_1\hat{B}_1\hat{C}_1 E^=A^1B^1C^1 上的 2D 线性基函数,其中 A ^ 1 = ( 0 , 0 ) \hat{A}_1=(0, 0) A^1=(0,0), B ^ 1 = ( 1 , 0 ) \hat{B}_1=(1, 0) B^1=(1,0), C ^ 1 = ( 0 , 1 ) \hat{C}_1=(0, 1) C^1=(0,1)
定义基函数如下:
ψ ^ j ( x ^ , y ^ ) = a j x ^ + b j y ^ + c j        j = 1 , 2 , 3 ,       ( 15 ) \hat{\psi}_j(\hat{x}, \hat{y}) = a_j\hat{x} + b_j\hat{y} + c_j \ \ \ \ \ \ j = 1, 2, 3,\ \ \ \ \ (15) ψ^j(x^,y^)=ajx^+bjy^+cj      j=1,2,3,     (15)
满足如下条件:
ψ ^ j ( A ^ i ) = δ i j = { 0 i f     j ≠ i 1 i f     j = i       ( 16 ) \hat{\psi}_j(\hat{A}_i) = \delta _{ij} = \left\{\begin{matrix} 0 & if \ \ \ j \neq i \\ 1 & if \ \ \ j = i \\ \end{matrix}\right. \ \ \ \ \ (16) ψ^j(A^i)=δij={01if   j=iif   j=i     (16)
求解方程 (15) (16) 我们可以得到如下参考单元上的 2D 线性基函数:
ψ ^ 1 ( x ^ , y ^ ) = − x ^ − y ^ + 1 ψ ^ 2 ( x ^ , y ^ ) = x ^ ψ ^ 3 ( x ^ , y ^ ) = y ^ \hat{\psi}_1(\hat{x}, \hat{y}) = -\hat{x} -\hat{y} +1 \\ \hat{\psi}_2(\hat{x}, \hat{y}) = \hat{x} \\ \hat{\psi}_3(\hat{x}, \hat{y}) = \hat{y} ψ^1(x^,y^)=x^y^+1ψ^2(x^,y^)=x^ψ^3(x^,y^)=y^

2D linear finite element : affine mapping

任意三角形单元 E = △ A 1 B 1 C 1 E=\bigtriangleup A_1B_1C_1 E=A1B1C1 与 参考三角形单元 E ^ = △ A ^ 1 B ^ 1 C ^ 1 \hat{E}=\bigtriangleup \hat{A}_1\hat{B}_1\hat{C}_1 E^=A^1B^1C^1 的映射。
设:
A i = ( x i , y i ) ,       i = 1 , 2 , 3. A_i = (x_i, y_i), \ \ \ \ \ i = 1, 2, 3. Ai=(xi,yi),     i=1,2,3.
consider the affine mapping
( x y ) = ( A 2 − A 1 , A 3 − A 1 ) ( x ^ y ^ ) + A 1 = ( x 2 − x 1 x 3 − x 1 y 2 − y 1 y 3 − y 1 ) ( x ^ y ^ ) + ( x 1 y 1 ) . \begin{aligned} \left(\begin{array}{c} x \\ y \end{array}\right) & =\left(A_{2}-A_{1}, A_{3}-A_{1}\right)\left(\begin{array}{c} \hat{x} \\ \hat{y} \end{array}\right)+A_{1} \\ & =\left(\begin{array}{ll} x_{2}-x_{1} & x_{3}-x_{1} \\ y_{2}-y_{1} & y_{3}-y_{1} \end{array}\right)\left(\begin{array}{l} \hat{x} \\ \hat{y} \end{array}\right)+\left(\begin{array}{l} x_{1} \\ y_{1} \end{array}\right) . \end{aligned} (xy)=(A2A1,A3A1)(x^y^)+A1=(x2x1y2y1x3x1y3y1)(x^y^)+(x1y1).
得到:
x ^ = ( y 3 − y 1 ) ( x − x 1 ) − ( x 3 − x 1 ) ( y − y 1 ) ( x 2 − x 1 ) ( y 3 − y 1 ) − ( x 3 − x 1 ) ( y 2 − y 1 ) , y ^ = ( y 2 − y 1 ) ( x − x 1 ) − ( x 2 − x 1 ) ( y − y 1 ) ( x 2 − x 1 ) ( y 3 − y 1 ) − ( x 3 − x 1 ) ( y 2 − y 1 ) . \begin{aligned} \hat{x} & =\frac{\left(y_{3}-y_{1}\right)\left(x-x_{1}\right)-\left(x_{3}-x_{1}\right)\left(y-y_{1}\right)}{\left(x_{2}-x_{1}\right)\left(y_{3}-y_{1}\right)-\left(x_{3}-x_{1}\right)\left(y_{2}-y_{1}\right)}, \\ \hat{y} & =\frac{\left(y_{2}-y_{1}\right)\left(x-x_{1}\right)-\left(x_{2}-x_{1}\right)\left(y-y_{1}\right)}{\left(x_{2}-x_{1}\right)\left(y_{3}-y_{1}\right)-\left(x_{3}-x_{1}\right)\left(y_{2}-y_{1}\right)} . \end{aligned} x^y^=(x2x1)(y3y1)(x3x1)(y2y1)(y3y1)(xx1)(x3x1)(yy1),=(x2x1)(y3y1)(x3x1)(y2y1)(y2y1)(xx1)(x2x1)(yy1).

定义 J a c o b i     m a t r i x Jacobi \ \ \ matrix Jacobi   matrix :
J = ( x 2 − x 1 x 3 − x 1 y 2 − y 1 y 3 − y 1 ) J=\left(\begin{array}{ll} x_{2}-x_{1} & x_{3}-x_{1} \\ y_{2}-y_{1} & y_{3}-y_{1} \end{array}\right) J=(x2x1y2y1x3x1y3y1)
则有
∣ J ∣ = ( x 2 − x 1 ) ( y 3 − y 1 ) − ( x 3 − x 1 ) ( y 2 − y 1 ) , |J|=\left(x_{2}-x_{1}\right)\left(y_{3}-y_{1}\right)-\left(x_{3}-x_{1}\right)\left(y_{2}-y_{1}\right), J=(x2x1)(y3y1)(x3x1)(y2y1),
x ^ = ( y 3 − y 1 ) ( x − x 1 ) − ( x 3 − x 1 ) ( y − y 1 ) ∣ J ∣ y ^ = − ( y 2 − y 1 ) ( x − x 1 ) + ( x 2 − x 1 ) ( y − y 1 ) ∣ J ∣ \begin{aligned} \hat{x} & =\frac{\left(y_{3}-y_{1}\right)\left(x-x_{1}\right)-\left(x_{3}-x_{1}\right)\left(y-y_{1}\right)}{|J|} \\ \hat{y} & =\frac{-\left(y_{2}-y_{1}\right)\left(x-x_{1}\right)+\left(x_{2}-x_{1}\right)\left(y-y_{1}\right)}{|J|} \end{aligned} x^y^=J(y3y1)(xx1)(x3x1)(yy1)=J(y2y1)(xx1)+(x2x1)(yy1)

有限元计算

选择有限元空间 U h = s p a n { ψ i } i = 1 N b U_h =span\{ \psi_i\}_{i=1}^{N_b} Uh=span{ψi}i=1Nb 其中 N b N_b Nb 为有限元节点数目(注与网格的几何节点数不一定相同)。
因此 u h ∈ U h Γ u_h \in U_h^{\Gamma} uhUhΓ 则有
u h = ∑ i = 1 N b u i ψ i         ( 17 ) u_h=\sum_{i=1}^{N_b}u_i\psi_i \ \ \ \ \ \ \ (17) uh=i=1Nbuiψi       (17)
且满足 u h = g      ( x , y ) ∈ Γ u u_h = g \ \ \ \ (x, y) \in \Gamma_u uh=g    (x,y)Γu

综上, 选择 " t e s t     f u n c t i o n test \ \ \ function test   function" v h = ψ i ( i = 1 , . . . , N t ) v_h = \psi_i(i=1,...,N_t) vh=ψi(i=1,...,Nt), 则离散有限元方程为:
∫ Ω ∇ ( ∑ j = 1 N b u j ψ j ) ⋅ ∇ ψ i d x d y = 0 ⇒ ∑ j = 1 N b u j [ ∫ Ω ∇ ψ j ⋅ ∇ ψ i d x d y ] = 0 , i = 1 , ⋯   , N t       ( 18 ) \begin{aligned} & \int_{\Omega} \nabla\left(\sum_{j=1}^{N_{b}} u_{j} \psi_{j}\right) \cdot \nabla \psi_{i} d x d y=0 \\ \Rightarrow & \sum_{j=1}^{N_{b}} u_{j}\left[\int_{\Omega} \nabla \psi_{j} \cdot \nabla \psi_{i} d x d y\right]=0, \quad i=1, \cdots, N_{t} \end{aligned} \ \ \ \ \ (18) Ω(j=1Nbujψj)ψidxdy=0j=1Nbuj[Ωψjψidxdy]=0,i=1,,Nt     (18)

刚度矩阵

A = [ a i j ] = [ ∫ Ω ∇ ψ j ⋅ ∇ ψ i d x d y ] i , j = 1 i = N t , j = N b A=\left[a_{i j}\right]=\left[\int_{\Omega} \nabla \psi_{j} \cdot \nabla \psi_{i} d x d y\right]_{i, j=1}^{i=N_{t}, j=N_{b}} A=[aij]=[Ωψjψidxdy]i,j=1i=Nt,j=Nb

荷载(右端项)

b ⃗ = [ b i ] i = 1 i = N t = 0 \vec{b}=\left[b_{i}\right]_{i=1}^{i=N_{t}}=0 b =[bi]i=1i=Nt=0

算法(伪代码)

Stiffness matrix Calculation

在这里插入图片描述

Load vector Calculation

在这里插入图片描述

Deal with the boundary conditions

在这里插入图片描述

程序

具体程序介绍可以参考我的另一篇博客 :有限元方法求解二维拉普拉斯方程C++实现

示例结果

在这里插入图片描述

在这里插入图片描述

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值