多网格方法基本思路

Author : zbzhen,       Last modification time : Tue Aug 15 17:59:06 2023

1. 两网格方法

这里只给出定性分析,不给出复杂的理论分析

1.1. 不同网格尺度的算子(矩阵)的近似

假设

Uh=Kh1Fh,U2h=K2h1F2hU_h=K_h^{-1}F_h,\quad U_{2h} =K_{2h}^{-1}F_{2h}

其中hh是网格步长,上面左边方程自由度相对多,网格步长更小,信息也相应更多.

细网格的信息更多,因此可以通过某个限制算子RR使得F2h=RFhF_{2h}=RF_{h}, 从而

U2h=K2h1F2h=K2h1RFhU_{2h} =K_{2h}^{-1}F_{2h}=K_{2h}^{-1}RF_{h}

此外,可以通过插值算子IIU2hU_{2h}插值延拓到细网格上,也就是IU2hI U_{2h}UhU_h保持相同的维度和信息,并且IU2hUhI U_{2h}\approx U_h, 因此有

Kh1Fh=UhIU2h=IK2h1RFhK_h^{-1}F_h = U_h \approx I U_{2h} = I K_{2h}^{-1}RF_{h}

从而可以认为

Kh1IK2h1RK_h^{-1} \approx I K_{2h}^{-1}R

有限维空间中,算子和矩阵可以认为是同一回事,这里不妨直接把它们直接混用, 上面出现的算子,也可以都认为是矩阵

1.2. 两网格迭代算法

求解某线性方程组,若

U=K1FU=K^{-1}F

则有

U=U~+K1(FKU~)U = \widetilde{U} + K^{-1}(F-K\widetilde{U})

根据前面的分析,K1K^{-1}可以用细网格求逆近似

下面给出两网格算法(two-mg)


U=two-mg(U0,Kh,K2h,Fh)U = \operatorname{two-mg}(U_0, K_h, K_{2h}, F_h)

输入: U0U_0, Kh,K2h,FhK_h, K_{2h}, F_h
输出: UU (使得 UKh1FhU\approx K_h^{-1}F_h)

  • 初值为U0U_0, 经典迭代法求解(只迭代一步) KhUh=FhK_h U_h = F_h,得到U~\widetilde{U}
  • U^=U~+IK2h1R(FhKhU~)\widehat{U} = \widetilde{U} + I K_{2h}^{-1}R(F_h-K_h\widetilde{U})
  • 初值为U^\widehat{U}, 经典迭代法求解(只迭代一步) KhUh=FhK_h U_h = F_h,得到UU

通常情况下,这里的经典迭代法采用的是松弛雅克比迭代,迭代公式为

UU+wD1(FKU)U \leftarrow U + wD^{-1}(F-KU)

其中D=diag(K)D=\operatorname{diag}(K), 一般可取w=0.6w=0.6

下面给出两网格算法(two-mg)具体形式


U=two-mg(U0,Kh,K2h,Fh,D)U = \operatorname{two-mg}(U_0, K_h, K_{2h}, F_h,D)

输入: U0U_0, Kh,K2h,Fh,DK_h, K_{2h}, F_h, D
输出: UU (使得 UKh1FhU\approx K_h^{-1}F_h)

  • U~=U0+wD1(FhKhU0)\widetilde{U} =U_0 + wD^{-1}(F_h-K_hU_0)
  • U^=U~+IK2h1R(FhKhU~)\widehat{U} = \widetilde{U} + I K_{2h}^{-1}R(F_h-K_h\widetilde{U})
  • U=U^+wD1(FhKhU^)U =\widehat{U} + wD^{-1}(F_h-K_h\widehat{U})

2. 多网格方法

和经典迭代算法相比,两网格算法(two-mg)明显的特点是加入了第二步的计算, 减少计算量的地方是近似求逆,即IK2h1RI K_{2h}^{-1}R近似替代Kh1K_h^{-1}, 但是这里又有一个新的问题

如果网格步长hh比较小,计算K2h1K_{2h}^{-1}依旧比较耗费时间。事实上,它可以继续套用两网格法, 于是可以得到递归算法, 这种机制主要有三种方案 V-Cycle, F-Cycle, W-Cycle. 下面给出V-Cycle的matlab 算法

function u = V_Cycle(u,f,h)
    eps = zeros(size(rhs));
    if smallest_grid_size_is_achieved
        eps = smoothing(eps,rhs,2*h);
    else
        u = smoothing(u,f,h);
        
        rhs = Rh(f - Kh * u);
        eps = V_Cycle(eps,rhs,2*h);
        u = u + Ih(eps);

        u = smoothing(u,f,h);
    end
end
%%% Rh, Ih, Kh 会对应不同的 h