Legendre-Galerkin方法以及Chebyshev-Legendre-Galerkin方法以及Python实现
加权余量法简介
给定算子方程以及边界条件:
{
T
u
−
f
=
0
u
∈
V
B
u
−
g
=
0
u
∈
S
\begin{cases} Tu - f = 0 & u \in V \\ Bu - g = 0 & u \in S \end{cases}
{Tu−f=0Bu−g=0u∈Vu∈S
其中
u
u
u为待求函数,
T
T
T 为区域内部
V
V
V 上算子,
B
B
B 为区域边界上的算子,
f
,
g
f, g
f,g 分别为定义在区域内部和区域边界的函数.
处理上述问题的加权余量方法如下:
首先,设方程组的近似解为:
u
n
=
∑
i
=
1
n
a
i
φ
i
(
x
1
,
x
2
,
⋯
,
x
m
)
u_{n} = \sum\limits_{i = 1}^{n}a_{i} \varphi_{i}(x_{1}, x_{2}, \cdots, x_{m})
un=i=1∑naiφi(x1,x2,⋯,xm)
其中,
a
i
,
(
i
=
1
,
⋯
,
n
)
a_{i}, (i = 1, \cdots, n)
ai,(i=1,⋯,n) 待定,
φ
i
\varphi_{i}
φi为某个容许空间上的基函数(具体什么空间需要具体分析.)
将方程带入原方程后一般无法近似精确求解,即在一般情况下,
T
u
n
≠
f
Tu_{n} \neq f
Tun=f
因此,引入以下两个残差函数:
{
R
v
=
T
u
n
−
f
R
s
=
B
u
n
−
g
\begin{cases} R_{v} = Tu_{n} - f \\ R_{s} = Bu_{n} - g \end{cases}
{Rv=Tun−fRs=Bun−g
统称上述两个残差函数为
剩
余
函
数
\color{red}剩余函数
剩余函数.
加权余量法的思想是适当选取
W
v
i
,
W
s
i
W_{vi},W_{si}
Wvi,Wsi使得余量
R
v
R_{v}
Rv以及
R
s
R_{s}
Rs在某种意义上为0,一般的,可以令余量与加权内积的满足正交性条件:
{
(
R
v
,
W
v
i
)
v
=
∫
V
R
v
W
v
i
d
V
=
∫
V
(
T
u
n
−
f
)
W
v
i
d
V
=
0
(
R
s
,
W
s
i
)
s
=
∫
S
R
s
W
s
i
d
S
=
∫
S
(
B
u
n
−
g
)
W
s
i
d
S
=
0
\begin{cases} (R_{v}, W_{vi})_{v} = \int_{V} R_{v}W_{vi}dV = \int_{V} \left( Tu_{n} - f \right)W_{vi} dV = 0 \\ (R_{s}, W_{si})_{s} = \int_{S} R_{s}W_{si}dS = \int_{S} \left( Bu_{n} - g \right)W_{si} dS = 0 \end{cases}
{(Rv,Wvi)v=∫VRvWvidV=∫V(Tun−f)WvidV=0(Rs,Wsi)s=∫SRsWsidS=∫S(Bun−g)WsidS=0
如果适当的选取
u
n
u_{n}
un,如使得
u
n
u_{n}
un能够满足边界条件, 则上面的正交性条件将退化为:
(
R
v
,
W
v
i
)
v
=
∫
V
(
T
u
n
−
f
)
W
v
i
d
V
=
0
(R_{v}, W_{vi})_{v} = \int_{V} \left( Tu_{n} - f \right)W_{vi} dV =0
(Rv,Wvi)v=∫V(Tun−f)WvidV=0
将上式的加权余量法称为
内
部
法
\color{red}{内部法}
内部法;
如果
u
n
u_{n}
un的选取满足
T
u
n
−
f
=
0
Tu_{n} - f = 0
Tun−f=0,则上面的方程组将退化为:
(
R
s
,
W
s
i
)
s
=
∫
S
(
B
u
n
−
g
)
W
s
i
d
S
=
0
(R_{s}, W_{si})_{s} = \int_{S} \left( Bu_{n} - g \right)W_{si} dS = 0
(Rs,Wsi)s=∫S(Bun−g)WsidS=0
称上述的方法为加权余量的
边
界
法
\color{red}{边界法}
边界法.
同理,如果选取的
u
n
u_{n}
un既不满足内部方程,又不满足边界方程,则必须同时用两个正交性条件消除剩余.
一般的,会选取合适的基,使得基函数满足边界条件,即考虑内部法.
对于内部法,将近似解带入内积中,选取
n
n
n个权函数
W
v
i
,
⋯
,
W
v
n
W_{vi}, \cdots, W_{vn}
Wvi,⋯,Wvn可得到方程组:
∫
V
(
T
u
n
−
f
)
W
v
i
d
V
=
0
,
(
i
=
1
,
2
,
⋯
,
n
)
\int_{V} \left( Tu_{n} - f \right) W_{vi} dV = 0, \quad (i = 1, 2, \cdots, n)
∫V(Tun−f)WvidV=0,(i=1,2,⋯,n)
再从上述方程组中求解出
a
i
a_{i}
ai,最终得到逼近解.
由上,总结加权余量方法的步骤如下:
- 选取适当的基函数.
- 带入算子方程,求出剩余表达式.
- 选取适当个数权函数作剩余表达式和权函数的内积,并令其正交消除剩余,从方程中求解出坐标.
注:加权余量法中权函数的选取是非常重要的, 它和所求近似解的精度有着密切的关系, 特别的如果将权函数就取为
W
v
i
=
φ
i
,
(
i
=
1
,
2
,
⋯
,
n
)
W_{vi} = \varphi_{i}, \ (i= 1, 2, \cdots, n)
Wvi=φi, (i=1,2,⋯,n), 则将得到方程组:
∫
V
(
T
u
n
−
f
)
φ
i
d
V
=
0
,
(
i
=
1
,
2
,
⋯
,
n
)
\int_{V} \left( Tu_{n} - f \right) \varphi_{i} dV = 0 , \ (i= 1, 2, \cdots, n)
∫V(Tun−f)φidV=0, (i=1,2,⋯,n)
称上述方程组为
G
a
l
e
r
k
i
n
方
程
组
\color{red}{Galerkin}方程组
Galerkin方程组, 其解称为
G
a
l
e
r
k
i
n
系
数
.
\color{red}{Galerkin}系数.
Galerkin系数.
一维 H e l m h o l t z Helmholtz Helmholtz方程的Galerkin 方法
下面进入主题,考虑如下一维齐次
D
i
r
i
c
h
l
e
t
Dirichlet
Dirichlet型边界条件的
H
e
l
m
h
o
l
t
z
Helmholtz
Helmholtz方程:
{
−
u
′
′
+
α
u
=
f
i
n
I
=
(
−
1
,
1
)
u
(
±
1
)
=
0
\begin{cases} -u ^{''} + \alpha u = f \ \ in \ I = (-1, 1) \\ u(\pm1) = 0 \end{cases}
{−u′′+αu=f in I=(−1,1)u(±1)=0
定义空间
P
N
0
=
{
ϕ
∈
P
N
∣
ϕ
(
±
1
)
=
0
}
P^{0}_{N} = \left\lbrace \phi \in P_{N} | \phi(\pm1) = 0\right\rbrace
PN0={ϕ∈PN∣ϕ(±1)=0}
其中
P
N
P_{N}
PN 表示次数不超过N的全体多项式组成的空间, 则显然可知
P
N
0
P^{0}_{N}
PN0为
N
−
2
N-2
N−2维线性空间.利用加权余量法的步骤推导上述方程的
G
a
l
e
r
k
i
n
Galerkin
Galerkin方法:
- 取试函数: u N = ∑ i = 0 N − 2 a i ϕ i ( x ) u_{N} = \sum\limits_{i = 0}^{N - 2} a_{i}\phi_{i}(x) uN=i=0∑N−2aiϕi(x), 其中 ϕ i ( x ) \phi_{i}(x) ϕi(x)为空间 P N 0 P^{0}_{N} PN0的基函数.
- 将
u
N
u_{N}
uN代入原方程得到剩余表达式:
R v = − u N ′ ′ + α u N − f R_{v} = -u_{N}^{''} + \alpha u_{N} - f Rv=−uN′′+αuN−f - 在权函数
ω
(
x
)
\omega(x)
ω(x)的意义下得到
G
a
l
e
r
k
i
n
方
程
组
:
Galerkin方程组:
Galerkin方程组:
∫ − 1 1 R v ( x ) ϕ j ( x ) ω ( x ) d x = 0 j = 0 , 1 , ⋯ , N − 2 \int_{-1}^{1} R_{v}(x)\phi_{j}(x)\omega(x) dx = 0 \quad j = 0, 1,\cdots, N-2 ∫−11Rv(x)ϕj(x)ω(x)dx=0j=0,1,⋯,N−2
实际上,利用线性空间的定义, 上述过程一般还可以描述为如下:
求 u N ∈ P N 0 u_{N} \in P^{0}_{N} uN∈PN0, s.t.
∫ − 1 1 R v ϕ j ω ( x ) d x = 0 ∀ v N ∈ P N 0 \int_{-1}^{1}R_{v} \phi_{j}\omega(x) dx = 0 \quad \forall v_{N} \in P^{0}_{N} ∫−11Rvϕjω(x)dx=0∀vN∈PN0
将残量带入,即:
求 u N ∈ P N 0 u_{N} \in P^{0}_{N} uN∈PN0, s.t.
− ( u N ′ ′ , v N ) ω + α ( u N , v N ) ω = ( f , v N ) ω ∀ v N ∈ P N 0 -(u_{N}^{''} , v_{N})_{\omega} + \alpha(u_{N}, v_{N})_{\omega} = (f, v_{N})_{\omega} \quad \forall v_{N} \in P_{N}^{0} −(uN′′,vN)ω+α(uN,vN)ω=(f,vN)ω∀vN∈PN0
其中 ( u , v ) ω : = ∫ − 1 1 u ( x ) v ( x ) ω ( x ) d x (u,v)_{\omega} := \int_{-1}^{1} u(x)v(x)\omega(x)dx (u,v)ω:=∫−11u(x)v(x)ω(x)dx为在权重 ω \omega ω意义下定义的内积.
注意,实际上右端项需要计算积分,但是当
f
f
f 为一般函数时,右端一般无法精确求积,因此在实际过程中需要采用数值积分.在
G
a
l
e
r
k
i
n
Galerkin
Galerkin谱方法中,通常会将
f
f
f用某种意义上的插值多项式
I
N
f
I_{N}f
INf代替,插值节点一般选为如
G
a
u
s
s
Gauss
Gauss型求积公式的节点, 由此最终上式子写为:
求
u
N
∈
P
N
0
u_{N} \in P^{0}_{N}
uN∈PN0, s.t.
−
(
u
N
′
′
,
v
N
)
ω
+
α
(
u
N
,
v
N
)
ω
=
(
I
N
f
,
v
N
)
ω
∀
v
N
∈
P
N
0
-(u_{N}^{''} , v_{N})_{\omega} + \alpha(u_{N}, v_{N})_{\omega} = (I_{N}f, v_{N})_{\omega} \quad \forall v_{N} \in P_{N}^{0}
−(uN′′,vN)ω+α(uN,vN)ω=(INf,vN)ω∀vN∈PN0
现在将试函数在基函数下的展开
u
N
=
∑
i
=
0
N
−
2
u
^
i
ϕ
i
(
x
)
d
x
u_{N} = \sum\limits_{i = 0}^{N - 2} \widehat{u}_{i}\phi_{i}(x)dx
uN=i=0∑N−2u
iϕi(x)dx带入上面式子, 并且将
v
N
v_{N}
vN取便所有的基函数即可得到下面方程组:
−
∑
i
=
0
N
−
2
(
ϕ
i
′
′
,
ϕ
j
)
ω
u
^
i
+
α
∑
i
=
0
N
−
2
(
ϕ
i
,
ϕ
j
)
ω
u
^
i
=
(
f
N
,
ϕ
j
)
ω
,
j
=
0
,
⋯
,
N
−
2
-\sum\limits_{i = 0}^{N-2}( \phi^{''}_{i}, \phi_{j})_{\omega}\widehat{u}_{i} + \alpha\sum\limits_{i = 0}^{N-2}\left( \phi_{i}, \phi_{j}\right)_{\omega}\widehat{u}_{i} = (f_{N}, \phi_{j})_{\omega} , \ j = 0,\cdots, N-2
−i=0∑N−2(ϕi′′,ϕj)ωu
i+αi=0∑N−2(ϕi,ϕj)ωu
i=(fN,ϕj)ω, j=0,⋯,N−2
将上述方程组改写为矩阵形式得:
(
S
+
α
M
)
U
^
=
f
(S + \alpha M) \widehat{U} = f
(S+αM)U
=f
其中:
( S ) i j = − ( ϕ j ′ ′ ( x ) , ϕ i ( x ) ) ω (S)_{ij} = -(\phi_{j}^{''}(x), \phi_{i}(x))_{\omega} (S)ij=−(ϕj′′(x),ϕi(x))ω 称为 刚 度 矩 阵 \color{red}{刚度矩阵} 刚度矩阵.
(
M
)
i
j
=
(
ϕ
j
(
x
)
,
ϕ
i
(
x
)
)
ω
(M)_{ij} = (\phi_{j}(x), \phi_{i}(x))_{\omega}
(M)ij=(ϕj(x),ϕi(x))ω 称为
质
量
矩
阵
\color{red}{质量矩阵}
质量矩阵.
U
^
=
(
u
^
0
⋯
u
^
N
−
2
)
T
\widehat{U} = (\widehat{u}_{0} \cdots \widehat{u}_{N-2})^{T}
U
=(u
0⋯u
N−2)T
f
=
(
(
I
N
f
,
ϕ
0
(
x
)
)
ω
,
⋯
,
(
I
N
f
,
ϕ
N
−
2
(
x
)
)
ω
)
T
\mathbf{f} = \left((I_{N}f, \phi_{0}(x))_{\omega}, \cdots, (I_{N}f, \phi_{N-2}(x))_{\omega} \right)^{T}
f=((INf,ϕ0(x))ω,⋯,(INf,ϕN−2(x))ω)T
当选取不同的基函数带入上述方程组之后,就会得到不同形式的矩阵,一般希望得到的矩阵需要有良好的性质,(如:希望得到稀疏的矩阵)使得能够快速求解上述方程组.
Chebyshev-Galerkin方法
继续考虑如下一维齐次
D
i
r
i
c
h
l
e
t
Dirichlet
Dirichlet型边界条件的
H
e
l
m
h
o
l
t
z
Helmholtz
Helmholtz方程:
{
−
u
′
′
+
α
u
=
f
i
n
I
=
(
−
1
,
1
)
u
(
±
1
)
=
0
\begin{cases} -u ^{''} + \alpha u = f \ \ in \ I = (-1, 1) \\ u(\pm1) = 0 \end{cases}
{−u′′+αu=f in I=(−1,1)u(±1)=0
在前面得到上述方程的变分形式:
求
u
N
∈
P
N
0
u_{N} \in P^{0}_{N}
uN∈PN0, s.t.
−
(
u
N
′
′
,
v
N
)
ω
+
α
(
u
N
,
v
N
)
ω
=
(
I
N
f
,
v
N
)
ω
∀
v
N
∈
P
N
0
-(u_{N}^{''} , v_{N})_{\omega} + \alpha(u_{N}, v_{N})_{\omega} = (I_{N}f, v_{N})_{\omega} \quad \forall v_{N} \in P_{N}^{0}
−(uN′′,vN)ω+α(uN,vN)ω=(INf,vN)ω∀vN∈PN0
并选取基函数带入方程,得到以下矩阵方程:
(
S
+
α
M
)
U
^
=
f
(S + \alpha M) \widehat{U} = f
(S+αM)U
=f
在本节将会推导将基函数选取为
C
h
e
b
y
s
h
e
v
Chebyshev
Chebyshev基函数, 对应的权函数将会选取为:
ω
(
x
)
=
(
1
−
x
2
)
−
1
/
2
\omega(x) = (1 - x^{2})^{-1/2}
ω(x)=(1−x2)−1/2
(
此
时
,
上
面
的
G
a
l
e
r
k
i
n
方
法
称
为
C
h
e
b
y
s
h
e
v
−
G
a
l
e
r
k
i
n
方
法
\color{blue}{此时,上面的Galerkin方法称为Chebyshev-Galerkin方法}
此时,上面的Galerkin方法称为Chebyshev−Galerkin方法)时所得到的的刚度矩阵以及质量矩阵,并给出利用
C
h
e
b
y
s
h
e
v
−
G
a
l
e
r
k
i
n
Chebyshev-Galerkin
Chebyshev−Galerkin方法求解上述方程的具体流程.
基函数的选取
由上面可知,要写出具体的方程,首先要选取合适的基函数,直接将基函数选取为
T
n
(
x
)
=
c
o
s
(
n
c
o
s
−
1
(
x
)
)
T_{n}(x) = cos\left( ncos^{-1}(x)\right)
Tn(x)=cos(ncos−1(x))肯定是不行的,因为这样的基函数时不在
P
N
0
P^{0}_{N}
PN0中的,一般的基函数将会用如下形式选取:
ϕ
k
(
x
)
=
T
k
(
x
)
+
a
k
T
k
+
1
(
x
)
+
b
k
T
k
+
2
(
x
)
\phi_{k}(x) = T_{k}(x) + a_{k}T_{k + 1}(x) + b_{k}T_{k + 2}(x)
ϕk(x)=Tk(x)+akTk+1(x)+bkTk+2(x)
通过将基函数带入边界条件, 求解出
a
k
,
b
k
a_{k}, b_{k}
ak,bk,注意这样的方法对一般的边界条件也适用,可以证明,当边界满足适定性条件的时候(关于适定性条件的定义,可差查阅后面的参考资料1), 对于任意的
k
k
k总能将
a
k
,
b
k
a_{k}, b_{k}
ak,bk求解出来.在这里首先考虑齐次
D
i
r
i
c
h
e
l
e
t
Dirichelet
Dirichelet型边界条件.
现在,为了便于后面的推导,首先给出
C
h
e
b
y
s
h
e
v
Chebyshev
Chebyshev多项式的几个性质:
- 正交性:
∫
−
1
1
T
k
(
x
)
T
j
(
x
)
(
1
−
x
2
)
−
1
/
2
d
x
=
c
k
π
2
δ
k
j
\int_{-1}^{1}T_{k}(x)T_{j}(x)(1 - x^2)^{-1/2} dx = \dfrac{c_{k}\pi}{2}\delta_{kj}
∫−11Tk(x)Tj(x)(1−x2)−1/2dx=2ckπδkj
其中, c 0 = 2 , c k = 1 ∀ k > 1 c_{0} = 2, \ c_{k} = 1 \ \ \forall k>1 c0=2, ck=1 ∀k>1 - T n ( ± 1 ) = ( ± 1 ) n T_{n}(\pm 1) = (\pm 1)^{n} Tn(±1)=(±1)n
- T n ′ ′ ( x ) = ∑ k = 0 k + n e v e n n − 2 1 c k n ( n 2 − k 2 ) T k ( x ) T_{n}^{''}(x) = \sum\limits_{k = 0 \\\ k + n even}^{n - 2} \dfrac{1}{c_{k}}n(n^2 - k^2)T_{k}(x) Tn′′(x)=k=0 k+neven∑n−2ck1n(n2−k2)Tk(x)
- Chebyshev-Gauss-Lobatto 型求积公式求积节点以及对应权重:
x 0 = 1 , x N = − 1 , ω 0 = ω N = π 2 N , x j = c o s π j N , ω j = π N , 1 ≤ j ≤ N − 1 x_{0} = 1, x_{N} = -1, \omega_{0} = \omega_{N} = \dfrac{\pi}{2N}, x_{j} = cos\dfrac{\pi j }{N}, \omega_{j} = \dfrac{\pi}{N}, 1 \leq j \leq N-1 x0=1,xN=−1,ω0=ωN=2Nπ,xj=cosNπj,ωj=Nπ,1≤j≤N−1
将基函数 ϕ k ( x ) = T k ( x ) + a k T k + 1 ( x ) + b k T k + 2 ( x ) \phi_{k}(x) = T_{k}(x) + a_{k}T_{k + 1}(x) + b_{k}T_{k + 2}(x) ϕk(x)=Tk(x)+akTk+1(x)+bkTk+2(x)带入边界条件, 利用性质 T n ( ± 1 ) = ( ± 1 ) n T_{n}(\pm 1) = (\pm1)^{n} Tn(±1)=(±1)n得以下方程组:
{ a k + b k + 1 = 0 − a k + b k + 1 = 0 \begin{cases} a_{k} + b_{k} + 1 &= 0 \\ -a_{k}+b_{k} +1 &= 0 \end{cases} {ak+bk+1−ak+bk+1=0=0
从上述方程中立刻解得 a k = 0 , b k = − 1 a_{k} = 0, b_{k} = -1 ak=0,bk=−1:
由上可知,在这里选取基函数为:
ϕ k ( x ) = T k ( x ) − T k + 2 ( x ) , 0 ≤ k ≤ N − 2 \phi_{k}(x) = T_{k}(x) - T_{k+2}(x), 0 \leq k \leq N -2 ϕk(x)=Tk(x)−Tk+2(x),0≤k≤N−2
基函数取定之后,便可以推导具体的刚度矩阵以及质量矩阵.
刚度矩阵推导
s
i
j
=
−
(
ϕ
j
′
′
,
ϕ
i
)
ω
=
−
(
T
j
′
′
−
T
j
+
2
′
′
,
T
i
−
T
i
+
2
)
ω
=
−
(
T
j
′
′
,
T
i
)
ω
+
(
T
j
′
′
,
T
i
+
2
)
ω
+
(
T
j
+
2
′
′
,
T
i
)
ω
−
(
T
j
+
2
′
′
,
T
i
+
2
)
ω
\begin{aligned} s_{ij} &= - \left( \phi^{''}_{j}, \phi_{i} \right)_{\omega} = - \left(T^{''}_{j} - T^{''}_{j+2}, T_{i} - T_{i+2}\right)_{\omega} \\ & = -\left( T_{j}^{''}, T_{i}\right)_{\omega} + \left( T_{j}^{''}, T_{i+2}\right)_{\omega} + \left( T_{j+2}^{''}, T_{i}\right)_{\omega} - \left( T_{j+2}^{''}, T_{i+2}\right)_{\omega} \end{aligned}
sij=−(ϕj′′,ϕi)ω=−(Tj′′−Tj+2′′,Ti−Ti+2)ω=−(Tj′′,Ti)ω+(Tj′′,Ti+2)ω+(Tj+2′′,Ti)ω−(Tj+2′′,Ti+2)ω
套用上面的二阶导数与一阶导数的关系,以及正交性条件,容易得到:
s
i
j
=
{
2
π
(
i
+
1
)
(
i
+
2
)
j
=
i
4
π
(
i
+
1
)
j
=
i
+
2
,
i
+
4
,
i
+
6
,
⋯
0
j
<
i
o
r
j
+
i
o
d
d
s_{ij} = \begin{cases} 2\pi (i+1)(i+2) & j = i \\ 4\pi(i + 1) & j = i + 2, i+4, i+6, \cdots\\ 0 & j < i \ \ or \ \ j + i \ \ odd \end{cases}
sij=⎩⎪⎨⎪⎧2π(i+1)(i+2)4π(i+1)0j=ij=i+2,i+4,i+6,⋯j<i or j+i odd
质量矩阵推导
容易知道 ,
m
i
j
=
m
j
i
m_{ij} = m_{ji}
mij=mji, 因此,不妨设
j
≥
i
j \geq i
j≥i有:
(
ϕ
j
,
ϕ
i
)
ω
=
(
T
j
−
T
j
+
2
,
T
i
−
T
i
+
2
)
ω
=
(
T
j
,
T
i
)
ω
−
(
T
j
,
T
i
+
2
)
ω
−
(
T
j
+
2
,
T
i
)
ω
+
(
T
j
+
2
,
T
i
+
2
)
ω
=
c
i
π
2
δ
j
i
−
c
i
+
2
π
2
δ
j
,
i
+
2
+
c
i
+
2
π
2
δ
j
i
=
{
π
2
(
c
i
+
1
)
,
j
=
i
0
,
j
=
i
+
1
−
π
2
,
j
=
i
+
2
\begin{aligned} (\phi_{j}, \phi_{i})_{\omega} &= (T_{j} - T_{j+2}, T_{i} - T_{i+2})_{\omega} \\ & = (T_{j}, T_{i})_{\omega} -(T_{j}, T_{i + 2})_{\omega} - (T_{j+2}, T_{i})_{\omega} + (T_{j+2}, T_{i+2})_{\omega} \\ & = \dfrac{c_{i}\pi}{2}\delta_{ji} - \dfrac{c_{i+2}\pi}{2}\delta_{j, i+2} + \dfrac{c_{i+2}\pi}{2}\delta_{ji} \\ & = \begin{cases} \dfrac{\pi}{2}(c_{i} + 1), & j = i \\ 0, & j = i + 1 \\ -\dfrac{\pi}{2}, & j = i + 2 \end{cases} \end{aligned}
(ϕj,ϕi)ω=(Tj−Tj+2,Ti−Ti+2)ω=(Tj,Ti)ω−(Tj,Ti+2)ω−(Tj+2,Ti)ω+(Tj+2,Ti+2)ω=2ciπδji−2ci+2πδj,i+2+2ci+2πδji=⎩⎪⎪⎨⎪⎪⎧2π(ci+1),0,−2π,j=ij=i+1j=i+2
右端项推导
推导右端项,首先要计算插值多项式
I
N
f
I_{N}f
INf, 实际上即
C
h
e
b
y
s
h
e
v
Chebyshev
Chebyshev变换.
假设插值节点取为
G
a
u
s
s
−
C
h
e
b
y
s
h
e
v
−
L
o
b
a
t
t
o
Gauss-Chebyshev-Lobatto
Gauss−Chebyshev−Lobatto型求积公式的求积节点,求积节点以及权重在上面给出.
则插值多项式设为:
I
N
f
=
∑
n
=
0
N
f
~
n
T
n
(
x
)
I_{N}f = \sum\limits_{n = 0}^{N}\widetilde{f}_{n}T_{n}(x)
INf=n=0∑Nf
nTn(x)
则谱系数
f
~
n
\widetilde{f}_{n}
f
n 由
C
h
e
b
y
s
h
e
v
Chebyshev
Chebyshev 正变换给出如下:
f
~
n
=
2
c
~
n
N
∑
k
=
0
N
1
c
~
k
f
(
x
k
)
c
o
s
(
n
k
π
/
N
)
\begin{aligned} \widetilde{f}_{n} = \dfrac{2}{\widetilde{c}_{n}N}\sum\limits_{k = 0}^{N}\dfrac{1} {\widetilde{c}_{k}}f(x_{k})cos(nk\pi/N) \end{aligned}
f
n=c
nN2k=0∑Nc
k1f(xk)cos(nkπ/N)
其中:
c
~
n
=
{
2
n
=
0
,
N
1
n
=
1
,
2
,
⋯
N
−
1
\widetilde{c}_{n} = \begin{cases} 2 & n = 0,N \\ 1 & n = 1,2 ,\cdots N-1 \end{cases}
c
n={21n=0,Nn=1,2,⋯N−1
右端项
(
f
)
i
=
(
I
N
f
,
ϕ
i
(
x
)
)
ω
=
∑
n
=
0
N
f
~
n
(
T
n
(
x
)
,
T
i
(
x
)
−
T
i
+
2
(
x
)
)
=
c
i
π
2
f
~
i
−
c
i
+
2
π
2
f
~
i
+
2
(
0
≤
i
≤
N
−
2
)
\begin{aligned} (\mathbf{f})_{i} & = (I_{N}f, \phi_{i}(x))_{\omega} = \sum_{n = 0}^{N}\widetilde{f}_{n}\left( T_{n}(x), T_{i}(x) - T_{i+2}(x)\right) \\ & =\dfrac{c_{i} \pi}{2}\widetilde{f}_{i} - \dfrac{c_{i+2}\pi}{2}\widetilde{f}_{i+2} \ \ (0 \leq i \leq N - 2) \end{aligned}
(f)i=(INf,ϕi(x))ω=n=0∑Nf
n(Tn(x),Ti(x)−Ti+2(x))=2ciπf
i−2ci+2πf
i+2 (0≤i≤N−2)
将上面的式子写为向量形式,得:
f
=
(
c
0
0
−
c
2
c
1
0
−
c
3
⋱
⋱
⋱
c
N
−
2
0
−
c
N
)
(
f
~
0
f
~
1
⋮
f
~
N
)
\mathbf{f} = \begin{pmatrix} c_{0} & 0 & -c_{2} & & & \\ & c_{1} & 0 & -c_{3} & & \\ & & \ddots & \ddots & \ddots & \\ & & & c_{N-2} & 0 & -c_{N} \end{pmatrix} \begin{pmatrix} \widetilde{f}_{0} \\ \widetilde{f}_{1} \\ \vdots \\ \widetilde{f}_{N} \end{pmatrix}
f=⎝⎜⎜⎛c00c1−c20⋱−c3⋱cN−2⋱0−cN⎠⎟⎟⎞⎝⎜⎜⎜⎛f
0f
1⋮f
N⎠⎟⎟⎟⎞
有了左端项矩阵以及右端项,就可以求解方程:
(
S
+
α
M
)
U
^
=
f
(\mathbf{S} + \alpha \mathbf{M}) \widehat{U} =\mathbf{f}
(S+αM)U
=f
得到
U
^
=
(
u
^
0
,
u
^
1
,
⋯
,
u
^
N
−
2
)
\widehat{U} = (\widehat{u}_{0}, \widehat{u}_{1}, \cdots, \widehat{u}_{N-2})
U
=(u
0,u
1,⋯,u
N−2)
Chebyshev逆变换得到解在求积节点处的值.
经过上面的步骤已经可以求得展开系数,在实际过程中,希望最终得到解
u
N
=
∑
i
=
0
N
−
2
u
^
i
ϕ
i
(
x
)
u_{N} = \sum\limits_{i = 0}^{N - 2} \widehat{u}_{i}\phi_{i}(x)
uN=i=0∑N−2u
iϕi(x)在各个节点处的的值,这里的节点特指
C
h
e
b
y
s
h
e
v
Chebyshev
Chebyshev求积公式的求积节点,因为选取这些点之后,可以利用
C
h
e
b
y
s
h
e
v
Chebyshev
Chebyshev 逆变换来计算解在求积节点处的值
u
N
(
x
j
)
u_{N}(x_{j})
uN(xj), 并且
C
h
e
b
y
s
h
e
v
Chebyshev
Chebyshev逆变换可以利用
O
(
N
l
o
g
N
)
O(NlogN)
O(NlogN)的快速算法完成.下面对一般形式的基函数
ϕ
k
(
x
)
=
T
k
(
x
)
+
a
k
T
k
+
1
(
x
)
+
b
k
T
k
+
2
(
x
)
\phi_{k}(x) = T_{k}(x) + a_{k}T_{k + 1}(x) + b_{k}T_{k + 2}(x)
ϕk(x)=Tk(x)+akTk+1(x)+bkTk+2(x)来推导逆变换的过程.
由
u
N
(
x
j
)
=
∑
i
=
0
N
−
2
u
^
i
ϕ
i
(
x
j
)
,
j
=
0
,
⋯
,
N
=
∑
i
=
0
N
−
2
u
^
i
T
i
(
x
j
)
+
∑
i
=
0
N
−
2
a
i
u
^
i
T
i
+
1
(
x
j
)
+
∑
i
=
0
N
−
2
b
i
u
^
i
T
i
+
2
(
x
j
)
u_{N}(x_{j}) = \sum\limits_{i = 0}^{N-2}\widehat{u}_{i}\phi_{i}(x_{j}), \quad j = 0, \cdots, N \\ = \sum\limits_{i = 0}^{N-2}\widehat{u}_{i}T_{i}(x_{j})+ \sum\limits_{i = 0}^{N-2}a_{i}\widehat{u}_{i}T_{i+1}(x_{j}) + \sum\limits_{i = 0}^{N-2}b_{i}\widehat{u}_{i}T_{i+2}(x_{j}) \\
uN(xj)=i=0∑N−2u
iϕi(xj),j=0,⋯,N=i=0∑N−2u
iTi(xj)+i=0∑N−2aiu
iTi+1(xj)+i=0∑N−2biu
iTi+2(xj)
注意使用
T
i
(
x
j
)
=
c
o
s
(
i
j
π
/
N
)
\color{red} T_{i}(x_{j}) = cos(ij\pi / N)
Ti(xj)=cos(ijπ/N)则
u
N
(
x
j
)
=
∑
i
=
0
N
−
2
u
^
i
c
o
s
(
i
j
π
/
N
)
+
∑
i
=
0
N
−
2
a
i
u
^
i
c
o
s
(
(
i
+
1
)
j
π
/
N
)
+
∑
i
=
0
N
−
2
b
i
u
^
i
c
o
s
(
(
i
+
2
)
j
π
/
N
)
=
∑
i
=
0
N
(
u
^
i
+
a
i
−
1
u
^
i
−
1
+
b
i
−
2
u
^
i
−
2
)
c
o
s
(
i
j
π
/
N
)
u_{N}(x_{j}) = \sum\limits_{i = 0}^{N-2}\widehat{u}_{i}cos(ij\pi/N)+ \sum\limits_{i = 0}^{N-2}a_{i}\widehat{u}_{i}cos((i+1)j\pi / N) + \sum\limits_{i = 0}^{N-2}b_{i}\widehat{u}_{i}cos((i+2)j\pi/N) \\ = \sum\limits_{i = 0}^{N} (\widehat{u}_{i}+a_{i-1}\widehat{u}_{i-1} + b_{i-2}\widehat{u}_{i-2}) cos(ij\pi/N)
uN(xj)=i=0∑N−2u
icos(ijπ/N)+i=0∑N−2aiu
icos((i+1)jπ/N)+i=0∑N−2biu
icos((i+2)jπ/N)=i=0∑N(u
i+ai−1u
i−1+bi−2u
i−2)cos(ijπ/N)
这里规定
u
^
−
2
=
u
^
−
1
=
u
^
N
−
1
=
u
^
N
=
0
a
−
1
=
a
N
−
1
=
b
−
1
=
b
−
2
=
0
\widehat{u}_{-2} = \widehat{u}_{-1} = \widehat{u}_{N-1} = \widehat{u}_{N} = 0 \\ a_{-1} = a_{N-1} = b_{-1} = b_{-2} = 0
u
−2=u
−1=u
N−1=u
N=0a−1=aN−1=b−1=b−2=0
Chebyshev-Galerkin方法的计算流程:
最终,给出 C h e b y s h e v − G a l e r k i n Chebyshev-Galerkin Chebyshev−Galerkin方法的计算流程如下:
- 获取 Chebyshev-Gauss-Lobatto 型求积公式的求积节点
x 0 = 1 , x N = − 1 , ω 0 = ω N = π 2 N , x j = c o s π j N , ω j = π N , 1 ≤ j ≤ N − 1 \color{Magenta} x_{0} = 1, x_{N} = -1, \omega_{0} = \omega_{N} = \dfrac{\pi}{2N}, x_{j} = cos\dfrac{\pi j }{N}, \omega_{j} = \dfrac{\pi}{N}, 1 \leq j \leq N-1 x0=1,xN=−1,ω0=ωN=2Nπ,xj=cosNπj,ωj=Nπ,1≤j≤N−1
预存储基函数系数: { a k , b k } \left\lbrace a_{k}, b_{k} \right\rbrace {ak,bk}(二维数组)
对于齐次 D i r i c h l e t Dirichlet Dirichlet型边界条件, 有: a k = 0 , b k = − 1 \color{Magenta} a_{k} = 0, \ b_{k} = -1 ak=0, bk=−1, 对于 N e u m m a n Neumman Neumman型边界条件,有
稀疏存储刚度矩阵 S S S以及质量矩阵 M M M - 计算向量 ( f ( x 0 ) f ( x 1 ) ⋮ f ( x N ) ) \begin{pmatrix} f(x_{0}) \\ f(x_{1}) \\ \vdots \\ f(x_{N}) \end{pmatrix} ⎝⎜⎜⎜⎛f(x0)f(x1)⋮f(xN)⎠⎟⎟⎟⎞, 对该向量进行 C h e b y s h e b Chebysheb Chebysheb正变换得到: ( f ~ 0 f ~ 1 ⋮ f ~ N ) \color{Magenta} \begin{pmatrix} \widetilde{f}_{0} \\ \widetilde{f}_{1} \\ \vdots \\ \widetilde{f}_{N}\end{pmatrix} ⎝⎜⎜⎜⎛f 0f 1⋮f N⎠⎟⎟⎟⎞
- 计算右端项:
f = ( c 0 0 − c 2 c 1 0 − c 3 ⋱ ⋱ ⋱ c N − 2 0 − c N ) ( f ~ 0 f ~ 1 ⋮ f ~ N ) \color{Magenta} \mathbf{f} = \begin{pmatrix} c_{0} & 0 & -c_{2} & & & \\ & c_{1} & 0 & -c_{3} & & \\ & & \ddots & \ddots & \ddots & \\ & & & c_{N-2} & 0 & -c_{N} \end{pmatrix} \begin{pmatrix} \widetilde{f}_{0} \\ \widetilde{f}_{1} \\ \vdots \\ \widetilde{f}_{N} \end{pmatrix} f=⎝⎜⎜⎛c00c1−c20⋱−c3⋱cN−2⋱0−cN⎠⎟⎟⎞⎝⎜⎜⎜⎛f 0f 1⋮f N⎠⎟⎟⎟⎞
求解代数方程组:
( S + α M ) U ^ = f (\mathbf{S} + \alpha \mathbf{M}) \widehat{U} =\mathbf{ f} (S+αM)U =f
得到 U ^ = ( u ^ 0 , u ^ 1 , ⋯ , u ^ N − 2 ) \color{magenta} \widehat{U} = (\widehat{u}_{0}, \widehat{u}_{1}, \cdots, \widehat{u}_{N-2}) U =(u 0,u 1,⋯,u N−2) - 作
C
h
e
b
y
s
h
e
v
Chebyshev
Chebyshev逆变换得:
u N ( x j ) = ∑ i = 0 N − 2 u ^ i ϕ i ( x j ) u_{N}(x_{j} ) = \sum\limits_{i = 0}^{N-2} \widehat{u}_{i} \phi_{i}(x_{j}) uN(xj)=i=0∑N−2u iϕi(xj)
这里利用
u N ( x j ) = ∑ i = 0 N ( u ^ i + a i − 1 u ^ i − 1 + b i − 2 u ^ i − 2 ) c o s ( i j π / N ) u ^ − 2 = u ^ − 1 = u ^ N − 1 = u ^ N = 0 a − 1 = a N − 1 = b − 1 = b − 2 = 0 \color{Magenta} u_{N}(x_{j}) = \sum\limits_{i = 0}^{N} (\widehat{u}_{i}+a_{i-1}\widehat{u}_{i-1} + b_{i-2}\widehat{u}_{i-2}) cos(ij\pi/N) \\ \widehat{u}_{-2} = \widehat{u}_{-1} = \widehat{u}_{N-1} = \widehat{u}_{N} = 0 \\ a_{-1} = a_{N-1} = b_{-1} = b_{-2} = 0 uN(xj)=i=0∑N(u i+ai−1u i−1+bi−2u i−2)cos(ijπ/N)u −2=u −1=u N−1=u N=0a−1=aN−1=b−1=b−2=0
具体实现时, 先将输入进行改写,输入有:
- 第一步中存储
a
k
,
b
k
a_{k}, b_{k}
ak,bk 的基函数系数矩阵
base_coef
: 大小为(N-1, 2)
的 二维数组. - 解向量
s
o
l
u
t
i
o
n
=
(
u
^
0
,
u
^
1
,
⋯
,
u
^
N
−
2
)
solution = (\widehat{u}_{0}, \widehat{u}_{1}, \cdots, \widehat{u}_{N-2})
solution=(u
0,u
1,⋯,u
N−2),大小为
(N-1,)
的一维数组.
首先要改写 解向量数组,让它变成快速切比雪夫逆变换(这个函数预先定义)的输入,用如下公式来改写:
[ u ~ 0 u ~ 1 ⋮ u ~ N ] = [ 0 0 1 0 a 0 1 b 0 a 1 1 ⋱ ⋱ ⋱ b N − 3 a N − 2 1 b N − 2 0 1 ] [ 0 0 u ^ 0 ⋮ 0 0 ] \begin{bmatrix} \widetilde{u}_{0} \\ \widetilde{u}_{1} \\ \vdots \\ \widetilde{u}_{N} \end{bmatrix} = \begin{bmatrix} 0 & 0 & 1 & & & & & \\ & 0 & a_{0} & 1 & & & &\\ & & b_{0} & a_{1} & 1 & & & \\ & & & \ddots & \ddots & \ddots & & \\ & & & & b_{N-3} & a_{N-2} & 1 & \\ & & & & & b_{N-2} & 0 & 1 \end{bmatrix} \begin{bmatrix} 0 \\ 0 \\ \widehat{u}_{0} \\ \vdots \\ 0 \\ 0 \end{bmatrix} ⎣⎢⎢⎢⎡u 0u 1⋮u N⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎡0001a0b01a1⋱1⋱bN−3⋱aN−2bN−2101⎦⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎡00u 0⋮00⎦⎥⎥⎥⎥⎥⎥⎥⎤
将改写过后的 [ u ~ 0 u ~ 1 ⋮ u ~ N ] \begin{bmatrix} \widetilde{u}_{0} \\ \widetilde{u}_{1} \\ \vdots \\ \widetilde{u}_{N} \end{bmatrix} ⎣⎢⎢⎢⎡u 0u 1⋮u N⎦⎥⎥⎥⎤送入自定义函数backward_chebyshev()
完成快速切比雪夫逆变换得到最终结果.
注: 由于最近比较忙,代码会在以后补出