MINRES(极小残差算法)求解线性系统详细解读

news2024/10/7 18:20:52

本博客参考了添加链接描述这篇知乎
先看我这篇博客介绍添加链接描述

Q k R k − 1 Q_k R_{k}^{-1} QkRk1的处理
假设 D k = [ d 1 , d 2 , … , d k ] = Q k R k − 1 D_k = [d_1,d_2, \ldots, d_k] = Q_k R_{k}^{-1} Dk=[d1,d2,,dk]=QkRk1,假设 R k R_k Rk的第 i i i行第 j j j列元素为 r i , j r_{i,j} ri,j
{ R k + 1 , k = ( r 0 , 0 r 0 , 1 r 0 , 2 ⋯ ⋯ 0 0 r 1 , 1 r 1 , 2 r 1 , 3 ⋯ 0 0 0 ⋯ ⋯ ∗ ∗ 0 0 ⋯ ⋯ 0 r k − 1 , k − 1 0 0 ⋯ 0 0 0 ) = ( R k 0 T ) R k = ( r 0 , 0 r 0 , 1 r 0 , 2 ⋯ ⋯ 0 0 r 1 , 1 r 1 , 2 r 1 , 3 ⋯ 0 0 0 ⋯ ⋯ ∗ ∗ 0 0 ⋯ ⋯ 0 r k − 1 , k − 1 ) \left\{\begin{aligned} & R_{k + 1,k}=\left(\begin{array}{cccccc} r_{0,0} & r_{0,1} & r_{0,2} & \cdots & \cdots & 0\\ 0 & r_{1,1} & r_{1,2} & r_{1,3} & \cdots & 0 \\ 0 & 0 & \cdots & \cdots & *& *\\ 0 & 0 & \cdots & \cdots & 0 & r_{k - 1,k - 1}\\ 0 & 0 & \cdots & 0 & 0 & 0\\ \end{array}\right) =\left(\begin{array}{c} R_{k} \\ 0^T \\ \end{array}\right) \\ & R_{k}=\left(\begin{array}{cccccc} r_{0,0} & r_{0,1} & r_{0,2} & \cdots & \cdots & 0\\ 0 & r_{1,1} & r_{1,2} & r_{1,3} & \cdots & 0 \\ 0 & 0 & \cdots & \cdots & *& *\\ 0 & 0 & \cdots & \cdots & 0 & r_{k - 1,k - 1}\\ \end{array}\right) \end{aligned}\right. Rk+1,k=r0,00000r0,1r1,1000r0,2r1,2r1,300000rk1,k10=(Rk0T)Rk=r0,0000r0,1r1,100r0,2r1,2r1,3000rk1,k1
则根据 D k R k = Q k D_k R_k = Q_k DkRk=Qk,可以得到以下公式。
{ r 0 , 0 d 1 = q 1 , r 0 , 1 d 1 + r 1 , 1 d 2 = q 2 , ∑ s = 0 i − 1 r s , i − 1 d s + 1 = q i , i = 3 , 4 , 5 , … k − 1 , \left\{\begin{aligned} & r_{0,0} d_1 = q_1, \\ & r_{0,1} d_1 + r_{1,1} d_2 = q_2,\\ & \sum_{s = 0}^{i - 1} r_{s,i - 1} d_{s + 1} = q_i,i = 3,4,5,\ldots k - 1,\\ \end{aligned}\right. r0,0d1=q1,r0,1d1+r1,1d2=q2,s=0i1rs,i1ds+1=qi,i=3,4,5,k1,
从上述公式反解出 d i d_i di关于 q i q_i qi的表达式如下:
{ d 1 = q 1 r 0 , 0 , d 2 = ( q 2 − r 0 , 1 d 1 ) / r 1 , 1 , d i = ( q i − r i − 3 , i − 1 d i − 2 − r i − 2 , i − 1 d i − 1 ) / r i − 1 , i − 1 , \left\{\begin{aligned} & d_1 = \frac{q_1}{r_{0,0}}, \\ & d_2 = (q_2 - r_{0,1} d_1)/r_{1,1},\\ & d_i = (q_i - r_{i - 3, i - 1} d_{i - 2} - r_{i - 2,i - 1} d_{i - 1})/r_{i - 1,i - 1},\\ \end{aligned}\right. d1=r0,0q1,d2=(q2r0,1d1)/r1,1,di=(qiri3,i1di2ri2,i1di1)/ri1,i1,
由于 Q k = [ Q k − 1 , q k ] Q_k = [Q_{k - 1},q_k] Qk=[Qk1,qk] R k − 1 R_{k-1} Rk1 R k R_k Rk ( k − 1 ) (k-1) (k1)阶顺序主子阵,可以得到
{ D k = Q k R k − 1 = [ Q k − 1 , q k ] [ R k − 1 − 1 ∗ ∗ ] = [ D k − 1 , d k ] \left\{\begin{aligned} D_{k} &= Q_k R_{k}^{-1} \\ & = \left[Q_{k-1}, q_k\right]\left[\begin{array}{ll} R_{k-1}^{-1} & * \\ & * \end{array}\right]\\ & =\left[D_{k-1}, d_k\right] \end{aligned}\right. Dk=QkRk1=[Qk1,qk][Rk11]=[Dk1,dk]

a V k + 1 , k T e 1 a V_{k+1,k}^T e_1 aVk+1,kTe1的处理
由于 V k + 1 = [ V k + 1 , k , v k + 1 ] V_{k + 1} = [V_{k + 1,k},v_{k + 1}] Vk+1=[Vk+1,k,vk+1],根据下面这个公式可以有:
a V k + 1 T e 1 = ( V k + 1 , k T v k + 1 T ) ( a e 1 ) = ( V k + 1 , k T ( a e 1 ) v k + 1 T ( a e 1 ) ) = ( η ( k ) η ^ k + 1 ) a V_{k + 1}^T e_1=\left(\begin{array}{c} V_{k + 1,k}^T \\ v_{k + 1}^T \\ \end{array}\right) (ae_1)=\left(\begin{array}{c} V_{k + 1,k}^T (ae_1) \\ v_{k + 1}^T (ae_1)\\ \end{array}\right)=\left(\begin{array}{c} \eta^{(k)} \\ \hat{\eta}_{k+ 1}\\ \end{array}\right) aVk+1Te1=(Vk+1,kTvk+1T)(ae1)=(Vk+1,kT(ae1)vk+1T(ae1))=(η(k)η^k+1)
也就是说 a V k + 1 , k T e 1 a V_{k+1,k}^T e_1 aVk+1,kTe1 a V k + 1 T e 1 aV_{k + 1}^T e_1 aVk+1Te1的前 k k k个元素相同,我们记 η ( k ) = a V k + 1 , k T e 1 \eta^{(k)} = a V_{k+1,k}^T e_1 η(k)=aVk+1,kTe1,修改以后如上所示,因此转换完以后的二范数问题最优解\eqref{yk}的解是
y k = a R k − 1 V k + 1 , k T e 1 = R k − 1 η ( k ) . y^k = a R_{k}^{-1} V_{k+1,k}^T e_1 = R_{k}^{-1} \eta^{(k)}. yk=aRk1Vk+1,kTe1=Rk1η(k).
由于对 T k + 1 , k T_{k+1,k} Tk+1,k做QR分解的时候,利用Givens变换处理,根据上面推导过程得到的 V k V_{k} Vk其实也是 V k + 1 V_{k+1} Vk+1 k k k阶顺序主子阵,因此 V k + 1 T e 1 V_{k + 1}^T e_1 Vk+1Te1的前 k − 1 k - 1 k1个元素相同。
V k + 1 = [ V k 0 0 1 ] V_{k+1}=\left[\begin{array}{cc} V_k & 0 \\ 0 & 1 \end{array}\right] Vk+1=[Vk001]
也就是说 η ( k ) = [ η ( k − 1 ) , η k ] \eta^{(k)} = [\eta^{(k - 1)},\eta_k] η(k)=[η(k1),ηk],最后一直推导就有 η ( k ) = [ η 1 , η 2 , … , η k ] \eta^{(k)} = [\eta_1,\eta_2,\ldots,\eta_k] η(k)=[η1,η2,,ηk]
\subsection{ x k x^k xk计算公式和残量计算}
∙ \bullet \quad 最后得到下面这个递推公式,其中 d k d_k dk可以通过公式来递推得到,
{ x k = x 0 + Q k ( a R k − 1 V k + 1 , k T e 1 ) = x 0 + D k η ( k ) = x 0 + [ D k − 1 , d k ] [ η ( k − 1 ) η k ] = x 0 + D k − 1 η ( k − 1 ) + η k d k = x k − 1 + η k d k . \left\{\begin{aligned} x^k &= x^0 + Q_k (a R_{k}^{-1} V_{k+1,k}^T e_1) \\ &= x^0 + D_k \eta^{(k)} \\ &= x^0 + \left[D_{k-1}, d_k\right]\left[\begin{array}{c} \eta^{(k-1)} \\ \eta_k \end{array}\right] \\ & = x^0 + D_{k - 1} \eta^{(k-1)} + \eta_k d_k \\ &= x^{k - 1} + \eta_k d_k. \end{aligned}\right. xk=x0+Qk(aRk1Vk+1,kTe1)=x0+Dkη(k)=x0+[Dk1,dk][η(k1)ηk]=x0+Dk1η(k1)+ηkdk=xk1+ηkdk.
而根据上面的信息,我们知道 η k \eta_k ηk a V k + 1 T e 1 a V_{k + 1}^T e_1 aVk+1Te1的第 k k k个分量,根据下面的公式发现只需要将对应的Givens变换作用在 ( a e 1 ) (ae1) (ae1)即可得到 a V k + 1 T e 1 a V_{k + 1}^T e_1 aVk+1Te1
a V k + 1 T e 1 = V k + 1 T ( a e 1 ) = ( G k G ~ k − 1 ⋯ G ~ 1 ) ⊤ ( a e 1 ) . a V_{k + 1}^T e_1 = V_{k + 1}^T (ae1) = \left(G_k \tilde{G}_{k-1} \cdots \tilde{G}_1\right)^{\top} (ae1). aVk+1Te1=Vk+1T(ae1)=(GkG~k1G~1)(ae1).
∙ \bullet \quad 残量的计算如下所示,即残量最终是等式 a V k + 1 e 1 aV_{k+1}e_1 aVk+1e1的最后一个分量的绝对值:
{ ∥ r k ∥ 2 = ∥ A x k − b ∥ 2 = ∥ a q 1 − Q k + 1 T k + 1 , k y k ∥ 2 = ∥ Q k + 1 ( a e 1 − T k + 1 , k y k ) ∥ 2 = ∥ ( a e 1 − V k + 1 R k + 1 , k y k ) ∥ 2 = ∥ V k + 1 ( V k + 1 T a e 1 − R k + 1 , k y k ) ∥ 2 = ∥ ( V k + 1 T a e 1 − R k + 1 , k y k ) ∥ 2 = ∥ [ η ( k ) η ^ k + 1 ] − [ R k y k 0 ] ∥ 2 = ∣ η ^ k + 1 ∣ \left\{\begin{aligned} \|r_k\|_2 &= \|Ax^k - b\|_2 \\ &= \|aq_1 - Q_{k+1} T_{k+1,k} y^k\|_2 \\ &= \|Q_{k+1} (ae_1 - T_{k+1,k} y^k)\|_2 \\ &= \|(ae_1 - V_{k+1} R_{k+1,k} y^k)\|_2 \\ &= \|V_{k+1} (V_{k+1}^T ae_1 - R_{k+1,k} y^k)\|_2 \\ &= \|(V_{k+1}^T ae_1 - R_{k+1,k} y^k)\|_2 \\ &= \left\|\left[\begin{array}{c} \eta^{(k)} \\ \hat{\eta}_{k+1} \end{array}\right]-\left[\begin{array}{c} R_k y_k \\ 0 \end{array}\right]\right\|_2 \\ & = |\hat{\eta}_{k+1}| \end{aligned}\right. rk2=Axkb2=aq1Qk+1Tk+1,kyk2=Qk+1(ae1Tk+1,kyk)2=(ae1Vk+1Rk+1,kyk)2=Vk+1(Vk+1Tae1Rk+1,kyk)2=(Vk+1Tae1Rk+1,kyk)2=[η(k)η^k+1][Rkyk0]2=η^k+1

算法流程:前三次迭代过程解析

为了更方便理解算法流程,我们先考虑 x k , k = 3 x^k,k =3 xk,k=3的更新过程。

\newpage%------------------------
∙ x 3 = x 2 + η 3 d 3 \bullet \quad x^3 = x^2 + \eta_3 d_3 x3=x2+η3d3

⇒ d 3 = ( q 3 − r 2 , 3 d 2 − r 1 , 3 d 1 ) / r 2 , 2 , q 3 = ( A q 2 − β 1 q 1 ) / β 2 \Rightarrow \quad d_3 = (q_3 - r_{2,3} d_2 - r_{1,3} d_1)/r_{2,2},q_3 = (Aq_2 - \beta_1 q_1)/\beta_2 d3=(q3r2,3d2r1,3d1)/r2,2,q3=(Aq2β1q1)/β2

⇒ T 4 , 3 = ( T 3 β 3 e 3 T ) = ( α 1 β 1 0 β 1 α 2 β 2 0 β 2 α 3 0 0 β 3 ) \Rightarrow \quad T_{4,3} =\left(\begin{array}{c} T_3 \\ \beta_3 e_3^T \end{array}\right)=\left(\begin{array}{ccc} \alpha_1 & \beta_1 & 0\\ \beta_1 & \alpha_2 & \beta_2 \\ 0 & \beta_2 & \alpha_3 \\ 0 & 0 & \beta_3 \\ \end{array}\right) T4,3=(T3β3e3T)=α1β100β1α2β200β2α3β3

⇒ α 3 = ( q 3 , A q 3 ) , β 3 = ∥ A q 3 − β 2 q 2 − α 3 q 3 ∥ 2 \Rightarrow \quad \alpha_3 = (q_3,Aq_3),\beta_3 = \|Aq_3 - \beta_2 q_2 - \alpha_3 q_3 \|_2 α3=(q3,Aq3),β3=Aq3β2q2α3q32

先用Givens变换 G ~ 1 T 4 , 3 \tilde{G}_1 T_{4,3} G~1T4,3

⇒ [ c 1 s 1 0 0 − s 1 c 1 0 0 0 0 1 0 0 0 0 1 ] ( α 1 β 1 0 β 1 α 2 β 2 0 β 2 α 3 0 0 β 3 ) = [ r 0 , 0 r ^ 0 , 1 r ^ 0 , 2 ( 1 ) 0 r ^ 1 , 1 r ^ 1 , 2 ( 1 ) 0 β 2 α 3 0 0 β 3 ] \Rightarrow \quad \left[\begin{array}{cccc} c_{1} & s_{1} & 0 & 0\\ -s_{1} & c_{1} & 0 & 0\\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right] \left(\begin{array}{ccc} \alpha_1 & \beta_1 & 0\\ \beta_1 & \alpha_2 & \beta_2 \\ 0 & \beta_2 & \alpha_3 \\ 0 & 0 & \beta_3 \\ \end{array}\right) = \left[\begin{array}{ccc} r_{0,0} & \hat{r}_{0,1} & \hat{r}_{0,2}^{(1)}\\ 0 & \hat{r}_{1,1} & \hat{r}_{1,2}^{(1)}\\ 0 & \beta_2 & \alpha_3\\ 0 & 0 & \beta_{3} \end{array}\right] c1s100s1c10000100001α1β100β1α2β200β2α3β3=r0,0000r^0,1r^1,1β20r^0,2(1)r^1,2(1)α3β3,

⇒ r ^ 0 , 2 ( 1 ) = s 1 β 2 , r ^ 1 , 2 ( 1 ) = c 1 β 2 \Rightarrow \quad \hat{r}_{0,2}^{(1)} = s_1 \beta_2,\hat{r}_{1,2}^{(1)} = c_1 \beta_2 r^0,2(1)=s1β2,r^1,2(1)=c1β2

再用Givens变换 G ~ 2 G ~ 1 T 4 , 3 \tilde{G}_2 \tilde{G}_1 T_{4,3} G~2G~1T4,3,从上面更新 x 2 x^2 x2的过程我们知道 G ~ 2 \tilde{G}_2 G~2会把 [ r ^ 1 , 1 , β 2 ] T [\hat{r}_{1,1},\beta_2]^T [r^1,1,β2]T这部分变成 [ r 1 , 1 , 0 ] T [r_{1,1},0]^T [r1,1,0]T

⇒ [ 1 0 0 0 0 c 2 s 2 0 0 − s 2 c 2 0 0 0 0 1 ] [ r 0 , 0 r ^ 0 , 1 r ^ 0 , 2 ( 1 ) 0 r ^ 1 , 1 r ^ 1 , 2 ( 1 ) 0 β 2 α 3 0 0 β 3 ] = [ r 0 , 0 r ^ 0 , 1 r ^ 0 , 2 0 r ^ 1 , 1 r ^ 1 , 2 0 0 r ^ 2 , 2 0 0 β 3 ] \Rightarrow \quad \left[\begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & c_{2} & s_{2} & 0\\ 0 & -s_{2} & c_{2} & 0\\ 0 & 0 & 0 & 1 \end{array}\right] \left[\begin{array}{ccc} r_{0,0} & \hat{r}_{0,1} & \hat{r}_{0,2}^{(1)}\\ 0 & \hat{r}_{1,1} & \hat{r}_{1,2}^{(1)}\\ 0 & \beta_2 & \alpha_3\\ 0 & 0 & \beta_{3} \end{array}\right] = \left[\begin{array}{ccc} r_{0,0} & \hat{r}_{0,1} & \hat{r}_{0,2}\\ 0 & \hat{r}_{1,1} & \hat{r}_{1,2}\\ 0 & 0 & \hat{r}_{2,2}\\ 0 & 0 & \beta_3 \end{array}\right] 10000c2s200s2c200001r0,0000r^0,1r^1,1β20r^0,2(1)r^1,2(1)α3β3=r0,0000r^0,1r^1,100r^0,2r^1,2r^2,2β3

Givens变换把 [ r ^ 2 , 2 , β 3 ] T [\hat{r}_{2,2},\beta_3]^T [r^2,2,β3]T这部分变成 [ r 2 , 2 , 0 ] T [r_{2,2},0]^T [r2,2,0]T,选择 γ = r ^ 2 , 2 β 3 , s 3 = 1 1 + γ 2 , c 3 = γ s 3 \gamma = \frac{\hat{r}_{2,2}}{\beta_3},s_3 = \frac{1}{\sqrt{1 + \gamma^2}},c_3 = \gamma s_3 γ=β3r^2,2,s3=1+γ2 1,c3=γs3

⇒ [ r 0 , 0 r 0 , 1 r 0 , 2 0 r 1 , 1 r 1 , 2 0 0 r 2 , 2 0 0 0 ] = [ 1 0 0 0 0 1 0 0 0 0 c 3 s 3 0 0 − s 3 c 3 ] [ r 0 , 0 r ^ 0 , 1 r ^ 0 , 2 0 r ^ 1 , 1 r ^ 1 , 2 0 0 r ^ 2 , 2 0 0 β 3 ] \Rightarrow \quad \left[\begin{array}{ccc} r_{0,0} & r_{0,1} & r_{0,2} \\ 0 & r_{1,1} & r_{1,2} \\ 0 & 0 & r_{2,2} \\ 0 & 0 & 0 \end{array}\right] = \left[\begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & c_{3} & s_{3} \\ 0 & 0 & -s_{3} & c_{3} \end{array}\right] \left[\begin{array}{ccc} r_{0,0} & \hat{r}_{0,1} & \hat{r}_{0,2}\\ 0 & \hat{r}_{1,1} & \hat{r}_{1,2}\\ 0 & 0 & \hat{r}_{2,2}\\ 0 & 0 & \beta_3 \end{array}\right] r0,0000r0,1r1,100r0,2r1,2r2,20=1000010000c3s300s3c3r0,0000r^0,1r^1,100r^0,2r^1,2r^2,2β3,

⇒ [ η 1 , η 2 , η 3 ] = η ( 3 ) , [ η 1 η 2 η 3 η ^ 4 ] = V 4 T ( a e 1 ) = G 3 G ~ 2 G ~ 1 ( a e 1 ) , \Rightarrow \quad [\eta_1,\eta_2,\eta_3] = \eta^{(3)} ,\left[\begin{array}{c} \eta_1 \\ \eta_2 \\ \eta_3 \\ \hat{\eta}_{4} \end{array}\right] = V_{4}^{T} (ae_1) = G_3 \tilde{G}_2 \tilde{G}_1 (ae_1) , [η1,η2,η3]=η(3),η1η2η3η^4=V4T(ae1)=G3G~2G~1(ae1), \

⇒ [ η 1 η 2 η 3 η ^ 4 ] = [ 1 0 0 0 0 1 0 0 0 0 c 3 s 3 0 0 − s 3 c 3 ] [ η 1 η 2 η ^ 3 0 ] = [ η 1 η 2 c 3 η ^ 3 − s 3 η 3 ^ ] \Rightarrow \quad \left[\begin{array}{c} \eta_1 \\ \eta_2 \\ \eta_3 \\ \hat{\eta}_{4} \end{array}\right] = \left[\begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & c_{3} & s_{3} \\ 0 & 0 & -s_{3} & c_{3} \end{array}\right] \left[\begin{array}{c} \eta_1 \\ \eta_2 \\ \hat{\eta}_3 \\ 0 \end{array}\right] = \left[\begin{array}{c} \eta_1 \\ \eta_2 \\ c_3 \hat{\eta}_3 \\ -s_3 \hat{\eta_3} \end{array}\right] η1η2η3η^4=1000010000c3s300s3c3η1η2η^30=η1η2c3η^3s3η3^,

⇒ η 3 = c 3 η ^ 3 , r 2 , 2 = c 3 r ^ 2 , 2 + s 3 β 3 , r 0 , 2 = r ^ 0 , 2 , r 1 , 2 = r ^ 1 , 2 , d 3 = q 3 − r 0 , 2 d 1 − r 1 , 2 d 2 r 2 , 2 \Rightarrow \quad \boldsymbol{\eta_3 = c_3 \hat{\eta}_3,r_{2,2} =c_3 \hat{r}_{2,2} + s_3 \beta_3,r_{0,2} = \hat{r}_{0,2},r_{1,2} = \hat{r}_{1,2},d_3 = \frac{q_3 - r_{0,2}d_1 - r_{1,2} d_2 }{r_{2,2}} } η3=c3η^3,r2,2=c3r^2,2+s3β3,r0,2=r^0,2,r1,2=r^1,2,d3=r2,2q3r0,2d1r1,2d2,

⇒ x 3 = x 2 + η 3 d 3 \Rightarrow \quad x^3 = x^2 + \eta_3 d_3 x3=x2+η3d3

{ η 1 = a c 1 , d 1 = q 1 / r 0 , 0 , q 1 = r 0 / a = ( A x 0 − b ) / a , a = ∥ r 0 ∥ 2 , r 0 , 0 = α 1 c 1 + β 1 s 1 , x 1 = x 0 + η 1 d 1 , η ^ 2 = − a s 1 . \left\{\begin{aligned} & \eta_1 = a c_1,\\ & d_1 = q_1/r_{0,0},\\ & q_1 = r^0/a = (Ax^0 - b)/a, a = \|r^0\|_2,\\ & r_{0,0} = \alpha_1 c_1 + \beta_1 s_1,\\ & x^1 = x^0 + \eta_1 d_1,\\ & \hat{\eta}_2 = -a s_1. \end{aligned}\right. η1=ac1,d1=q1/r0,0,q1=r0/a=(Ax0b)/a,a=r02,r0,0=α1c1+β1s1,x1=x0+η1d1,η^2=as1.

{ η 2 = c 2 η ^ 2 , d 2 = ( q 2 − r 0 , 1 d 1 ) / r 1 , 1 , q 2 = ( A q 1 − α 1 q 1 ) / β 1 , r 0 , 1 = r ^ 0 , 1 = c 1 β 1 + s 1 α 2 , r 1 , 1 = c 2 r ^ 1 , 1 + s 2 β 2 , r ^ 1 , 1 = − s 1 β 1 + c 1 α 2 , x 2 = x 1 + η 2 d 2 , η ^ 3 = − s 2 η ^ 2 . \left\{\begin{aligned} & \eta_2 = c_2 \hat{\eta}_2,\\ & d_2 = (q_2 - r_{0,1} d_1)/r_{1,1},\\ & q_2 = (Aq_1 - \alpha_1 q_1)/\beta_1,\\ & r_{0,1} = \hat{r}_{0,1} = c_1 \beta_1 + s_1 \alpha_2,\\ & r_{1,1} = c_2 \hat{r}_{1,1} + s_2 \beta_2,\hat{r}_{1,1} = -s_1 \beta_1 + c_1 \alpha_2, \\ & x^2 = x^1 + \eta_2 d_2,\\ & \hat{\eta}_3 = -s_2 \hat{\eta}_2. \end{aligned}\right. η2=c2η^2,d2=(q2r0,1d1)/r1,1,q2=(Aq1α1q1)/β1,r0,1=r^0,1=c1β1+s1α2,r1,1=c2r^1,1+s2β2,r^1,1=s1β1+c1α2,x2=x1+η2d2,η^3=s2η^2.

{ η 3 = c 3 η ^ 3 , d 3 = ( q 3 − r 0 , 2 d 1 − r 1 , 2 d 2 ) / r 2 , 2 , q 3 = ( A q 2 − β 1 q 1 − α 2 q 2 ) / β 2 , r 0 , 2 = s 1 β 2 , r 1 , 2 = c 1 β 2 , r 2 , 2 = c 3 r ^ 2 , 2 + s 3 β 3 , r ^ 2 , 2 = − s 2 r ^ 1 , 2 ( 1 ) + c 2 α 3 , r ^ 1 , 2 ( 1 ) = c 1 β 2 , x 2 = x 1 + η 2 d 2 , η ^ 3 = − s 3 η ^ 3 . \left\{\begin{aligned} & \eta_3 = c_3 \hat{\eta}_3,\\ & d_3 = (q_3 - r_{0,2} d_1 - r_{1,2} d_2)/r_{2,2},\\ & q_3 = (Aq_2 - \beta_1 q_1 - \alpha_2 q_2)/\beta_2,\\ & r_{0,2} = s_1 \beta_2,r_{1,2} = c_1 \beta_2,\\ & r_{2,2} = c_3 \hat{r}_{2,2} + s_3 \beta_3,\hat{r}_{2,2} = -s_2 \hat{r}_{1,2}^{(1)} + c_2 \alpha_3, \hat{r}_{1,2}^{(1)} = c_1 \beta_2,\\ & x^2 = x^1 + \eta_2 d_2,\\ & \hat{\eta}_3 = -s_3 \hat{\eta}_3. \end{aligned}\right. η3=c3η^3,d3=(q3r0,2d1r1,2d2)/r2,2,q3=(Aq2β1q1α2q2)/β2,r0,2=s1β2,r1,2=c1β2,r2,2=c3r^2,2+s3β3,r^2,2=s2r^1,2(1)+c2α3,r^1,2(1)=c1β2,x2=x1+η2d2,η^3=s3η^3.
通过前三个变量的更新过程,我们可以发现 R k + 1 , k R_{k+1,k} Rk+1,k的最后一列其实就是 G k G ~ k − 1 … G ~ 1 G_k \tilde{G}_{k-1} \ldots \tilde{G}_1 GkG~k1G~1作用在 T k + 1 , k T_{k+1,k} Tk+1,k最后一列得到的,然后我们知道 T k + 1 , k T_{k+1,k} Tk+1,k最后一列是 [ 0 , … , 0 , β k − 1 , α k , β k ] T [0,\ldots,0,\beta_{k-1},\alpha_k,\beta_k]^T [0,,0,βk1,αk,βk]T以及 G i G_i Gi只改变第 i , i + 1 i,i+1 i,i+1行元素,所以我们有:\

[ 0 ⋮ 0 r k − 3 , k − 1 r k − 2 , k − 1 r k − 1 , k − 1 0 ] = G k G ~ k − 1 G ~ k − 2 [ 0 ⋮ 0 β k − 1 α k β k ] , k ≥ 3 \left[\begin{array}{c} 0 \\ \vdots \\ 0 \\ r_{k - 3,k - 1} \\ r_{k - 2,k - 1} \\ r_{k - 1,k - 1} \\ 0 \end{array}\right] = G_k \tilde{G}_{k-1} \tilde{G}_{k-2} \left[\begin{array}{c} 0 \\ \vdots \\ 0 \\ \beta_{k-1} \\ \alpha_k \\ \beta_k \end{array}\right] ,k \geq 3 00rk3,k1rk2,k1rk1,k10=GkG~k1G~k200βk1αkβk,k3 \

[ r k − 3 , k − 1 r k − 2 , k − 1 r k − 1 , k − 1 0 ] = G k G ~ k − 1 G ~ k − 2 [ 0 β k − 1 α k β k ] = G k G ~ k − 1 [ r k − 3 , k − 1 β ^ k − 1 α k β k ] = G k [ r k − 3 , k − 1 r k − 2 , k − 1 α ^ k β k ] = [ r k − 3 , k − 1 r k − 2 , k − 1 r k − 1 , k − 1 0 ] , k ≥ 3 \left[\begin{array}{c} r_{k - 3,k - 1} \\ r_{k - 2,k - 1} \\ r_{k - 1,k - 1} \\ 0 \end{array}\right] = G_k \tilde{G}_{k-1} \tilde{G}_{k-2} \left[\begin{array}{c} 0 \\ \beta_{k-1} \\ \alpha_k \\ \beta_k \end{array}\right] = G_k \tilde{G}_{k-1} \left[\begin{array}{c} r_{k - 3,k - 1} \\ \hat{\beta}_{k-1} \\ \alpha_k \\ \beta_k \end{array}\right] = G_k \left[\begin{array}{c} r_{k - 3,k - 1} \\ r_{k - 2,k - 1} \\ \hat{\alpha}_k \\ \beta_k \end{array}\right] = \left[\begin{array}{c} r_{k - 3,k - 1} \\ r_{k - 2,k - 1} \\ r_{k - 1,k - 1} \\ 0 \end{array}\right],k \geq 3 rk3,k1rk2,k1rk1,k10=GkG~k1G~k20βk1αkβk=GkG~k1rk3,k1β^k1αkβk=Gkrk3,k1rk2,k1α^kβk=rk3,k1rk2,k1rk1,k10,k3

{ η k = c k η ^ k , d k = ( q k − r k − 3 , k − 1 d k − 2 − r k − 2 , k − 1 d k − 1 ) / r k − 1 , k − 1 , q k = ( A q k − 1 − β k − 2 q k − 2 − α k − 1 q k − 1 ) / β k − 1 , r k − 3 , k − 1 = s k − 2 β k − 1 , r k − 2 , k − 1 = c k − 1 β ^ k − 1 + s k − 1 α k , β ^ k − 1 = c k − 2 β k − 1 , r k − 1 , k − 1 = c k α ^ k + s k β k , α ^ k = − s k − 1 β ^ k + c k − 1 α k , x k = x k − 1 + η k d k , η ^ k + 1 = − s k η ^ k . \left\{\begin{aligned} & \eta_k = c_k \hat{\eta}_k,\\ & d_k = (q_k - r_{k - 3,k - 1} d_{k - 2} - r_{k - 2,k - 1} d_{k - 1})/r_{k-1,k-1},\\ & q_k = (Aq_{k-1} - \beta_{k-2} q_{k-2} - \alpha_{k-1} q_{k-1})/\beta_{k-1},\\ & r_{k - 3,k - 1} = s_{k - 2} \beta_{k-1},\\ & r_{k - 2,k - 1} = c_{k-1} \hat{\beta}_{k-1} + s_{k-1} \alpha_k,\hat{\beta}_{k - 1} = c_{k-2} \beta_{k-1},\\ & r_{k - 1,k - 1} = c_k \hat{\alpha}_k + s_k \beta_k ,\hat{\alpha}_k = -s_{k-1} \hat{\beta}_k + c_{k-1} \alpha_k, \\ & x^{k} = x^{k-1} + \eta_k d_k,\\ & \hat{\eta}_{k+1} = -s_{k} \hat{\eta}_{k}. \end{aligned}\right. ηk=ckη^k,dk=(qkrk3,k1dk2rk2,k1dk1)/rk1,k1,qk=(Aqk1βk2qk2αk1qk1)/βk1,rk3,k1=sk2βk1,rk2,k1=ck1β^k1+sk1αk,β^k1=ck2βk1,rk1,k1=ckα^k+skβk,α^k=sk1β^k+ck1αk,xk=xk1+ηkdk,η^k+1=skη^k.
在这里插入图片描述

详细代码以及介绍参考本人知乎添加链接描述

import numpy as np
import time
N = 1000
A = np.zeros([N,N])
penalty = 10
for i in range(N):
    for j in range(i + 1,N):
        A[i,j] = np.random.rand(1)
        A[j,i] = A[i,j]
    A[i,i] = N + penalty*abs(np.random.rand(1))#主对角占优,确保非奇异
#print(A)
x = np.random.rand(N,1)
b = A@x

def MINRES(A,b,x0,N,eps):

    r = b - A@x0
    a = np.linalg.norm(r)
    # q_old = q_{k-1},q_new = q_{k},c_old = c_{k-2},c_mid = c_{k-1},c_new = c_k
    q_old = 0*r.copy();q_new = r/a
    d_old = 0*r.copy();d_mid = 0*r.copy()
    xi_old = a;beta_old = 0
    r_old = 0;r_mid = 0
    c_old = 0;c_mid = 0
    s_old = 0;s_mid = 0
    ls = np.zeros([N,N])
    for k in range(N):
        w = A@q_new - beta_old*q_old
        alpha = np.dot(w.T,q_new)[0,0]
        w = w - alpha*q_new
        beta_new = np.linalg.norm(w)
        
        if k == 0:
            alpha_hat = alpha
        elif k == 1:
            r_mid = c_mid*beta_old + s_mid*alpha
            alpha_hat = -s_mid*beta_old + c_mid*alpha
        else:
            r_old = s_old*beta_old
            beta_hat = c_old*beta_old
            
            r_mid = c_mid*beta_hat + s_mid*alpha
            alpha_hat = -s_mid*beta_hat + c_mid*alpha
        if abs(alpha_hat) > abs(beta_new):
            gamma = beta_new/alpha_hat
            c_new = 1.0/np.sqrt(1 + gamma**2);s_new = c_new*gamma
        else:
            gamma = alpha_hat/beta_new
            s_new = 1.0/np.sqrt(1 + gamma**2);c_new = s_new*gamma
        
        r_new = c_new*alpha_hat + s_new*beta_new
        
        xi_new = -s_new*xi_old
        xi_old = c_new*xi_old
        
        d_new = (q_new - r_old*d_old - r_mid*d_mid)/r_new
        x0 += xi_old*d_new
        print('res:%.2e,real res:%.2e'%(abs(xi_new),np.linalg.norm(b - A@x0)))
        ls[:,k:k + 1] = q_new
        if abs(xi_new) < eps:
            break
        else:
            xi_old = xi_new
            q_old = q_new.copy()
            q_new = w.copy()/beta_new
            
            beta_old = beta_new
            c_old = c_mid
            c_mid = c_new
            s_old = s_mid
            s_mid = s_new
            
            r_old = r_mid
            r_mid = r_new
            
            d_old = d_mid.copy()
            d_mid = d_new.copy()
            
            #print(w,beta_new)
            
            
            
    if abs(xi_new) < eps:
        print('success')
    else:
        print('fail')
    return x0,ls
min_t0 = time.time()
x0 = np.random.rand(N,1)

eps = 1e-7 
x_p,ls = MINRES(A,b,x0,N,eps) 
min_ela = time.time() - min_t0
print('time:%.2f,err:%.2e'%(min_ela,max(abs(x_p - x))))

min_t0 = time.time()
xp = np.linalg.solve(A,b)
min_ela = time.time() - min_t0
print('time:%.2f,err:%.2e'%(min_ela,max(abs(xp - x))))


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在无控制点的条件下如何用RTK定线定位

作为测量人的你&#xff0c;是否遇到过暂时没有测区范围内的控制点资料&#xff0c;或者虽然有控制点资料&#xff0c;但没有这些点的 WGS84坐标的情况&#xff1f;这时候如何处理呢&#xff1f; 其实在没有控制点的情况下&#xff0c;可以利用RTK技术提供的在任意点上地方化功…

JavaSe-泛型机制详解

1 理解泛型的本质 JDK 1.5开始引入Java泛型&#xff08;generics&#xff09;这个特性&#xff0c;该特性提供了编译时类型安全检测机制&#xff0c;允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型&#xff0c;即给类型指定一个参数&#xff0c;然后在使用时再…

2022最后一个月如何快速发表一篇SCI

距2022年结束仅剩不到1个月&#xff0c;年终考核迫在眉睫&#xff0c;您的年初计划是否都已完成&#xff1f;2023年的科研计划是否也已提上日程&#xff1f;想要在2023年论文发表快人一步&#xff0c;早安排才是关键&#xff01; 进入12月&#xff0c;我处EA-ISET协会重点SCI/…

基于jsp+mysql+ssm手机综合类门户网站-计算机毕业设计

项目介绍 手机综合类门户网站采用ssm框架和eclipse编辑器、MySQL数据库设计并实现的,主要包括系统手机评测管理模块、文章管理模块、手机新闻管理、所有评论管理、登录模块、和退出模块等多个模块。 管理员的登录模块&#xff1a;管理员登录系统对本系统其他管理模块进行管理。…

vue3 速成教程(上)

学 vue3 通过官方文档更详细&#xff0c;不过阅读本博客&#xff0c;可以更容易理解&#xff0c;且帮你速成&#xff01; 官方文档&#xff08;记得将API风格偏好切换为 组合式 否则你学的是vue2&#xff09; https://cn.vuejs.org/guide/introduction.html 学习前的准备 创建…

HBase的读写流程

HBase的读流程 客户端从zk获取.META.表所在的regionserver&#xff1b;去对应的regionserver读取.META.表&#xff0c;获取region所在信息&#xff08;region在哪个regionserver上保存的信息&#xff09;&#xff1b;客户端到了regionserver时&#xff0c;先找到region&#xf…

MongoDB聚合小tips

MongoDB对于嵌套&#xff08;Embedded&#xff09;数组的过滤 首先定义下结构 {"play_id": "639045efae627e2aacf35dce","region_id": 1106,"point_list": [{"id": "1faf5aa9-e262-45fe-96dd-64395c96cf5c",&qu…

Allegro如何检查过孔是否重叠的四种方法操作指导

Allegro如何检查过孔是否重叠的四种方法操作指导 Allegro可以检查过孔是否重叠,避免重孔的情况的出现,具体检查方法如下 一.非同名网络过孔重叠 以下图为例 打开DRC开关,EnableDRC 打开Constraints-Mode 打开Spacing规则via的规则 可以看到非同名网络过孔,孔重叠在一…

C#多线程之Thread,ThreadPool,Task,Parallel

总目录 文章目录总目录前言一、多线程以及与之相关概念1.基本概念1&#xff09;进程2&#xff09;线程3&#xff09;多线程2.同步、异步1&#xff09;同步方法2&#xff09;异步方法二、Thread1.线程的使用1&#xff09;创建并开启线程2&#xff09;线程的属性设置&方法调用…

【微电网】具有柔性结构的孤岛直流微电网的分级控制(Malab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

carsim/trucksim获取轮胎侧偏刚度、纵向刚度

本文参考&#xff1a;https://blog.csdn.net/weixin_44902384/article/details/107926814 这个方法适应计算侧偏刚度、纵向刚度&#xff0c;因为魔术公式里y 可以代表侧向力、纵向力 针对上面的内容&#xff0c;有两个问题需要解释。1是魔术公式轮胎中 有的是tan-1 有的是ar…

[Linux]------线程池的模拟实现和读者写者锁问题

文章目录前言一、线程池二、线程安全的单例模式什么是单例模式什么是设计模式单例模式的特点三、STL&#xff0c;智能指针和线程安全STL中的容器是否是线程安全的&#xff1f;智能指针是否是线程安全的&#xff1f;四、其他常见的各种锁五、读者写者问题读写锁读写锁接口初始化…

云开发智能家居客户案例详解(内附拓扑图)

万物互联&#xff0c;大至全世界&#xff0c;小至一间房&#xff0c;物联网和云计算技术的高速发展使得住宅变得愈发智能化。 在“互联网”时代&#xff0c;智能家居开始走入千家万户&#xff0c;不断提升着家居生活的安全性、舒适型、便利性和环保性&#xff0c;逐渐变成人们…

Linux 用户权限

用户权限1、访问权限2、chmod 命令3、chown 命令4、chgrp命令5、权限掩码6、lsattr 命令7、chattr命令8、文件的特别权限suid权限set位权限粘滞位权限&#xff08;Sticky&#xff09;9、ACL访问控制列表setfacl命令getfacl命令示例10、sudo11、SELinux1、访问权限 shell在创建…

SpringBoot2学习笔记--入门及HelloWorld

SpringBoot2学习笔记--入门及HelloWorld1 系统要求1.1、maven设置2、HelloWorld2.1、创建maven工程2.2、引入依赖2.3、创建主程序2.4、编写业务2.5、测试2.6、简化配置2.7、简化部署1 系统要求 ● Java 8 & 兼容java14 . ● Maven 3.3 ● idea 2019.1.2 1.1、maven设置 …

Java版 剑指offer笔记(一)

1.数组中重复的数字 思路1&#xff1a; 使用哈希表&#xff0c;哈希表是一种根据关键码&#xff08;key&#xff09;直接访问值&#xff08;value&#xff09;的一种数据结构。而这种直接访问意味着只要知道key就能在O(1)时间内得到value&#xff0c;因此哈希表常用来统计频率…

软件测试有哪些常用的测试方法?

软件测试是软件开发过程中重要组成部分&#xff0c;是用来确认一个程序的质量或者性能是否符合开发之前提出的一些要求。软件测试的目的有两方面&#xff0c;一方面是确认软件的质量&#xff0c;另一方面是提供信息&#xff0c;例如&#xff0c;给开发人员或者程序经理反馈意见…

4.MyBatis映射

需求分析 1.订单商品数据模型 (1).表 用户表user:记录了购买商品的用户信息 订单表orders:记录了用户所创建的订单信息 订单明细表orderdetail:记录了订单的详细信息 商品表item:记录了商品详细信息 (2).表与表之间的业务关系 在分析表与表之间的业务关系时&#xff0c;需要建…

Nginx的反向代理和负载均衡

Nginx&#xff1a; Nginx作为面试中的大…小头目&#xff0c;自然是不能忽视的&#xff0c;而以下两点就是它能成为面试中头目的招牌。 反向代理和负载均衡 在此之前&#xff0c;我们先对Nginx做一个简单的了解 Nginx概述&#xff1a; Nginx (engine x) 是一个高性能的HTTP…

Ansible——inventory 主机清单

Ansible——inventory 主机清单Ansible——inventory 主机清单inventory简介ansible配置文件的优先级ansible命令常用参数主机清单文件hosts&#xff08;/etc/ansible/hosts&#xff09;通过列表的方式标识主机范围指定主机端口使用主机名表示主机范围inventory 中的变量主机变…