又是新的一天, 昨天上午有课,今天还要备课, 明天要讲两次课, 因此这三天可能只能写一点点了, 反正能写多少是多少把. 继续给出参考资料
Brenner S, Scott R. The mathematical theory of finite element methods[M]. Springer Science & Business Media, 2007.
从第十页.
昨日内容简单回忆
2021-5-18 有限元方法从0开始学习笔记 第二天 (一维线性元简介, 与差分格式的联系)
- 给出了第一个具体的有限元空间, 一维的线性分片多项式空间, 在该空间下利用给出了 Risz-Galerkin 框架的具体刚度矩阵, 以及给出了相应的插值误差估计.
- 讲述了一维线性元与差分格式的一些联系.
0.6 有限元方法的计算处理
本节主要介绍对前面一维线性元的编程处理, 有限元处理的一个重要的观点即用局部刚度矩阵来组装整体刚度矩阵, 为此定义指标 i ( e , j ) i(e, j) i(e,j), 其中各个记号的解释如下(这里翻译过来感觉有点别扭, 默认 j 表示局部节点编号吧, 因为书上写的 node number, 反正这里只考虑线性元, 暂时先不去引入自由度的概念.):
- e e e:表示单元的整体编号, I e = [ x e − 1 , x e ] I_{e} = [x_{e-1}, x_{e}] Ie=[xe−1,xe].
- j j j : 表示单元的局部节点编号, j = 0 , 1 j = 0, 1 j=0,1 . (用 0 0 0表示左端点, 1 1 1表示右端点)
- i ( e , j ) : i(e, j): i(e,j): 表示节点的全局编号,
显然, 节点的全局编号是关于局部编号以及单元整体编号的函数, 并且这里可以看出, 有
i
(
e
,
j
)
=
e
+
j
−
1
,
e
=
1
,
2
,
⋯
,
n
,
j
=
0
,
1
,
i(e, j) = e + j - 1, \quad e = 1,2, \cdots, n, \ \ j = 0, 1,
i(e,j)=e+j−1,e=1,2,⋯,n, j=0,1,
下面介绍有限元基本的编程思路, 基本的思想是:
参考单元上的计算
⇒
\Rightarrow
⇒ 局部单元上计算
⇒
\Rightarrow
⇒ 整体组装.
网格剖分的过程可以参考上一小节的内容, 并且记号也将沿用上一小节的记号, 因此这里不作过多的赘述, 假设
f
f
f 为连续函数, 考虑
f
f
f 在分片多项式空间上的插值函数:
f
I
(
x
)
=
∑
i
=
1
n
f
(
x
i
)
ϕ
i
(
x
)
,
f_{I}(x) = \sum\limits_{i = 1}^{n} f(x_{i})\phi_{i}(x),
fI(x)=i=1∑nf(xi)ϕi(x),
其中,
ϕ
i
(
x
)
\phi_{i}(x)
ϕi(x) 是前面所定义的帽子函数, 很显然, 上面这个式子是不利于编程的,(因为这些帽子函数需要分段地定义出来) 我们将上式子改写如下:
f
I
(
x
)
=
∑
e
∑
j
=
0
1
f
(
x
i
(
e
,
j
)
)
ψ
j
e
(
x
)
,
f_{I}(x) = \sum\limits_{e}\sum\limits_{j=0}^{1} f(x_{i(e, j)})\psi^{e}_{j}(x),
fI(x)=e∑j=0∑1f(xi(e,j))ψje(x),
其中,
ψ
j
e
(
x
)
,
j
=
0
,
1
\psi^{e}_{j}(x), \ j =0,1
ψje(x), j=0,1 分别定义如下:
ψ
0
e
(
x
)
=
{
x
e
−
x
x
e
−
x
e
−
1
x
∈
I
e
0
otherwise
,
ψ
1
e
(
x
)
=
{
x
−
x
e
−
1
x
e
−
x
e
−
1
x
∈
I
e
0
otherwise
.
\psi_{0}^{e}(x) = \begin{cases} \dfrac{x_{e} - x}{x_{e} - x_{e-1}} & x \in I_{e} \\ 0 & \text{otherwise} \end{cases}, \qquad \psi_{1}^{e}(x) = \begin{cases} \dfrac{x - x_{e-1}}{x_{e} - x_{e-1}} & x \in I_{e} \\ 0 & \text{otherwise} \end{cases}.
ψ0e(x)=⎩⎨⎧xe−xe−1xe−x0x∈Ieotherwise,ψ1e(x)=⎩⎨⎧xe−xe−1x−xe−10x∈Ieotherwise.
这两个函数合起来, 称为 单元
I
e
I_{e}
Ie 上的局部基函数.
注意, 后面改写的插值在网格节点上不再有
f
(
x
i
)
=
f
I
(
x
i
)
f(x_{i}) = f_{I}(x_{i})
f(xi)=fI(xi), 但是这不影响积分的计算, 我的理解这是看成在
L
2
L^2
L2的意义下, 新的插值函数和原来的插值函数相等? 这里只是为了方便编程时积分的计算.
此外, 一般的, 也不会直接计算
ψ
j
e
(
x
)
\psi_{j}^{e}(x)
ψje(x) 的函数值, 而是定义如下参考单元上的局部基函数:
ψ
^
0
(
x
^
)
=
{
1
−
x
^
x
^
∈
[
0
,
1
]
0
otherwise
,
ψ
^
1
(
x
^
)
=
{
x
^
x
^
∈
[
0
,
1
]
0
otherwise
.
\widehat{\psi}_{0}(\widehat{x}) = \begin{cases} 1 - \widehat{x} & \widehat{x} \in \left[0, 1\right] \\ 0 & \text{otherwise} \end{cases}, \qquad \widehat{\psi}_{1}(\widehat{x}) = \begin{cases} \widehat{x} & \widehat{x} \in \left[0 , 1\right] \\ 0 & \text{otherwise} \end{cases}.
ψ
0(x
)={1−x
0x
∈[0,1]otherwise,ψ
1(x
)={x
0x
∈[0,1]otherwise.
再通过定义仿射变换将
x
^
∈
[
0
,
1
]
\widehat{x} \in \left[0, 1\right]
x
∈[0,1] 映射到
x
∈
[
x
e
−
1
,
x
e
]
x \in \left[ x_{e-1}, x_{e}\right]
x∈[xe−1,xe] 上如下:
x
=
x
e
−
1
+
(
x
e
−
x
e
−
1
)
x
^
,
x = x_{e-1} + \left( x_{e} - x_{e-1} \right) \widehat{x},
x=xe−1+(xe−xe−1)x
,
从而
x
^
=
x
−
x
e
−
1
x
e
−
x
e
−
1
,
\widehat{x} = \dfrac{x - x_{e-1}}{x_{e} - x_{e-1}},
x
=xe−xe−1x−xe−1,
因此, 可以改写公式
f
I
(
x
)
=
∑
e
∑
j
=
0
1
f
(
x
i
(
e
,
j
)
)
ψ
j
e
(
x
)
,
f_{I}(x) = \sum\limits_{e}\sum\limits_{j=0}^{1} f(x_{i(e, j)})\psi^{e}_{j}(x),
fI(x)=e∑j=0∑1f(xi(e,j))ψje(x),
为:
f
I
(
x
)
=
∑
e
∑
j
=
1
1
f
(
x
i
(
e
,
j
)
)
ψ
^
j
(
x
−
x
e
−
1
x
e
−
x
e
−
1
)
:
=
∑
e
∑
j
=
1
1
f
(
x
i
(
e
,
j
)
)
ψ
^
j
(
x
^
e
)
,
f_{I}(x) = \sum\limits_{e} \sum\limits_{j=1}^{1} f(x_{i(e, j)})\widehat{\psi}_{j}\left(\dfrac{x - x_{e-1}}{x_{e} - x_{e-1}}\right) := \sum\limits_{e} \sum\limits_{j=1}^{1} f(x_{i(e, j)})\widehat{\psi}_{j}\left(\widehat{x}_{e}\right),
fI(x)=e∑j=1∑1f(xi(e,j))ψ
j(xe−xe−1x−xe−1):=e∑j=1∑1f(xi(e,j))ψ
j(x
e),
利用上述操作, 可以容易地计算如下的双线性函数, 定义
a
e
(
v
,
w
)
=
∫
x
e
−
1
x
e
v
′
(
x
)
w
′
(
x
)
d
x
a_{e}(v, w) = \int_{x_{e-1}}^{x_{e}} v^{'}(x) w^{'}(x) dx
ae(v,w)=∫xe−1xev′(x)w′(x)dx ,
a
(
v
,
w
)
=
∑
e
a
e
(
v
,
w
)
=
∑
e
∫
x
e
−
1
x
e
v
′
(
x
)
w
′
(
x
)
d
x
,
a(v, w) = \sum\limits_{e}a_{e}(v, w) = \sum\limits_{e}\int_{x_{e-1}}^{x_{e}} v'(x)w'(x) dx,
a(v,w)=e∑ae(v,w)=e∑∫xe−1xev′(x)w′(x)dx,
下面计算
∫
x
e
−
1
x
e
v
′
(
x
)
w
′
(
x
)
d
x
\int_{x_{e-1}}^{x_{e}} v'(x)w'(x) dx
∫xe−1xev′(x)w′(x)dx:
∫
x
e
−
1
x
e
v
′
(
x
)
w
′
(
x
)
d
x
=
∫
x
e
−
1
x
e
(
∑
j
v
i
(
e
,
j
)
ψ
j
e
′
(
x
)
)
(
∑
k
w
i
(
e
,
k
)
ψ
k
e
′
(
x
)
)
d
x
=
1
x
e
−
x
e
−
1
∫
0
1
(
∑
j
v
i
(
e
,
j
)
ψ
^
j
′
(
x
^
e
)
)
(
∑
k
w
i
(
e
,
k
)
ψ
^
k
′
(
x
^
e
)
)
d
x
^
e
=
1
x
e
−
x
e
−
1
∑
j
∑
k
v
i
(
e
,
j
)
w
i
(
e
,
k
)
∫
0
1
ψ
^
j
′
(
x
^
e
)
ψ
^
k
′
(
x
^
e
)
d
x
^
e
\begin{aligned} \int_{x_{e-1}}^{x_{e}} v^{'}(x)w^{'}(x)dx &= \int_{x_{e-1}}^{x_{e}} \left( \sum_{j}v_{i(e, j)}\psi^{e'}_{j}(x)\right)\left( \sum_{k} w_{i(e, k)}\psi^{e'}_{k}(x)\right) dx \\ &= \dfrac{1}{x_{e} - x_{e-1}} \int_{0}^{1} \left(\sum_{j} v_{i(e,j)}\widehat{\psi}^{'}_{j}(\widehat{x}_{e}) \right)\left(\sum_{k} w_{i(e,k)}\widehat{\psi}^{'}_{k}(\widehat{x}_{e}) \right) d \widehat{x}_{e} \\ &= \dfrac{1}{x_{e} - x_{e-1}} \sum\limits_{j}\sum\limits_{k}v_{i(e, j)}w_{i(e, k)}\int_{0}^{1} \widehat{\psi}^{'}_{j}(\widehat{x}_{e})\widehat{\psi}^{'}_{k}(\widehat{x}_{e}) d\widehat{x}_{e} \end{aligned}
∫xe−1xev′(x)w′(x)dx=∫xe−1xe(j∑vi(e,j)ψje′(x))(k∑wi(e,k)ψke′(x))dx=xe−xe−11∫01(j∑vi(e,j)ψ
j′(x
e))(k∑wi(e,k)ψ
k′(x
e))dx
e=xe−xe−11j∑k∑vi(e,j)wi(e,k)∫01ψ
j′(x
e)ψ
k′(x
e)dx
e
引入记号:
v
e
=
(
v
i
(
e
,
0
)
v
i
(
e
,
1
)
)
,
w
e
=
(
w
i
(
e
,
0
)
w
i
(
e
,
1
)
)
,
K
e
=
(
∫
0
1
ψ
^
0
′
(
x
^
e
)
ψ
^
0
′
(
x
^
e
)
d
x
^
e
∫
0
1
ψ
^
0
′
(
x
^
e
)
ψ
^
1
′
(
x
^
e
)
d
x
^
e
∫
0
1
ψ
^
1
′
(
x
^
e
)
ψ
^
0
′
(
x
^
e
)
d
x
^
e
∫
0
1
ψ
^
1
′
(
x
^
e
)
ψ
^
1
′
(
x
^
e
)
d
x
^
e
)
\begin{aligned} \mathbf{v}_{e} = \begin{pmatrix} v_{i(e, 0)} \\ v_{i(e, 1)} \end{pmatrix}, \quad \mathbf{w}_{e} = \begin{pmatrix} w_{i(e, 0)} \\ w_{i(e, 1)} \end{pmatrix} \quad, \mathbf{K}_{e} = \begin{pmatrix} \int_{0}^{1} \widehat{\psi}^{'}_{0}(\widehat{x}_{e})\widehat{\psi}^{'}_{0}(\widehat{x}_{e}) d\widehat{x}_{e} &\int_{0}^{1} \widehat{\psi}^{'}_{0}(\widehat{x}_{e})\widehat{\psi}^{'}_{1}(\widehat{x}_{e}) d\widehat{x}_{e} \\ \int_{0}^{1} \widehat{\psi}^{'}_{1}(\widehat{x}_{e})\widehat{\psi}^{'}_{0}(\widehat{x}_{e}) d\widehat{x}_{e} &\int_{0}^{1} \widehat{\psi}^{'}_{1}(\widehat{x}_{e})\widehat{\psi}^{'}_{1}(\widehat{x}_{e}) d\widehat{x}_{e} \end{pmatrix} \end{aligned}
ve=(vi(e,0)vi(e,1)),we=(wi(e,0)wi(e,1)),Ke=(∫01ψ
0′(x
e)ψ
0′(x
e)dx
e∫01ψ
1′(x
e)ψ
0′(x
e)dx
e∫01ψ
0′(x
e)ψ
1′(x
e)dx
e∫01ψ
1′(x
e)ψ
1′(x
e)dx
e)
从而有:
∫
x
e
−
1
x
e
v
′
(
x
)
w
′
(
x
)
d
x
=
1
x
i
−
x
i
−
1
v
e
⊺
K
e
w
e
\int_{x_{e-1}}^{x_{e}} v'(x)w'(x) dx = \dfrac{1}{x_{i} - x_{i-1}} \mathbf{v}^{\intercal}_{e}\mathbf{K}_{e}\mathbf{w}_{e}
∫xe−1xev′(x)w′(x)dx=xi−xi−11ve⊺Kewe
上面过程是一个向量化的过程, 可以方便地编程计算, 对于整个线性元的计算, 完全可以按照上面的方法进行推导并且编程,并且上述编程思路可以推广到高次元以及高维问题, 当然, 这里暂时先不去讨论. 有兴趣的可以按照上面过程自行推导整个一维线性元的计算流程, 并编写程序实现, 后面如果有时间也会去实现一下, 并在这里附上链接.
赶紧溜了, 这两天就写到这里, 后面还要备课.