方程组可以转化为:
A x = B Ax=B Ax=B
其中:
A = [ α 11 α 12 ⋯ α 1 n α 21 α 22 ⋯ α 2 n ⋯ ⋯ ⋯ ⋯ α n 1 α n 2 ⋯ α n n ] , x = [ x 1 x 2 ⋮ x n ] , b = [ β 1 β 2 ⋮ β n ] A = \begin{bmatrix} {{\alpha _{11}}}&{{\alpha _{12}}}& \cdots &{{\alpha _{1n}}}\\ {{\alpha _{21}}}&{{\alpha _{22}}}& \cdots &{{\alpha _{2n}}}\\ \cdots & \cdots & \cdots & \cdots \\ {{\alpha _{n1}}}&{{\alpha _{n2}}}& \cdots &{{\alpha _{nn}}} \end{bmatrix} ,x=\begin{bmatrix} x_1\\ x_2\\ \vdots\\ x_n \end{bmatrix},b = \begin{bmatrix} {{\beta _1}}\\ {{\beta _2}}\\ \vdots \\ {{\beta _n}} \end{bmatrix} A=⎣⎢⎢⎡α11α21⋯αn1α12α22⋯αn2⋯⋯⋯⋯α1nα2n⋯αnn⎦⎥⎥⎤,x=⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤,b=⎣⎢⎢⎢⎡β1β2⋮βn⎦⎥⎥⎥⎤
则:
法 1 求逆
根据矩阵的思想,
x = A − 1 B x=A^{-1}B x=A−1B
求逆的方法有很多,那么该算法的复杂性就取决于求逆的方法。
法 2 Crammer 法则
x i = ∣ A i ∣ ∣ A ∣ , i = 1 , 2 , . . . , n x_i=\frac {|A_i|} {|A|},i=1,2,...,n xi=∣A∣∣Ai∣,i=1,2,...,n
其中, ∣ A ∣ |A| ∣A∣ 是系数矩阵行列式, ∣ A i ∣ |A_i| ∣Ai∣ 是以右端向量 b 代替 A 的第 i 列所得的矩阵的行列式。
计算量为求矩阵的行列式(下面是行列式的定义式):
∣    A    ∣ = ∑ ( − 1 ) J ( i 1 , i 2 ⋯ i n ) α 1 i 1 α 2 i 2 ⋯ α n i n \left| {\;{\bf{A}}\;} \right| = \sum {{{( - 1)}^{J({i_1},{i_2} \cdots {i_n})}}{\alpha _{1{i_1}}}{\alpha _{2{i_2}}} \cdots {\alpha _{n{i_n}}}} ∣A∣=∑(−1)J(i1,i2⋯in)α1i1α2i2⋯αnin
其中 J ( i 1 , i 2 ⋯ i n ) J({i_1},{i_2} \cdots {i_n}) J(i1,i2⋯in) 是从{1,2,…,n}变换到 i 1 , i 2 , . . . , i n {i_1,i_2,...,i_n} i1,i2,...,in 所需的置换次数。
所以使用 Crammer 法则与行列式定义求解方程组需要 N = ( n 2 − 1 ) ( n ! ) + n N=(n^2-1)(n!)+n N=(n2−1)(n!)+n 次浮点运算。
因为根据定义每个行列式都由 n ! n! n! 项之和组成({1,2,…,n}的全排列有 n!种),每项是 n 个数的乘积,所以计算一个 n 阶行列式的运算量约为 ( n − 1 ) ( n ! ) f l o p (n-1)(n!)flop (n−1)(n!)flop,一共需要计算 ∣ A i ∣ |A_i| ∣Ai∣ 和 ∣ A ∣ |A| ∣A∣ 共 n + 1 n+1 n+1 个行列式。行列式算完之后的加法和除法有 n 步,所以总运算量为 O ( n 2 ∗ n ! ) O(n^2*n!) O(n2∗n!) 。
运算量过大,实际无法使用。
Gauss 消去法过程示例:
基本步骤:消去和回代
时间复杂度 O ( n 3 ) O(n^3) O(n3) ,空间复杂度 O ( n 2 ) O(n^2) O(n2)
将求解 n 元方程组的问题通过降维,变为等价的 n-1 元方程组进行求解,逐次进行直至变为一个一元一次方程为止,然后求解,再逐步回代得到其余的解
将方程的过程转化为矩阵的变换
对以下增广矩阵:
( A ( 0 ) b ( 0 ) ) = ( a 11 ( 0 ) a 12 ( 0 ) a 13 ( 0 ) ⋯ a 1 n ( 0 ) β 1 ( 0 ) a 21 ( 0 ) a 22 ( 0 ) a 23 ( 0 ) ⋯ a 2 n ( 0 ) β 2 ( 0 ) a 31 ( 0 ) a 32 ( 0 ) a 33 ( 0 ) ⋯ a 3 n ( 0 ) β 3 ( 0 ) ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ a n 1 ( 0 ) a n 2 ( 0 ) a n 3 ( 0 ) ⋯ a n n ( 0 ) β n ( 0 ) ) \begin{pmatrix} {{A^{(0)}}}&{{b^{(0)}}} \end{pmatrix}=\begin{pmatrix} {a_{11}^{(0)}}&{a_{12}^{(0)}}&{a_{13}^{(0)}}& \cdots &{a_{1n}^{(0)}}&{\beta _1^{(0)}}\\ {a_{21}^{(0)}}&{a_{22}^{(0)}}&{a_{23}^{(0)}}& \cdots &{a_{2n}^{(0)}}&{\beta _2^{(0)}}\\ {a_{31}^{(0)}}&{a_{32}^{(0)}}&{a_{33}^{(0)}}& \cdots &{a_{3n}^{(0)}}&{\beta _3^{(0)}}\\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\ {a_{n1}^{(0)}}&{a_{n2}^{(0)}}&{a_{n3}^{(0)}}& \cdots &{a_{nn}^{(0)}}&{\beta _n^{(0)}} \end{pmatrix} (A(0)b(0))=⎝⎜⎜⎜⎜⎜⎜⎛a11(0)a21(0)a31(0)⋮an1(0)a12(0)a22(0)a32(0)⋮an2(0)a13(0)a23(0)a33(0)⋮an3(0)⋯⋯⋯⋮⋯a1n(0)a2n(0)a3n(0)⋮ann(0)β1(0)β2(0)β3(0)⋮βn(0)⎠⎟⎟⎟⎟⎟⎟⎞
将矩阵的第 i 行分别减去矩阵第一行的倍数 l 1 = a i 1 ( 0 ) a 11 ( 0 ) , i = 2 , 3 , . . . , n l_1=\frac {a_{i1}^{(0)}} {a_{11}^{(0)}},i=2,3,...,n l1=a11(0)ai1(0),i=2,3,...,n ,得到:
( A ( 1 ) b ( 1 ) ) = ( a 11 ( 0 ) a 12 ( 0 ) a 13 ( 0 ) ⋯ a 1 n ( 0 ) β 1 ( 0 ) 0 a 22 ( 1 ) a 23 ( 1 ) ⋯ a 2 n ( 1 ) β 2 ( 1 ) 0 a 32 ( 1 ) a 33 ( 1 ) ⋯ a 3 n ( 1 ) β 3 ( 1 ) ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ 0 a n 2 ( 1 ) a n 3 ( 1 ) ⋯ a n n ( 1 ) β n ( 1 ) ) \begin{pmatrix} {{A^{(1)}}}&{{b^{(1)}}} \end{pmatrix}=\begin{pmatrix} {a_{11}^{(0)}}&{a_{12}^{(0)}}&{a_{13}^{(0)}}& \cdots &{a_{1n}^{(0)}}&{\beta _1^{(0)}}\\ 0&{a_{22}^{(1)}}&{a_{23}^{(1)}}& \cdots &{a_{2n}^{(1)}}&{\beta _2^{(1)}}\\ 0&{a_{32}^{(1)}}&{a_{33}^{(1)}}& \cdots &{a_{3n}^{(1)}}&{\beta _3^{(1)}}\\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\ 0&{a_{n2}^{(1)}}&{a_{n3}^{(1)}}& \cdots &{a_{nn}^{(1)}}&{\beta _n^{(1)}} \end{pmatrix} (A(1)b(1))=⎝⎜⎜⎜⎜⎜⎜⎛a11(0)00⋮0a12(0)a22(1)a32(1)⋮an2(1)a13(0)a23(1)a33(1)⋮an3(1)⋯⋯⋯⋮⋯a1n(0)a2n(1)a3n(1)⋮ann(1)β1(0)β2(1)β3(1)⋮βn(1)⎠⎟⎟⎟⎟⎟⎟⎞
其中:
a i j ( 1 ) = a i j ( 0 ) − l i 1 a 1 j ( 0 ) β i ( 1 ) = β i ( 0 ) − l i 1 β 1 ( 0 ) j = 2 , 3 , . . . , n i = 2 , 3 , . . . , n \begin{matrix} a_{ij}^{(1)} = a_{ij}^{(0)} - {l_{i1}}a_{1j}^{(0)}\\ \beta _i^{(1)} = \beta _i^{(0)} - {l_{i1}}\beta _1^{(0)}\\ j = 2,3,...,n\\ i = 2,3,...,n \end{matrix} aij(1)=aij(0)−li1a1j(0)βi(1)=βi(0)−li1β1(0)j=2,3,...,ni=2,3,...,n
以此类推,消去第 k 步,得到矩阵:
( A ( k ) b ( k ) ) = ( a 11 ( 0 ) ⋯ a 1 k ( 0 ) a 1 , k + 1 ( 0 ) ⋯ a 1 n ( 0 ) β 1 ( 0 ) ⋱ ⋮ ⋮ ⋮ ⋮ a k k ( k − 1 ) a k , k + 1 ( k − 1 ) ⋯ a k n ( k − 1 ) β k ( k − 1 ) a k + 1 , k + 1 ( 0 ) ⋯ a k + 1 , n ( k ) β k + 1 ( k ) ⋮ ⋮ ⋮ a n , k + 1 ( k ) ⋯ a n n ( k ) β n ( k ) ) \begin{pmatrix} {{A^{(k)}}}&{{b^{(k)}}} \end{pmatrix} = \begin{pmatrix} {a_{11}^{(0)}}& \cdots &{a_{1k}^{(0)}}&{a_{1,k + 1}^{(0)}}& \cdots &{a_{1n}^{(0)}}&{\beta _1^{(0)}}\\ {}& \ddots & \vdots & \vdots &{}& \vdots & \vdots \\ {}&{}&{a_{kk}^{(k - 1)}}&{a_{k,k + 1}^{(k - 1)}}& \cdots &{a_{kn}^{(k - 1)}}&{\beta _k^{(k - 1)}}\\ {}&{}&{}&{a_{k + 1,k + 1}^{(0)}}& \cdots &{a_{k + 1,n}^{(k)}}&{\beta _{k + 1}^{(k)}}\\ {}&{}&{}& \vdots &{}& \vdots & \vdots \\ {}&{}&{}&{a_{n,k + 1}^{(k)}}& \cdots &{a_{nn}^{(k)}}&{\beta _n^{(k)}} \end{pmatrix} (A(k)b(k))=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛a11(0)⋯⋱a1k(0)⋮akk(k−1)a1,k+1(0)⋮ak,k+1(k−1)ak+1,k+1(0)⋮an,k+1(k)⋯⋯⋯⋯a1n(0)⋮akn(k−1)ak+1,n(k)⋮ann(k)β1(0)⋮βk(k−1)βk+1(k)⋮βn(k)⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
计算关系式:
l i k = a i k ( k − 1 ) a k k ( k − 1 ) a i j ( k ) = a i j ( k − 1 ) − l i k a k j ( k − 1 ) , j = k + 1 , . . . , n β i ( k ) = β i ( k − 1 ) − l i k β k ( k − 1 ) , i = k + 1 , k + 2 , . . . , n \begin{matrix} {l_{ik}} = \frac{{a_{ik}^{(k - 1)}}}{{a_{kk}^{(k - 1)}}}\\ \\ {\rm{ }}a_{ij}^{(k)} = a_{ij}^{(k - 1)} - {l_{ik}}a_{kj}^{(k - 1)},j = k + 1,...,n\\ \\ {\rm{ }}\beta _i^{(k)} = \beta _i^{(k - 1)} - {l_{ik}}\beta _k^{(k - 1)},i = k + 1,k + 2,...,n \end{matrix} lik=akk(k−1)aik(k−1)aij(k)=aij(k−1)−likakj(k−1),j=k+1,...,nβi(k)=βi(k−1)−likβk(k−1),i=k+1,k+2,...,n
经过 n-1 步消去后,得到:
( A ( n − 1 ) b ( n − 1 ) ) = ( a 11 ( 0 ) a 12 ( 0 ) a 13 ( 0 ) ⋯ a 1 n ( 0 ) β 1 ( 0 ) a 22 ( 1 ) a 23 ( 1 ) ⋯ a 2 n ( 1 ) β 2 ( 1 ) a 33 ( 2 ) ⋯ a 3 n ( 2 ) β 3 ( 2 ) ⋱ ⋮ ⋮ a n n ( n − 1 ) β n ( n − 1 ) ) (\begin{matrix} {{A^{(n - 1)}}}&{{b^{(n - 1)}}} \end{matrix}) = \left( {\begin{matrix} {a_{11}^{(0)}}&{a_{12}^{(0)}}&{a_{13}^{(0)}}& \cdots &{a_{1n}^{(0)}}&{\beta _1^{(0)}}\\ {}&{a_{22}^{(1)}}&{a_{23}^{(1)}}& \cdots &{a_{2n}^{(1)}}&{\beta _2^{(1)}}\\ {}&{}&{a_{33}^{(2)}}& \cdots &{a_{3n}^{(2)}}&{\beta _3^{(2)}}\\ {}&{}&{}& \ddots & \vdots & \vdots \\ {}&{}&{}&{}&{a_{nn}^{(n - 1)}}&{\beta _n^{(n - 1)}} \end{matrix}} \right) (A(n−1)b(n−1))=⎝⎜⎜⎜⎜⎜⎜⎛a11(0)a12(0)a22(1)a13(0)a23(1)a33(2)⋯⋯⋯⋱a1n(0)a2n(1)a3n(2)⋮ann(n−1)β1(0)β2(1)β3(2)⋮βn(n−1)⎠⎟⎟⎟⎟⎟⎟⎞
然后,经过回代,就可以得到所有解。
{ x n = β n ( n − 1 ) a n n ( n − 1 ) x k = 1 a k k ( k − 1 ) ( β k ( k − 1 ) − ∑ j = k + 1 n a k j ( k − 1 ) x j ) , k = n − 1 , n − 2 , . . . , 1 \left\{ \begin{array}{l} {x_n} = \frac{{\beta _n^{(n - 1)}}}{{a_{nn}^{(n - 1)}}}\\ {x_k} = \frac{1}{{a_{kk}^{(k - 1)}}}\left( {\beta _k^{(k - 1)} - \sum\limits_{j = k + 1}^n {a_{kj}^{(k - 1)}{x_j}} } \right),k = n - 1,n - 2,...,1 \end{array} \right.{\rm{ }} ⎩⎪⎪⎨⎪⎪⎧xn=ann(n−1)βn(n−1)xk=akk(k−1)1(βk(k−1)−j=k+1∑nakj(k−1)xj),k=n−1,n−2,...,1
但 Gauss 消去法并非万能,例如对于以下问题就不能执行:
{ 5 x 2 + x 3 = 2 2 x 1 + x 2 − x 3 = 1 4 x 1 − x 2 + x 3 = 0 \left\{ \begin{array}{l} {\rm{ 5}}{x_2} + {x_3} = 2\\ 2{x_1} + {x_2} - {x_3} = 1\\ 4{x_1} - {x_2} + {x_3} = 0 \end{array} \right. ⎩⎨⎧5x2+x3=22x1+x2−x3=14x1−x2+x3=0
所以当 Gauss 消去法遇到以下现象时,不能执行:
第一种情况容易理解,第二种情况是因为会导致小数字作为除数参加运算,会产生大数字,大数字加到其他数上面会产生“大数吃小数”的问题。
所以可以采用以下方法解决上面两种现象:
若矩阵非奇则总可以通过选主元的方式继续执行消去过程
所以列主元高斯消去法是稳定的,但是高斯消去法可能是不稳定的。
注意:当矩阵对称正定或者严格对角占优时,不需要使用列主元高斯消去法。