一维Helmholtz方程的Chebyshev - Galerkin谱方法以及Python实现

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} {Tuf=0Bug=0uVuS
其中 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=1naiφ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=TunfRs=Bung
统称上述两个残差函数为 剩 余 函 数 \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(Tunf)WvidV=0(Rs,Wsi)s=SRsWsidS=S(Bung)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(Tunf)WvidV=0
将上式的加权余量法称为 内 部 法 \color{red}{内部法} ;
如果 u n u_{n} un的选取满足 T u n − f = 0 Tu_{n} - f = 0 Tunf=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(Bung)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(Tunf)WvidV=0,(i=1,2,,n)
再从上述方程组中求解出 a i a_{i} ai,最终得到逼近解.

由上,总结加权余量方法的步骤如下:

  1. 选取适当的基函数.
  2. 带入算子方程,求出剩余表达式.
  3. 选取适当个数权函数作剩余表达式和权函数的内积,并令其正交消除剩余,从方程中求解出坐标.

注:加权余量法中权函数的选取是非常重要的, 它和所求近似解的精度有着密切的关系, 特别的如果将权函数就取为 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(Tunf)φ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 N2维线性空间.利用加权余量法的步骤推导上述方程的 G a l e r k i n Galerkin Galerkin方法:

  1. 取试函数: 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=0N2aiϕi(x), 其中 ϕ i ( x ) \phi_{i}(x) ϕi(x)为空间 P N 0 P^{0}_{N} PN0的基函数.
  2. u N u_{N} uN代入原方程得到剩余表达式:
    R v = − u N ′ ′ + α u N − f R_{v} = -u_{N}^{''} + \alpha u_{N} - f Rv=uN+αuNf
  3. 在权函数 ω ( 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,,N2
    实际上,利用线性空间的定义, 上述过程一般还可以描述为如下:
    u N ∈ P N 0 u_{N} \in P^{0}_{N} uNPN0, 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=0vNPN0
    将残量带入,即:
    u N ∈ P N 0 u_{N} \in P^{0}_{N} uNPN0, 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)ωvNPN0

其中 ( 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} uNPN0, 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)ωvNPN0
现在将试函数在基函数下的展开 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=0N2u 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=0N2(ϕi,ϕj)ωu i+αi=0N2(ϕi,ϕj)ωu i=(fN,ϕj)ω, j=0,,N2
将上述方程组改写为矩阵形式得:
( 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 0u N2)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,ϕN2(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} uNPN0, 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)ωvNPN0
并选取基函数带入方程,得到以下矩阵方程:
( 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)=(1x2)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方法} ,GalerkinChebyshevGalerkin)时所得到的的刚度矩阵以及质量矩阵,并给出利用 C h e b y s h e v − G a l e r k i n Chebyshev-Galerkin ChebyshevGalerkin方法求解上述方程的具体流程.

基函数的选取

由上面可知,要写出具体的方程,首先要选取合适的基函数,直接将基函数选取为 T n ( x ) = c o s ( n c o s − 1 ( x ) ) T_{n}(x) = cos\left( ncos^{-1}(x)\right) Tn(x)=cos(ncos1(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)(1x2)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+nevenn2ck1n(n2k2)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π,1jN1
    将基函数 ϕ 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+1ak+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),0kN2
    基函数取定之后,便可以推导具体的刚度矩阵以及质量矩阵.

刚度矩阵推导

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)ω=(TjTj+2,TiTi+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 ji有:
( ϕ 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)ω=(TjTj+2,TiTi+2)ω=(Tj,Ti)ω(Tj,Ti+2)ω(Tj+2,Ti)ω+(Tj+2,Ti+2)ω=2ciπδji2ci+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 GaussChebyshevLobatto型求积公式的求积节点,求积节点以及权重在上面给出.
则插值多项式设为:
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=0Nf 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=0Nc 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,N1
右端项
( 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=0Nf n(Tn(x),Ti(x)Ti+2(x))=2ciπf i2ci+2πf i+2  (0iN2)
将上面的式子写为向量形式,得:
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=c00c1c20c3cN20cNf 0f 1f 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 N2)

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=0N2u 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=0N2u iϕi(xj),j=0,,N=i=0N2u iTi(xj)+i=0N2aiu iTi+1(xj)+i=0N2biu 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=0N2u icos(ijπ/N)+i=0N2aiu icos((i+1)jπ/N)+i=0N2biu icos((i+2)jπ/N)=i=0N(u i+ai1u i1+bi2u i2)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 N1=u N=0a1=aN1=b1=b2=0

Chebyshev-Galerkin方法的计算流程:

最终,给出 C h e b y s h e v − G a l e r k i n Chebyshev-Galerkin ChebyshevGalerkin方法的计算流程如下:

  • 获取 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π,1jN1
    预存储基函数系数: { 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 1f 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=c00c1c20c3cN20cNf 0f 1f 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 N2)
  • 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=0N2u 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=0N(u i+ai1u i1+bi2u i2)cos(ijπ/N)u 2=u 1=u N1=u N=0a1=aN1=b1=b2=0

具体实现时, 先将输入进行改写,输入有:

  1. 第一步中存储 a k , b k a_{k}, b_{k} ak,bk 的基函数系数矩阵 base_coef: 大小为(N-1, 2)的 二维数组.
  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 N2),大小为(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 1u N=0001a0b01a11bN3aN2bN210100u 000
    将改写过后的 [ u ~ 0 u ~ 1 ⋮ u ~ N ] \begin{bmatrix} \widetilde{u}_{0} \\ \widetilde{u}_{1} \\ \vdots \\ \widetilde{u}_{N} \end{bmatrix} u 0u 1u N送入自定义函数 backward_chebyshev()完成快速切比雪夫逆变换得到最终结果.

注: 由于最近比较忙,代码会在以后补出

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值