Bootstrap

工程计算——求解线性方程组AX=b

线性方程组的数值解法

在这里插入图片描述

在科学工程计算中,我们常通过直接法和迭代法求解线性方程组: A X = b AX = b AX=b其中 A ∈ R n × n A\in R^{n\times n} ARn×n为非奇异矩阵,且
A = ( a 11 a 12 … a 1 n a 21 a 22 … a 2 n ⋮ ⋮ ⋮ a n 1 a n 2 … a n n ) , X = ( x 1 x 2 ⋮ x n ) , b = ( b 1 b 2 ⋮ b n ) A=\begin{pmatrix}a_{11}&a_{12}&\dots&a_{1n}\\ a_{21}&a_{22}&\dots&a_{2n}\\\vdots&\vdots&&\vdots\\a_{n1}&a_{n2}&\dots&a_{nn}\end{pmatrix} , X = \begin{pmatrix}x_1\\ x_2\\\vdots\\ x_n\end{pmatrix},b=\begin{pmatrix}b_1\\ b_2 \\ \vdots \\b_n\end{pmatrix} A=a11a21an1a12a22an2a1na2nann,X=x1x2xn,b=b1b2bn

直接法

在这里插入图片描述

高斯消元法

在这里插入图片描述

顺序消元法

为了更加直观的体现消元过程,我们举一个三维矩阵的例子:
( 3 2 1 2 1 4 1 3 6 ) ( m 1 m 2 m 3 ) = ( x 1 x 2 x 3 ) 对 应 增 广 矩 阵 : ( 3 2 1 ∣ m 1 2 1 4 ∣ m 2 1 3 6 ∣ m 3 ) 接 下 来 主 要 针 对 系 数 矩 阵 对 应 的 子 矩 阵 来 体 现 顺 序 消 元 的 过 程 : ( 3 2 1 ∣ m 1 2 1 4 ∣ m 2 1 3 6 ∣ m 3 ) ⇒ ( 3 2 1 ∣ m 11 2 + 3 × ( − 2 3 ) 1 + 2 × ( − 2 3 ) 4 + 1 × ( − 2 3 ) ∣ m 21 1 + 3 × ( − 1 3 ) 3 + 2 × ( − 1 3 ) 6 + 1 × ( − 1 3 ) ∣ m 31 ) = ( 3 2 1 ∣ m 11 0 − 1 3 10 3 ∣ m 21 0 7 3 17 3 ∣ m 31 ) ⇒ ( 3 2 1 ∣ m 12 0 − 1 3 10 3 ∣ m 22 0 7 3 + ( − 1 3 ) × 7 17 3 + 10 3 × 7 ) ∣ m 32 ) = ( 3 2 1 ∣ m 12 0 − 1 3 10 3 ∣ m 22 0 0 29 ∣ m 32 ) \begin{pmatrix} 3&2&1\\ 2&1&4\\ 1&3&6\end{pmatrix}\begin{pmatrix} m_1\\ m_2\\ m_3\end{pmatrix} = \begin{pmatrix} x_1\\ x_2 \\ x_3\end{pmatrix} \\对应增广矩阵:\begin{pmatrix} 3&2&1| &m_1\\ 2&1&4|&m_2\\ 1&3&6|&m_3\end{pmatrix}\\接下来主要针对系数矩阵对应的子矩阵来体现顺序消元的过程: \\ \begin{pmatrix} 3&2&1| &m_1\\ 2&1&4|&m_2\\ 1&3&6|&m_3\end{pmatrix} \Rightarrow \begin{pmatrix} 3&2&1&|m_{11}\\ {2+3\times (-\frac{2}{3})}&{1+2\times (-\frac{2}{3})}&4+1\times (-\frac{2}{3})&|m_{21}\\ 1+3\times (-\frac{1}{3})&3+2\times (-\frac{1}{3})&6+1\times (-\frac{1}{3})&|m_{31}\end{pmatrix} \\ =\begin{pmatrix} 3&2&1&|m_{11}\\0&-\frac{1}{3}&\frac{10}{3}&|m_{21}\\0&\frac{7}{3}&\frac{17}{3}&|m_{31}\end{pmatrix} \\ \Rightarrow \begin{pmatrix} 3&2&1&|m_{12}\\0&-\frac{1}{3}&\frac{10}{3}&|m_{22}\\0&{\frac{7}{3}+(-\frac{1}{3})\times 7}&\frac{17}{3}+\frac{10}{3}\times 7)&|m_{32}\end{pmatrix} \\ =\begin{pmatrix} 3&2&1&|m_{12}\\0&-\frac{1}{3}&\frac{10}{3}&|m_{22}\\0&0&29&|m_{32}\end{pmatrix} 321213146m1m2m3=x1x2x3广321213146m1m2m3321213146m1m2m332+3×(32)1+3×(31)21+2×(32)3+2×(31)14+1×(32)6+1×(31)m11m21m31=300231371310317m11m21m3130023137+(31)×71310317+310×7)m12m22m32=3002310131029m12m22m32
“前推”(方法核心)至此结束,之后进行“回代”即可得到线性方程组的解 X = ( x 1 x 2 x 3 ) T X=\begin{pmatrix}x_1&x_2&x_3\end{pmatrix}^T X=(x1x2x3)T
由此思路可以推广到到 n n n维的一般情况。

为避免在消元过程中主元为零或绝对值很小的情况,我们对Gauss消元法进行改进—— 完全选主元法选列主元法诞生

完全选主元法

假设线性方程组:
( 1 2 3 4 5 6 7 8 9 ) ( m 1 m 2 m 3 ) = ( x 1 x 2 x 3 ) \begin{pmatrix} 1&2&3\\ 4&5&6\\ 7&8&9 \end{pmatrix} \begin{pmatrix} m_1\\ m_2\\ m_3 \end{pmatrix}= \begin{pmatrix} x_1\\ x_2\\ x_3 \end{pmatrix} 147258369m1m2m3=x1x2x3
我们要用完全选主元法来求解。
利用下述过程来体现完全选主元的核心思想:
在这里插入图片描述

之后进行“回代”求解即可。

选列主元法

仍假设线性方程组:
( 1 2 3 4 5 6 7 8 9 ) ( m 1 m 2 m 3 ) = ( x 1 x 2 x 3 ) \begin{pmatrix} 1&2&3\\ 4&5&6\\ 7&8&9 \end{pmatrix} \begin{pmatrix} m_1\\ m_2\\ m_3 \end{pmatrix}= \begin{pmatrix} x_1\\ x_2\\ x_3 \end{pmatrix} 147258369m1m2m3=x1x2x3
我们要用选列主元法来求解。
利用下述过程来体现选列主元的核心思想:
在这里插入图片描述

之后进行“回代”求解即可。

比较全选主元法和选列主元法,我们很容易发现后者在运算量上更小,选列主元法是更优的Gauss消元法。
在Gauss顺序消元法的基础上我们进一步引进了Doolittle分解法。Doolittle分解法将系数矩阵转化为上三角矩阵和下三角矩阵,节省了Gauss消元过程所需的大量时间和空间。接下来让我们进一步探索Doolittle分解法。

Doolittle分解法

通过Gauss顺序消元法推得Doolittle分解法的过程,我们可以得到:

定理一:
Gauss顺序消元过程中主元素 a k k ( k )   ,   ( k = 1 , 2 , … , m ) ⇔ a_{kk}^{(k)} \, ,\, (k=1,2,\dots ,m)\Leftrightarrow akk(k),(k=1,2,,m)待求解线性方程组的系数矩阵 A A A k k k阶顺序主子阵 d e t ( A k ) det(A_k) det(Ak)均非奇异
定理二:
若矩阵 A ∈ R n × n A\in R^{n\times n} ARn×n的顺序主子式 d e t ( A i ) ≠ 0   ,   ( i = 1 , 2 , … , n ) det(A_i)\ne 0\, ,\, (i=1,2,\dots ,n) det(Ai)=0,(i=1,2,,n),则存在唯一的单位下三角矩阵L及上三角矩阵 U U U,使得 A = L U A=LU A=LU成立

求解过程:
对 A X = b : L Y = b ⇒ Y = ( y 1 , y 2 , … , y n ) T ⇒ U X = Y ⇒ X 对AX=b:LY=b\Rightarrow Y=(y_1,y_2,\dots ,y_n)^T\Rightarrow UX=Y \Rightarrow X AX=bLY=bY=(y1,y2,,yn)TUX=YX
对应的MatLab程序:

function x=LUX(A,b)
[n,n]=size(A);
L=zeros(n);U=zeros(n);%用与A相同维度的零矩阵为L、U赋初值
x=zeros(n,1);y=zeros(n,1);
for r=1:n
    for i=r:n
        U(r,i)=A(r,i)-sum(L(r,1:r-1).*U(1:r-1,i)');
        L(i,r)=(A(i,r)-sum(L(i,1:r-1).*U(1:r-1,r)'))/U(r,r);
    end
end

  L,U

for i=1:n
    y(i)=b(i)-sum(L(i,1:i-1).*y(1:i-1)');
end

for j=n:-1:1
    x(j)=(y(j)-sum(U(j,j+1:n).*x(j+1:n)'))/U(j,j);
end
  x
end

矩阵非奇异:方阵且行列式不为0.

Cholesky分解法

Cholesky分解定理:
若矩阵 A A A为对称正定矩阵,则存在一个对角元均为正数的下三角矩阵 L ∈ R n × n L\in R^{n\times n} LRn×n使得 A = L L T A=LL^T A=LLT其中 L L L称为 A A A的Cholesky因子。

最初的 Cholesky分解法

由系数矩阵 A A A为对称正定矩阵,可得 A A A的所有主子式均为对称正定矩阵。
结合Doolittle分解法 定理2我们可得:
存在唯一单位下三角形矩阵 L ~ = ( l i j ) \tilde{L}=(l_{ij}) L~=(lij)及上三角矩阵 U = ( u i j ) U=(u_{ij}) U=(uij)使得 A = L ~ U A=\tilde{L}U A=L~U
记: D = d i a g ( u 11 , u 22 , … , u n n ) D=diag(u_{11},u_{22},\dots,u_{nn}) D=diag(u11,u22,,unn)
U ~ = D − 1 U \tilde{U}=D^{-1}U U~=D1U
进一步我们可以得到:
U ~ T D L ~ T = ( L ~ U ) T = A T = A = L ~ D U ~ \tilde{U}^TD\tilde{L}^T=(\tilde{L}U)^T=A^T=A=\tilde {L} D\tilde {U} U~TDL~T=(L~U)T=AT=A=L~DU~
U ~ T D L ~ = L ~ D U ~ ⇒ U ~ = L ~ T \tilde {U}^TD\tilde{L}=\tilde{L}D\tilde{U}\Rightarrow \tilde{U}=\tilde{L}^T U~TDL~=L~DU~U~=L~T我们可以得到: A = L ~ D L ~ T A=\tilde{L}D\tilde{L}^T A=L~DL~T
L = L ~ d i a g ( u 11 , u 22 , … , u n n ) , ( l i i = u i i , i = 1 , 2 , … , n ) L=\tilde{L}diag(\sqrt{u_{11}},\sqrt{u_{22}},\dots,\sqrt{u_{nn}}),(l_{ii}=\sqrt{u_{ii}},i=1,2,\dots,n) L=L~diag(u11 ,u22 ,,unn ),(lii=uii ,i=1,2,,n)
A = L L T A=LL^T A=LLT进一步可得:
a i j = ∑ p = 1 j l i p l j p     ( 1 ≤ j ≤ i ≤ n )    记 作 ( 5 ) 式 a_{ij}=\sum\limits_{p=1}^jl{ip}l{jp} \ \ \ (1\le j\le i\le n) \,\, 记作(5)式 aij=p=1jlipljp   (1jin)5
依据 ( 5 ) (5) (5)按列依次计算 L = ( l i j ) L=(l_{ij}) L=(lij),计算思路如下:
在这里插入图片描述

Step 2 \text{Step 2} Step 2中,由于使用了开方运算会占用大量运算时间,我们转换思路:
A = L L T ⇒ A = L ~ D L ~ T ⇒ A = L D L T A=LL^T \Rightarrow A=\tilde{L}D\tilde L^T\Rightarrow A=LDL^T A=LLTA=L~DL~TA=LDLT
接下来介绍基于 A = L D L T A=LDL^T A=LDLT所得的改进的Cholesky分解法

改进的 Cholesky分解法

A = L D L T 其 中 : L = ( l i j ) 为 单 位 下 三 角 矩 阵 D = d i a g ( d 1 , d 2 , … , d n ) > 0 A=LDL^T\\其中: \\ L=(l_{ij})为单位下三角矩阵 \\ D=diag(d_1,d_2,\dots,d_n) >0 A=LDLTL=(lij)D=diag(d1,d2,,dn)>0
a i j = ∑ k = 1 j − 1 l i k d k l j k + l i j d j , 1 ≤ j ≤ i ≤ n    记 作 ( 6 ) 式 a_{ij}=\sum\limits_{k=1}^{j-1}l_{ik}d_{k}l_{jk}+l_{ij}d_{j},1\le j\le i\le n \,\,记作(6)式 aij=k=1j1likdkljk+lijdj,1jin6
根据 ( 6 ) (6) (6)按列计算 L = ( l i j ) L=(l_{ij}) L=(lij),计算思路如下:
在这里插入图片描述

对应的MatLab程序:

function x=cholesky(a,b)
n=length(b); 
v=zeros(n); 
x=zeros(n,1);
y=zeros(n,1);
for j=1:n
   for i= 1:j-1 
       v(j,i)=a(j,i)*a(i,i);
   end
   a(j,j)=a(j,j)-a(j,1:j-1)*v(j,1:j-1)';
   a(j+1:n,j)=(a(j+1:n,j)-a(j+1:n,1:j-1)*v(j,1:j-1)')/a(j,j);
end
  L=tril(a,-1)+eye(n)
  U=diag(diag(a))*L' 
  for i=1:n
      y(i)=b(i)-L(i,1:i-1)*y(1:i-1);
  end
  for j=n:-1:1
      x(j)=(y(j)-U(j,j+1:n)*x(j+1:n))/U(j,j);
  end
  x
end

追赶法

微分方程的有限元方法、有限差分法以及三次样条函数逼近法等常常产生三对角稀疏型方程组:
( b 1 c 1 a 2 b 2 c 2 ⋱ ⋱ ⋱ a i b i c i ⋱ ⋱ ⋱ a n − 1 b n − 1 c n − 1 a n b n ) ( x 1 x 2 ⋮ x i ⋮ x n − 1 x n ) = ( d 1 d 2 ⋮ d i ⋮ d n − 1 d n ) \begin{pmatrix} b_1&c_1\\a_2&b_2&c_2\\ &\ddots&\ddots&\ddots\\& &a_i&b_i&c_i\\&&&\ddots&\ddots&\ddots\\&&&&a_{n-1}&b_{n-1}&c_{n-1}\\&&&&&a_{n}&b_{n} \end{pmatrix} \begin{pmatrix} x_1\\ x_2\\ \vdots \\ x_i\\ \vdots \\x_{n-1}\\x_n \end{pmatrix}= \begin{pmatrix} d_1\\ d_2\\ \vdots \\ d_i\\ \vdots \\d_{n-1}\\ d_n \end{pmatrix} b1a2c1b2c2aibician1bn1ancn1bnx1x2xixn1xn=d1d2didn1dn
其对应的MatLab程序:

function x=chase(a,b,c,d)
n=length(b);
f(1)=c(1)/b(1);
g(1)=d(1)/b(1);
for i=2:n-1
    h(i)=b(i)-f(i-1)*a(i-1);
    f(i)=c(i)/h(i);
    g(i)=(d(i)-g(i-1)*a(i-1))/h(i);
end
g(n)=(d(n)-g(n-1)*a(n-1))/(b(n)-f(n-1)*a(n-1));
x(n)=g(n);
for i=n-1:-1:1
    x(i)=g(i)-f(i)*x(i-1);
end
end

扰动分析

由来

计算过程中的舍入误差,使得输入已知数据带有微小扰动,某些方程对此异常敏感,导致其计算结果产生大的偏差。这些方程被称作病态方程。

定理

设线性方程组 A X = b AX=b AX=b的系数矩阵 A A A及右端向量b分别带有微小扰动 δ A \delta_A δA δ B \delta_B δB,其导出的扰动解 X + δ X X+\delta_X X+δX满足
( A + δ A ) ( X + δ X ) = b + δ b (A+\delta_A)(X+\delta_X)=b+\delta_b (A+δA)(X+δX)=b+δb
则其解具有如下局部相对误差估计:
∣ ∣ δ X ∣ ∣ ∣ ∣ X ∣ ∣ ≤ ∣ ∣ A − 1 ∣ ∣    ∣ ∣ A ∣ ∣ 1 − ∣ ∣ A − 1 ∣ ∣    ∣ ∣ δ A ∣ ∣ ( ∣ ∣ δ b ∣ ∣ b + ∣ ∣ δ A ∣ ∣ ∣ ∣ A ∣ ∣ ) \dfrac{||\delta_X||}{||X||}\le\dfrac{||A^{-1}|| \,\, ||A||}{1-||A^{-1}||\,\, ||\delta_A| |}(\dfrac{||\delta_b||}{b}+\dfrac{||\delta_A||}{||A||}) XδX1A1δAA1A(bδb+AδA)
∣ ∣ A − 1 ∣ ∣    ∣ ∣ A ∣ ∣ ||A^{-1}||\,\,||A|| A1A表征着方程组 A X = b AX=b AX=b的解 X X X对其系数矩阵A及右端向量变化的敏度,故称之为方程组 A X = b AX=b AX=b的条件数,并记作Cond ( A ) (A) (A)。当 Cond ( A ) > > 1 \text{Cond} (A) >>1 Cond(A)>>1时,方程组 A X = b AX=b AX=b视为病态的。
常用条件数:
Cond 1 ( A ) ≜ ∣ ∣ A − 1 ∣ ∣ 1    ∣ ∣ A ∣ ∣ 1 , Cond ∞ ( A ) ≜ ∣ ∣ A − 1 ∣ ∣ ∞    ∣ ∣ A ∣ ∣ ∞ , Cond 2 ( A ) ≜ ∣ ∣ A − 1 ∣ ∣ 2    ∣ ∣ A ∣ ∣ 2 = max ⁡ 1 ≤ i ≤ n { λ i A T A } min ⁡ 1 ≤ i ≤ n { λ i A T A } , \text{Cond}_1(A)\triangleq||A^{-1}||_1\,\,||A||_1,\\ \text{Cond}_\infty(A)\triangleq||A^{-1}||_\infty\,\,||A||_\infty,\\ \text{Cond}_2(A)\triangleq||A^{-1}||_2\,\,||A||_2=\sqrt{\dfrac{\max\limits_{1\le i\le n}{\{\lambda_{i}^{A^TA}\}}}{\min\limits_{1\le i\le n}{\{\lambda_{i}^{A^TA}\}}}}, Cond1(A)A11A1,Cond(A)A1A,Cond2(A)A12A2=1inmin{λiATA}1inmax{λiATA} ,
其中, λ i A T A \lambda_{i}^{A^TA} λiATA表示矩阵 A T A A^TA ATA的第 i i i个特征值。
此外,当矩阵 A A A为对称矩阵时,其基于 l 2 l_2 l2范数的条件数可写成:
Cond 2 ( A ) = max ⁡ 1 ≤ i ≤ n { ∣ λ i A ∣ } min ⁡ 1 ≤ i ≤ n { ∣ λ i A ∣ } \text{Cond}_2(A)=\dfrac{\max\limits_{1\le i\le n}\{{|\lambda_{i}^{A}|}\}}{\min\limits_{1\le i\le n}{\{|\lambda_{i}^{A}|}\}} Cond2(A)=1inmin{λiA}1inmax{λiA}
定理可知,求解条件数的关键:①求解逆矩阵②求解范数

逆矩阵求解

在这里插入图片描述

主函数MC_main对应MatLab代码:

A=[10 7 8 7
   7 5 6 5
   8 6 10 9
   7 5 9 10];

n=size(A,1);
L=zeros(n);
U=zeros(n);
B=zeros(n);
I=eye(n);

[L,U]=Matrix_LU(A,n);

for i=1:n
    B(:,i)=MatrixInverse(L,U,I(:,i),n);
end
p=input('请输入条件数对应的范数指标(“1”、“2”、“inf”)\n');
mc=MatrixCondition(A,B,p);
fprintf('该线性方程组对应的条件数为:%e',mc);

求解 L , U L,U L,U——Matrix_LU对应MatLab代码:

function [L,U]=Matrix_LU(A,n)

L=zeros(n);U=zeros(n);

for r=1:n
    for i=r:n
        U(r,i)=A(r,i)-sum(L(r,1:r-1).*U(1:r-1,i)');
        L(i,r)=(A(i,r)-sum(L(i,1:r-1).*U(1:r-1,r)'))/U(r,r);
    end
end

end

求解矩阵的逆——MatrixInverse对应MatLab代码:

function x=MatrixInverse(L,U,b,n)

x=zeros(n,1);
y=zeros(n,1);

for i=1:n
    y(i)=b(i)-sum(L(i,1:i-1).*y(1:i-1)');
end

for j=n:-1:1
    x(j)=(y(j)-sum(U(j,j+1:n).*x(j+1:n)'))/U(j,j);
end

end
条件数求解——MatrixCondition对应MatLab代码:
function mc=MatrixCondition(A,B,p)

switch p
    case 1
        mc = mnorm1(A)*mnorm1(B);
    case 2
        mc = mnorm2(A)*mnorm2(B);
    case inf
        mc = mnorminf(A)*mnorminf(B);
    otherwise
        error('矩阵范数指标错误!')

end
矩阵范数的求解

在向量空间 R n ( C n ) R^n(C^n) Rn(Cn)中,设 x = ( x 1 , x 2 , … , x n ) T x=(x_1,x_2,\dots,x_n)^T x=(x1,x2,,xn)T
常用的向量 x x x的范数:

  • x 的 2 范 数 ( 欧 氏 范 数 ) x的2范数(欧氏范数) x2()
    ∣ ∣ x ∣ ∣ 2 = ( ∣ x 1 ∣ 2 + ∣ x 2 ∣ 2 + ⋯ + ∣ x n ∣ 2 ) 1 2 ||x||_2 = (|x_1|^2+|x_2|^2+\dots +|x_n|^2 )^{\frac{1}{2}} x2=(x12+x22++xn2)21
    二维空间中对应的几何意义:
    ∣ ∣ x ∣ ∣ 2 = ( y 2 − y 1 ) 2 + ( x 2 − x 1 ) 2 ||x||_2 =\sqrt{(y_2 - y_1)^2 + (x_2 - x_1)^2} x2=(y2y1)2+(x2x1)2
    MatLab程序:
    function y = mnorm2(A)
    %矩阵2范数:λ_max(A~TA)
    
    lambda = eig(A'*A);
    lambda_max = max(abs(lambda));
    y = sqrt(lambda_max);
    
    end
    
  • x 的 1 范 数 x的1范数 x1
    ∣ ∣ x ∣ ∣ 1 = ∣ x 1 ∣ + ∣ x 2 ∣ + ⋯ + ∣ x n ∣ ||x||_1 = |x_1|+|x_2|+\dots +|x_n| x1=x1+x2++xn
    二维空间中对应的几何意义:
    ∣ ∣ x ∣ ∣ 2 = ∣ y 2 − y 1 ∣ + ∣ x 2 − x 1 ∣ ||x||_2 =|y_2 - y_1| + |x_2 - x_1| x2=y2y1+x2x1
function y = mnorm1(A)
%矩阵1范数:最大列绝对值和

[m,n] = size(A);
x = zeros(1,n);

for j=1:n
    for i=1:m
        x(j) =x(j)+abs(A(i,j));
    end
end
y = max(x);

end
  • x 的 ∞ 范 数 ( 最 大 范 数 ) x的\infty范数(最大范数) x
    ∣ ∣ x ∣ ∣ ∞ = max ⁡ 1 ≤ i ≤ n ∣ x i ∣ ||x||_{\infty} = \max\limits _{1\le i\le n} |x_i| x=1inmaxxi
    二维空间中对应的几何意义:
    ∣ ∣ x ∣ ∣ ∞ = m a x ( ∣ y 2 − y 1 ∣ , ∣ x 2 − x 1 ∣ ) ||x||_\infty =max(|y_2 - y_1|,|x_2 - x_1|) x=max(y2y1,x2x1)
    function y = mnorminf(A)
    %矩阵∞范数:最大行绝对和
    
    [m,n] = size(A);
    x = zeros(m,1);
    
    for i = 1:m
        for j=1:n
            x(i) = x(i) + abs(A(i,j))
        end
    end
    y = max(x);
    
    end
    
    至此,”求精确解部分“的介绍就结束了~
;