zoukankan      html  css  js  c++  java
  • 计算方法 | 方程组求解的三角分解

    有两种方法,一个是通过高斯消去法的方式去求一个下三角矩阵,还有一个是直接分解

    显然直接分解好啊233。

    然后这是个啥杜尔利特分解公式

    是由矩阵乘法的原理弄出来的。

    书上P99页俩公式(5.34 5.35)。

    轮流求u和l

    三角分解部分的代码:

     1 import numpy as np
     2 
     3 mat = [[2,2,3],[4,7,7],[-2,4,5]]
     4 
     5 height = len(mat)
     6 width = len(mat[0])
     7 
     8 # 1 直接分解矩阵
     9 # 初始化LU
    10 U = [[0 for i in range(width)] for j in range(height)]
    11 L = [[0 if i!=j else 1 for i in range(width) ] for j in range(height)]
    12 
    13 print(L,U)
    14 
    15 # 从U第一行开始,对于L来说是从第一列开始
    16 for i in range(height):
    17     # 依次计算LU的行、列
    18     for j in range(i, width):
    19         _sum = 0
    20         for k in range(i):
    21             _sum += L[i][k] * U[k][j]
    22             print("U{}{}_sum += L[{}][{}] * U[{}][{}] = {} * {} = {}".format(i,j,i,k,k,j,L[i][k],U[k][j],L[i][k] * U[k][j]))
    23         U[i][j] = mat[i][j] - _sum
    24     # L的i.j是反着的
    25     for j in range(i, width):
    26         _sum = 0
    27         if j > i:
    28             for k in range(i):
    29                 _sum += L[j][k] * U[k][i]
    30                 print("L{}{}_sum += L[{}][{}] * U[{}][{}] = {} * {} = {}".format(j,i,j,k,k,i,L[j][k],U[k][i],L[j][k] * U[k][i]))
    31             L[j][i] = (mat[j][i] - _sum) / U[i][i]
    32     print("L = 
    {}".format(np.array(L)))
    33     print("U = 
    {}".format(np.array(U)))
    34     
    35 # 分解完毕

    解Ly =b, 回带求解,再解Ux=y, 直接丢完整代码了:

     1 import numpy as np
     2 # mat = eval(input("请输入系数矩阵:"))
     3 # 测试数据[[2,2,3],[4,7,7],[-2,4,5]]
     4 mat = [[2,2,3],[4,7,7],[-2,4,5]]
     5 # b = eval(input("请输入结果矩阵:"))
     6 # 测试数据[[3],[1],[-7]]
     7 b = [[3],[1],[-7]]
     8 height = len(mat)
     9 width = len(mat[0])
    10 
    11 # 1 直接分解矩阵
    12 # 初始化LU
    13 U = [[0 for i in range(width)] for j in range(height)]
    14 L = [[0 if i!=j else 1 for i in range(width) ] for j in range(height)]
    15 
    16 print(L,U)
    17 
    18 # 从U第一行开始,对于L来说是从第一列开始
    19 for i in range(height):
    20     # 依次计算LU的行、列
    21     for j in range(i, width):
    22         _sum = 0
    23         for k in range(i):
    24             _sum += L[i][k] * U[k][j]
    25             print("U{}{}_sum += L[{}][{}] * U[{}][{}] = {} * {} = {}".format(i,j,i,k,k,j,L[i][k],U[k][j],L[i][k] * U[k][j]))
    26         U[i][j] = mat[i][j] - _sum
    27     # L的i.j是反着的
    28     for j in range(i, width):
    29         _sum = 0
    30         if j > i:
    31             for k in range(i):
    32                 _sum += L[j][k] * U[k][i]
    33                 print("L{}{}_sum += L[{}][{}] * U[{}][{}] = {} * {} = {}".format(j,i,j,k,k,i,L[j][k],U[k][i],L[j][k] * U[k][i]))
    34             L[j][i] = (mat[j][i] - _sum) / U[i][i]
    35     print("L = 
    {}".format(np.array(L)))
    36     print("U = 
    {}".format(np.array(U)))
    37     
    38 print("分解完毕,开始计算Ly=b")
    39 # 分解完毕 解Ly =b
    40 y = [[0] for i in range(height)]
    41 # print(y)
    42 for i in range(height):
    43     _sum = 0
    44     for k in range(i):
    45         _sum += L[i][k] * y[k][0]
    46     y[i][0] = (b[i][0] - _sum)          # 这里不用除以系数因为对角线为1
    47     print(y)
    48 print("计算完毕,开始计算Ux=y")
    49 x = [[0] for i in range(height)]
    50 for i in range(height-1,-1,-1):
    51     _sum = 0
    52     for k in range(height-1,i,-1):
    53         _sum += U[i][k] * x[k][0]
    54     x[i][0] = (y[i][0] - _sum) / U[i][i]
    55     print(x)
    56 print("最终结果x: 
    {}".format(np.array(x)))

    over。

  • 相关阅读:
    修改程序堆栈的可执行属性
    【转】关于C语言生成不重复的随机数
    Apriori算法
    远程连接服务器端Jupyter Notebook
    Android KeyLogger Demo
    Windows消息钩取
    基址重定位表&.reloc节区
    调试UPX压缩的notepad
    PE文件格式
    apk逆向
  • 原文地址:https://www.cnblogs.com/Mz1-rc/p/13852665.html
Copyright © 2011-2022 走看看