计算方法--解线性方程组的直接法

一、Gauss 消元法

Gauss消元法较为简单,只会简单叙述。

1.顺序高斯消元法

通过对方程组的增广矩阵进行初等行变换将矩阵变为上三角矩阵
再通过回代求得原方程组的解。

总计算量

1 3 n 3 + n 2 − 1 3 n 2 \frac{1}{3}n^3+n^2-\frac{1}{3}n^2 31n3+n231n2

2.主元素高斯消元法

为了控制舍入误差的扩大和传播而提出的。

列主元素高斯消元法

将该列绝对值尽可能大的系数作为第k步消元的主元素

3.高斯-约当(Gauss-Jordan)消去法

每次消去对角线下方和上方的元素
每次消元过程中,选取列主元素。

总计算量

1 2 n 3 + 1 2 n 2 \frac{1}{2}n^3+\frac{1}{2}n^2 21n3+21n2
计算量比高斯消去法计算量大,但不需要回代。

二、矩阵三角分解法

1.直接三角分解法(LU分解、Doolittle分解)

条件:

矩阵A的各阶顺序主子式都不为0(可逆)。

计算顺序

  • 先计算第一行,从左到右依次计算 u u u y y y
  • 再计算第一列,从上到下计算 l l l
  • 按照前两部依次计算第二行到最后一行。

计算公式

设矩阵 A A A 的增广矩阵 A A A A [ n + 1 ] [ n + 2 ] ; A[n+1][n+2]; A[n+1][n+2]; 下标为0的元素位置为0.
A = ( a 11 a 12 ⋯ a 1 n ∣ b 1 a 21 a 22 ⋯ a 2 n ∣ b 2 ⋮ ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ∣ b n ) \boldsymbol{A}=\left(\begin{array}{cccc} a_{11} & a_{12} & \cdots & a_{1 n} & |& b_1 \\ a_{21} & a_{22} & \cdots & a_{2 n} & |& b_2 \\ \vdots & \vdots & & \vdots & & \vdots \\ a_{n 1} & a_{n 2} & \cdots & a_{n n} & |& b_n \end{array}\right) A=a11a21an1a12a22an2a1na2nannb1b2bn

则有:

for(int i=1;i<=n;i++){//i表示计算的层数
	//对于第i层

		//先计算u,y值,用u值替换a值,用y值替代b值
		for(int k=i;k<=n+1;k++){
			for(int r = 1; r < i; r++)
				A[i][k] = A[i][k] -  A[i][r]*A[r][k];
		}
	
		//再计算l值,替代下三角的a值
		for(int k = i + 1; k <= n; k++){
			for(int r = 1; r<i; r++){
				A[k][i] = A[k][i] - A[k][r]*A[r][i];
			}
			A[k][i] /= A[k][k];
		}
	}

替换后的值如下:
L & U & y = ( u 11 u 12 u 13 ⋯ u 1 n ∣ y 1 l 21 u 22 u 23 ⋯ u 2 n ∣ y 2 l 31 l 32 u 33 ⋯ u 3 n ∣ y 3 ⋮ ⋮ ⋮ ⋮ ⋮ l n 1 l n 2 ⋯ ⋯ u n n ∣ y n ) \boldsymbol{L\&U\&y}=\left(\begin{array}{ccccc} u_{11} & u_{12} & u_{13} & \cdots & u_{1n} & |&y_1\\ l_{21} & u_{22} & u_{23} & \cdots & u_{2n} & |&y_2\\ l_{31} & l_{32} & u_{33} & \cdots & u_{3n} & |&y_3\\ \vdots & \vdots & \vdots & & \vdots & &\vdots\\ l_{n 1} & l_{n 2} & \cdots & \cdots & u_{nn} & |&y_n \end{array}\right) L&U&y=u11l21l31ln1u12u22l32ln2u13u23u33u1nu2nu3nunny1y2y3yn

及: u 34 ( 黑 色 ) − = 红 色 部 分 的 计 算 值 u_{34}(黑色) -= 红色部分的计算值 u34()=(y值同理)
在这里插入图片描述
及:
l 43 ( 黑 色 ) − = 红 色 部 分 的 计 算 值 l_{43}(黑色) -= 红色部分的计算值 l43()=
然后,
l 43 ( 黑 色 ) / = 橙 色 ( 橙 色 为 对 角 线 上 的 值 ) l_{43}(黑色) /= 橙色(橙色为对角线上的值) l43()/=线
在这里插入图片描述

最后通过计算 U x = y Ux = y Ux=y得出 x x x。用 x x x的值替代 y y y值。

f o r ( k = i + 1 ; k < n ; k + + ) for(k=i+1;k<n;k++) for(k=i+1;k<n;k++)
A [ i ] [ n + 1 ] = A [ i ] [ n + 1 ] − A [ i ] [ k ] ∗ A [ k ] [ n + 1 ] A[i][n+1] = A[i][n+1] - A[i][k]*A[k][n+1] A[i][n+1]=A[i][n+1]A[i][k]A[k][n+1]

A [ i ] [ n + 1 ] / = A [ i ] [ i ] A[i][n+1] /=A[i][i] A[i][n+1]/=A[i][i]
即 : 黑 色 = 黑 色 − 红 色 的 积 和 黑色 = 黑色 - 红色的积和 =
再计算: 黑 色 = 黑 色 / 橘 色 黑色 = 黑色 / 橘色 =/
在这里插入图片描述

计算量

也是 1 3 n 3 \frac{1}{3}n^3 31n3数量级,与高斯消元法计算量基本相同。

优点

若是有多个系数矩阵相同而右边项不同的一系列方程组,用直接三角分解法更简单。

三、Cholesky分解法(平方根法)

条件

  • 系数矩阵 A A A对称,即 A = A T A = A^T A=AT
  • 系数矩阵 A A A正定,即 A A A的特征值均为正值。

分解结果

可以将 A A A唯一的分解为 A = L L T A = LL^T A=LLT
L = ( l 11 0 ⋯ 0 l 21 l 22 ⋯ 0 ⋮ ⋮ ⋱ ⋮ l n 1 l n 2 ⋯ l n n ) L=\left(\begin{array}{cccc} l_{11} & 0 & \cdots & 0 \\ l_{21} & l_{22} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ l_{n 1} & l_{n 2} & \cdots & l_{n n} \end{array}\right) L=l11l21ln10l22ln200lnn

计算L的步骤

从外层向内侧依次计算。同 L U LU LU分解。

Step1,计算对角元素

l k k = a k k − ∑ p = 1 k − 1 l k p 2 \begin{array}{c} l_{k k}=\sqrt{a_{k k}-\sum_{p=1}^{k-1} l_{k p}^{2}} \end{array} lkk=akkp=1k1lkp2

  1. 对 角 元 素 = 对 角 元 素 − 红 色 部 分 的 积 和 对角元素 = 对角元素 - 红色部分的积和 =(注意:A为对称矩阵。即: a 14 = a 41 a_{14}=a_{41} a14=a41
  2. 对 角 元 素 = 对 角 元 素 对角元素 = \sqrt{对角元素} =
    在这里插入图片描述

Step2,计算同列其他元素

l i k = ( a i k − ∑ p = 1 k − 1 l i p l k p ) / l k k , i = k + 1 , k + 2 , ⋯   , n \begin{array}{c} l_{i k}=\left(a_{i k}-\sum_{p=1}^{k-1} l_{i p} l_{k p}\right) / l_{k k}, \\ i=k+1, k+2, \cdots, n \end{array} lik=(aikp=1k1liplkp)/lkk,i=k+1,k+2,,n

  1. A [ i ] [ j ] = A [ i ] [ j ] − 红 色 部 分 的 积 和 A[i][j]= A[i][j]- 红色部分的积和 A[i][j]=A[i][j](注意: 因 为 A 13 并 未 更 新 为 l 13 , 所 以 要 将 A [ 1 ] [ 3 ] 替 换 为 A [ 3 ] [ 1 ] 这 是 与 U L 分 解 不 同 的 地 方 因为A_{13}并未更新为l_{13},所以要将A[1][3]替换为A[3][1]这是与UL分解不同的地方 A13l13,A[1][3]A[3][1]UL
  2. A [ i ] [ j ] = A [ i ] [ j ] / 对 角 元 素 ( 橘 色 ) A[i][j] = A[i][j]/对角元素(橘色) A[i][j]=A[i][j]/
    在这里插入图片描述

在完成 Cholesky 分解后, 我们可分别求解以下系数矩阵。即 U = L T U = L^T U=LT:

L Y = b , L T X = Y \boldsymbol{L} \boldsymbol{Y}=\boldsymbol{b}, \quad \boldsymbol{L}^{\mathrm{T}} \boldsymbol{X}=\boldsymbol{Y} LY=b,LTX=Y

{ y 1 = b 1 y i = b i − ∑ k = 1 i − 1 l i k y k , i = 2 , 3 , ⋯   , n \left\{\begin{array}{l} y_{1}=b_{1} \\ y_{i}=b_{i}-\sum_{k=1}^{i-1} l_{i k} y_{k}, \quad i=2,3, \cdots, n \end{array}\right. {y1=b1yi=bik=1i1likyk,i=2,3,,n

{ x n = y n / u n n x i = ( y i − ∑ k = i + 1 n u i k x k ) / u i i , i = n − 1 , n − 2 , ⋯   , 1. \left\{\begin{array}{l} x_{n}=y_{n} / u_{n n} \\ x_{i}=\left(y_{i}-\sum_{k=i+1}^{n} u_{i k} x_{k}\right) / u_{i i}, \quad i=n-1, n-2, \cdots, 1 . \end{array}\right. {xn=yn/unnxi=(yik=i+1nuikxk)/uii,i=n1,n2,,1.

由于上述线性方程组有大量开方运算,故改进Cholesky分解法。

改进的Cholesky分解法

A A A分解为:
A = L D L T A = LDL^T A=LDLT

Step 1. 计算 D 值

d j = a j j − ∑ k = 1 j − 1 l j k v j k , v j k = l j k d k , d_{j}=a_{j j}-\sum_{k=1}^{j-1} l_{j k} v_{j k}, \quad v_{j k}=l_{j k} d_{k}, dj=ajjk=1j1ljkvjk,vjk=ljkdk,
在这里插入图片描述

Step 2. 计算第j列的L值

注意:L为单位下三角矩阵。即:L矩阵对角元素为1.
l i j = ( a i j − ∑ k = 1 j − 1 l i k v j k ) / d j , i = j + 1 , j + 2 , ⋯   , n . \begin{array}{c} \\ l_{i j}=\left(a_{i j}-\sum_{k=1}^{j-1} l_{i k} v_{j k}\right) / d_{j}, \quad i=j+1, j+2, \cdots, n . \end{array} lij=(aijk=1j1likvjk)/dj,i=j+1,j+2,,n.
在这里插入图片描述

在完成分解后, 我们可分别求解下列系数矩。

L Y = b , D L T X = Y \boldsymbol{L Y}=\boldsymbol{b}, \quad \boldsymbol{D} \boldsymbol{L}^{\mathrm{T}} \boldsymbol{X}=\boldsymbol{Y} LY=b,DLTX=Y

追赶法

条件

  • 三对角非线性方程组
  • 对角占优( ∣ b i ∣ > = ∣ a i ∣ + ∣ c i ∣ |b_i|>=|a_i|+|c_i| bi>=ai+ci

( 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 ) \left(\begin{array}{ccccccc} 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{array}\right)\left(\begin{array}{c} x_{1} \\ x_{2} \\ \vdots \\ x_{i} \\ \vdots \\ x_{n-1} \\ x_{n} \end{array}\right)=\left(\begin{array}{c} d_{1} \\ d_{2} \\ \vdots \\ d_{i} \\ \vdots \\ d_{n-1} \\ d_{n} \end{array}\right) b1a2c1b2c2aibician1bn1ancn1bnx1x2xixn1xn=d1d2didn1dn

求解过程

  • 通过 Gauss 消元法将其化为系数矩阵为单位上三角形矩阵的方程组
    ( 1 β 1 1 β 2 ⋱ ⋱ 1 β n − 1 1 ) ( x 1 x 2 ⋮ x n − 1 x n ) = ( γ 1 γ 2 ⋮ γ n − 1 γ n ) \left(\begin{array}{ccccc} 1 & \beta_{1} & & & \\ & 1 & \beta_{2} & & \\ & & \ddots & \ddots & \\ & & & 1 & \beta_{n-1} \\ & & & & 1 \end{array}\right)\left(\begin{array}{c} x_{1} \\ x_{2} \\ \vdots \\ x_{n-1} \\ x_{n} \end{array}\right)=\left(\begin{array}{c} \gamma_{1} \\ \gamma_{2} \\ \vdots \\ \gamma_{n-1} \\ \gamma_{n} \end{array}\right) 1β11β21βn11x1x2xn1xn=γ1γ2γn1γn
  • 回代求得方程组的解。
    x n = γ n , x i = γ i − β i x i + 1 , i = n − 1 , n − 2 , ⋯   , 2 x_{n}=\gamma_{n}, \quad x_{i}=\gamma_{i}-\beta_{i} x_{i+1}, \quad i=n-1, n-2, \cdots, 2 xn=γn,xi=γiβixi+1,i=n1,n2,,2

误差分析

c o n d ( A ) = ∣ ∣ A − 1 ∣ ∣ ⋅ ∣ ∣ A ∣ ∣ cond(A) = ||A^{-1}||\cdot||A|| cond(A)=A1A刻画了方程组 A x = b Ax=b Ax=b的病态程度,及解对 A , b A,b A,b扰动的敏感程度。

性质

对可逆矩阵A,有:

  • c o n d ( A ) = c o n d ( A − 1 ) cond(A) = cond(A^{-1}) cond(A)=cond(A1)
  • c o n d ( k A ) = c o n d ( A ) cond(kA) = cond(A) cond(kA)=cond(A)
  • c o n d 2 ( U ) = 1 cond_2(U) = 1 cond2(U)=1
  • 等等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elsa的迷弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值