Skip to content

追赶法求解三对角矩阵

理论推导

① 用aij表示

从如下的出发

[a12a1300a21a22a2300aN1,1aN1,2aN1,300aN,1aN,2][u1k+1u2k+1uN1k+1uNk+1]=[R1R2RN1RN]

可以进一步整理成

[a12a13000a22a23000aN1,2aN1,3000aN,2][u1k+1u2k+1uN1k+1uNk+1]=[R1R2RN1RN]

其中R1=R1

{ai2=ai2ai1ai1,3ai1,2Ri=Riai1Ri1ai1,2(2iN,a12=a12,a13=a13)

基于整理后的矩阵,可以得到

{uNk+1=RNaN,2uik+1=Riai3ui+1k+1ai2(1iN1)

也就是说,先通过最后一行计算得到uNk+1,然后再从最后一行往上计算。

② 用ai,bi,ci表示

从如下的三对角矩阵出发,AU=R

[b1c100a2b2c200aN1bN1cN100aNbN][u1k+1u2k+1uN1k+1uNk+1]=[R1R2RN1RN]

其中bi对角元,ai左旁元,ci右旁元. 可以进一步整理成

[b1c1000b2c2000bN1cN1000bN][u1k+1u2k+1uN1k+1uNk+1]=[R1R2RN1RN]

其中R1=R1,且有

{bi=biaici1bi1Ri=RiaiRi1bi1(2iN,b1=b1,c1=c1)

基于整理后的矩阵,可以得到

{uNk+1=RNbNuik+1=Riciui+1k+1bi(1iN1)

也就是说,先通过最后一行计算得到uNk+1,然后再从最后一行往上计算.

伪程序/流程

求解AU=R

a左旁元 → a(ny)

b对角元 → b(ny)

c右旁元 → c(ny)

R → f(ny)

uik+1 → u(i,n+1),维度是u(ny,nt)

ny:实空间网格数, nt:时间空间网格数

  • 计算bi=biaici1bi1
        M(1)=b(1)
        do i=2,ny-1
          L(i)=a(i)/M(i-1)
        M(i)=b(i)-L(i)*c(i-1)
        end do

其中M(i)即为bi

  • 计算R
        do i = 1,ny
         f(i)=R(i)
        end do

一般来说,R(i)与矩阵元素a,b,c以及u均有关系,这里为了方便理解,以伪代码的形式展示,故写成以上形式,具体实践见CN差分格式求解偏微分方程

  • 计算Ri=RiaiRi1bi1
        y(1)=f(1)
        do i=2,ny
         y(i)=f(i)-L(i)*y(i-1)
        end do

注意, L(i)=a(i)/M(i-1)

  • 计算uNk+1=RNbN,uik+1=Riciui+1k+1bi(1iN1)
        u(ny,n+1)=y(ny)/M(ny)
        do i=ny-1,1,-1
          u(i,n+1)=(y(i)-c(i)*u(i+1,n+1))/M(i)
        end do

至此可以计算出n+1时刻的整个空间网格上的u,在时间循环里不断调用,就可以计算出整个时间网格上的u