解线性方程组的直接法

1 高斯消去法

!i特指行标,j特指列标,k特指第k次消元
DO k = 1,n-1
    IF(ABS(A(k,k)) <= eps) THEN
        STOP "该方程无法用高斯消去法求解!"
    END IF
    !消去过程
    DO i = k+1,n
        A(i,k) = A(i,k) / A(k,k) !A(i,k)理论上是0但是不会用它,所以可以把它当作临时变量
        DO j = k+1,n
            A(i,j) = A(i,j) - A(i,k) * A(k,j)
        END DO
        b(i) = b(i) - A(i,k) * b(k)
    END DO
END DO
!回代过程
x(n) = b(n) / A(n,n)
DO k = n-1,1,-1
    sum = b(k)
    DO j = k+1,n
        sum = sum - a(k,j) * x(j)
    END DO
    x(k) = sum / A(k,k)
END DO

2 列主元高斯消去法

DO k = 1,n-1
    !选主元素
    max = A(k,k) !假设最大元素在第k行k列
    max_i = k !假设最大元素在第k行
    DO i = k+1,n
        IF(ABS(A(i,k)) > ABS(max)) THEN
            max = A(i,k)
            max_i = i
        END IF
    END DO
    !交换方程位置
    IF(max == A(k,k)) GOTO 100 !此时不用交换
    DO j = k,n
        temp = A(k,j)
        A(k,j) = A(max_i,j)
        A(max_i,j) = temp
    END DO
    temp = b(k)
    b(k) = b(max_i)
    b(max_i) = temp
    !消去过程
100 DO i = k+1,n
        A(i,k) = A(i,k) / A(k,k) !A(i,k)理论上是0但是不会用它,所以可以把它当作临时变量
        DO j = k+1,n
            A(i,j) = A(i,j) - A(i,k) * A(k,j)
        END DO
        b(i) = b(i) - A(i,k) * b(k)
    END DO
END DO
!回代过程
x(n) = b(n) / A(n,n)
DO k = n-1,1,-1
    sum = b(k)
    DO j = k+1,n
        sum = sum - a(k,j) * x(j)
    END DO
    x(k) = sum / A(k,k)
END DO

3 矩阵LU分解法

A x = [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ] [ x 1 x 2 ⋮ x n ] = L U x = [ 1 l 21 1 ⋮ ⋮ ⋱ l n 1 l n 2 l n , n − 1 1 ] [ u 11 u 12 ⋯ u 1 n u 22 ⋯ u 2 n ⋱ ⋮ u n n ] [ x 1 x 2 ⋮ x n ] = b = [ b 1 b 2 ⋮ b n ] Ax= \begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&\vdots\\a_{n1}&a_{n2}&\cdots&a_{nn}\\\end{bmatrix} \begin{bmatrix}x_{1}\\x_{2}\\\vdots\\x_{n}\\\end{bmatrix} =LUx= \begin{bmatrix}1&&&\\l_{21}&1&&\\\vdots&\vdots&\ddots&\\l_{n1}&l_{n2}&l_{n,n-1}&1\\\end{bmatrix} \begin{bmatrix}u_{11}&u_{12}&\cdots&u_{1n}\\&u_{22}&\cdots&u_{2n}\\&&\ddots&\vdots\\&&&u_{nn}\\\end{bmatrix} \begin{bmatrix}x_{1}\\x_{2}\\\vdots\\x_{n}\\\end{bmatrix} =b= \begin{bmatrix}b_{1}\\b_{2}\\\vdots\\b_{n}\\\end{bmatrix} Ax= a11a21an1a12a22an2a1na2nann x1x2xn =LUx= 1l21ln11ln2ln,n11 u11u12u22u1nu2nunn x1x2xn =b= b1b2bn

!矩阵的LU分解,即A=LU
DO j = 1,n
    U(1,j) = A(1,j)
END DO
DO i = 2,n
    L(i,1) = A(i,1) / U(1,1)
END DO
DO i = 2,n-1
    sum = A(i,i)
    DO k = 1,i-1
        sum = sum - L(i,k) * U(k,i)
    END DO
    U(i,i) = sum
    DO j = i+1,n
        sum = A(i,j)
        DO k = 1,i-1
            sum = sum - L(i,k) * U(k,j)
        END DO
        U(i,j) = sum
        sum = A(j,i)
        DO k = 1,i-1
            sum = sum - L(j,k) * U(k,i)
        END DO
        L(j,i) = sum / U(i,i)
    END DO
END DO
sum = A(n,n)
DO k = 1,n-1
    sum = sum - L(n,k) * U(k,n)
END DO
U(n,n) = sum
!原方程Ax=LUx=b,先解Ly=b,再解Ux=y
y(1) = b(1)
DO i = 2,n
    sum = b(i)
    DO j = 1,i-1
        sum = sum - L(i,j) * y(j)
    END DO
    y(i) = sum
END DO
x(n) = y(n) / U(n,n)
DO i = n-1,1,-1
    sum = y(i)
    DO j = i+1,n
        sum = sum - U(i,j) * x(j)
    END DO
    x(i) = sum / U(i,i)
END DO

4 平方根法

A x = [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ] [ x 1 x 2 ⋮ x n ] = G G T x = [ g 11 g 21 g 22 ⋮ ⋮ ⋱ g n 1 g n 2 g n , n − 1 g n n ] [ g 11 g 21 ⋯ g n 1 g 22 ⋯ g n 2 ⋱ ⋮ g n n ] [ x 1 x 2 ⋮ x n ] = b = [ b 1 b 2 ⋮ b n ] , ( a i j = a j i , i ≠ j ) Ax= \begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&\vdots\\a_{n1}&a_{n2}&\cdots&a_{nn}\\\end{bmatrix} \begin{bmatrix}x_{1}\\x_{2}\\\vdots\\x_{n}\\\end{bmatrix} =GG^{T}x= \begin{bmatrix}g_{11}&&&\\g_{21}&g_{22}&&\\\vdots&\vdots&\ddots&\\g_{n1}&g_{n2}&g_{n,n-1}&g_{nn}\\\end{bmatrix} \begin{bmatrix}g_{11}&g_{21}&\cdots&g_{n1}\\&g_{22}&\cdots&g_{n2}\\&&\ddots&\vdots\\&&&g_{nn}\\\end{bmatrix} \begin{bmatrix}x_{1}\\x_{2}\\\vdots\\x_{n}\\\end{bmatrix} =b= \begin{bmatrix}b_{1}\\b_{2}\\\vdots\\b_{n}\\\end{bmatrix}, (a_{ij}=a_{ji},i \neq j) Ax= a11a21an1a12a22an2a1na2nann x1x2xn =GGTx= g11g21gn1g22gn2gn,n1gnn g11g21g22gn1gn2gnn x1x2xn =b= b1b2bn ,(aij=aji,i=j)

!矩阵的GG^T分解,即A=GG^T
G(1,1) = SQRT(A(1,1))
DO i = 2,n
    G(i,1) = A(i,1) / G(1,1)
END DO
DO j = 2,n-1
    sum = A(j,j)
    DO k = 1,j-1
        sum = sum - G(j,k)**2
    END DO
    G(j,j) = SQRT(sum)
    DO i = j+1,n
        sum = A(i,j)
        DO k = 1,j-1
            sum = sum - G(i,k) * G(j,k)
        END DO
        G(i,j) = sum / G(j,j)
    END DO
END DO
sum = A(n,n)
DO k = 1,n-1
    sum = sum - G(n,k)**2
END DO
G(n,n) = SQRT(sum)
!原方程Ax=GG^Tx=b,先解Gy=b,再解G^Tx=y
y(1) = b(1) / G(1,1)
DO i = 2,n
    sum = b(i)
    DO k = 1,i-1
        sum = sum - G(i,k) * y(k)
    END DO
    y(i) = sum / G(i,i)
END DO
x(n) = y(n) / G(n,n)
DO i = n-1,1,-1
    sum = y(i)
    DO k = i+1,n
        sum = sum - G(k,i) * x(k)
    END DO
    x(i) = sum / G(i,i)
END DO

5 改进平方根法

A x = [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ] [ x 1 x 2 ⋮ x n ] = L D L T x = [ 1 l 21 1 ⋮ ⋮ ⋱ l n 1 l n 2 l n , n − 1 1 ] [ d 1 d 2 ⋱ d n ] [ 1 l 21 ⋯ l n 1 1 ⋯ l n 2 ⋱ ⋮ 1 ] [ x 1 x 2 ⋮ x n ] = b = [ b 1 b 2 ⋮ b n ] , ( a i j = a j i , i ≠ j ) Ax= \begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&\vdots\\a_{n1}&a_{n2}&\cdots&a_{nn}\\\end{bmatrix} \begin{bmatrix}x_{1}\\x_{2}\\\vdots\\x_{n}\\\end{bmatrix} =LDL^{T}x= \begin{bmatrix}1&&&\\l_{21}&1&&\\\vdots&\vdots&\ddots&\\l_{n1}&l_{n2}&l_{n,n-1}&1\\\end{bmatrix} \begin{bmatrix}d_{1}&&&\\&d_{2}&&\\&&\ddots&\\&&&d_{n}\\\end{bmatrix} \begin{bmatrix}1&l_{21}&\cdots&l_{n1}\\&1&\cdots&l_{n2}\\&&\ddots&\vdots\\&&&1\\\end{bmatrix} \begin{bmatrix}x_{1}\\x_{2}\\\vdots\\x_{n}\\\end{bmatrix} =b= \begin{bmatrix}b_{1}\\b_{2}\\\vdots\\b_{n}\\\end{bmatrix}, (a_{ij}=a_{ji},i \neq j) Ax= a11a21an1a12a22an2a1na2nann x1x2xn =LDLTx= 1l21ln11ln2ln,n11 d1d2dn 1l211ln1ln21 x1x2xn =b= b1b2bn ,(aij=aji,i=j)

!矩阵的LDL^T分解,即A=LDL^T
DO j = 1,n
    U(1,j) = A(1,j)
END DO
D(1) = U(1,1)
DO j = 2,n
    L(j,1) = U(1,j) / U(1,1)
END DO
DO i = 2,n-1
    sum = A(i,i)
    DO k = 1,i-1
        sum = sum - l(i,k)**2 * D(k)
    END DO
    D(i) = sum
    DO j = i+1,n
        sum = A(j,i)
        DO k = 1,i-1
            sum = sum - L(j,k) * D(k) * L(i,k)
        END DO
        L(j,i) = sum / D(i)
    END DO
END DO
sum = A(n,n)
DO k = 1,n-1
    sum = sum - L(n,k)**2 * D(k)
END DO
D(n) = sum
!原方程Ax=LDL^Tx=b,先解Ly=b,再解Dz=y,最后解L^Tx=z
y(1) = b(1)
DO i = 2,n
    sum = b(i)
    DO k = 1,i-1
        sum = sum - L(i,k) * y(k)
    END DO
    y(i) = sum
END DO
x(n) = y(n) / D(n)
DO i = n-1,1,-1
    sum = y(i) / D(i)
    DO k = i+1,n
        sum = sum - L(k,i) * x(k)
    END DO
    x(i) = sum
END DO

6 追赶法

A x = [ b 1 c 1 a 2 b 2 c 2 ⋱ ⋱ ⋱ a n − 1 b n − 1 c n − 1 a n b n ] [ x 1 x 2 ⋮ x n − 1 x n ] = L U x = [ 1 l 2 1 ⋱ ⋱ l n − 1 1 l n 1 ] [ u 1 c 1 u 2 c 2 ⋱ ⋱ u n − 1 c n − 1 u n ] [ x 1 x 2 ⋮ x n − 1 x n ] = d = [ d 1 d 2 ⋮ d n − 1 d n ] Ax= \begin{bmatrix}b_{1}&c_{1}&&&\\a_{2}&b_{2}&c_{2}&&\\&\ddots&\ddots&\ddots&\\&&a_{n-1}&b_{n-1}&c_{n-1}\\&&&a_{n}&b_{n}\\\end{bmatrix} \begin{bmatrix}x_{1}\\x_{2}\\\vdots\\x_{n-1}\\x_{n}\\\end{bmatrix} =LUx= \begin{bmatrix}1&&&&\\l_{2}&1&&&\\&\ddots&\ddots&&\\&&l_{n-1}&1&\\&&&l_{n}&1\\\end{bmatrix} \begin{bmatrix}u_{1}&c_{1}&&&\\&u_{2}&c_{2}&&\\&&\ddots&\ddots&\\&&&u_{n-1}&c_{n-1}\\&&&&u_{n}\\\end{bmatrix} \begin{bmatrix}x_{1}\\x_{2}\\\vdots\\x_{n-1}\\x_{n}\\\end{bmatrix} =d= \begin{bmatrix}d_{1}\\d_{2}\\\vdots\\d_{n-1}\\d_{n}\\\end{bmatrix} Ax= b1a2c1b2c2an1bn1ancn1bn x1x2xn1xn =LUx= 1l21ln11ln1 u1c1u2c2un1cn1un x1x2xn1xn =d= d1d2dn1dn

PROGRAM main
    IMPLICIT NONE
    REAL(KIND = 8),DIMENSION(2:5) :: a = [2,-3,4,-5]
    REAL(KIND = 8),DIMENSION(5) :: b = [1,3,4,7,6]
    REAL(KIND = 8),DIMENSION(4) :: c = [2,1,2,1]
    REAL(KIND = 8),DIMENSION(5) :: d = [5,9,2,19,-4]
    REAL(KIND = 8),DIMENSION(2:5) :: l
    REAL(KIND = 8),DIMENSION(5) :: u
    REAL(KIND = 8),DIMENSION(5) :: x,y
    INTEGER(KIND = 4) :: i,n = 5
    u(1) = b(1)
    y(1) = d(1)
    DO i = 2,n
        l(i) = a(i) / u(i-1)
        u(i) = b(i) - l(i) * c(i-1)
        y(i) = d(i) - l(i) * y(i-1)
    END DO
    x(n) = y(n) / u(n)
    DO i = n-1,1,-1
        x(i) = (y(i) - c(i) * x(i+1)) / u(i)
    END DO
    WRITE(*,"(<n>F5.2)") x
END PROGRAM
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值