• LU分解和求解线性方程组


     1 # coding:utf8
     2 import numpy as np
     3 
     4 def lu(mat):
     5     r,c=np.shape(mat)
     6     s=min(r,c)
     7     for k in range(s):
     8         x=1.0/mat[k][k]  # 将后续除法变成乘法
     9         for i in range(k+1,r):
    10             mat[i][k]=mat[i][k]*x  # L[1:][0]*U[0][0]=A[1:][0];A[0][:]=mat[0][:]
    11         for i in range(k+1,r):
    12             for j in range(k+1,c):
    13                 # U[1][2]*L[1][1]=A[1][2]-U[0][2]*L[1][0];L[1][1]=1
    14                 # L[2][1]*U[1][1]=A[2][1]-U[0][1]*L[2][0];下一个k时mat[i][j]/mat[k][k](i>j)
    15                 mat[i][j]=mat[i][j]-mat[k][j]*mat[i][k]
    16     return mat,c
    17 
    18 def solve(A,b):
    19     mat,n=lu(A)  # LU合并
    20     print mat  # [[16, 4, 8], [0.25, 4.0, -6.0], [0.5, -1.5, 9.0]]
    21     Z= np.zeros(n)  # L*Z=b U*X=Z
    22     X= np.zeros(n)
    23     Z[0]=b[0]
    24     for i in range(1,n):
    25         sumup=0
    26         for tmp in range(0,i):
    27             sumup+=mat[i][tmp]*Z[tmp]
    28         Z[i]=(b[i]-sumup)
    29     X[n-1]=Z[n-1]/mat[n-1][n-1]
    30     for i in range(n-2,-1,-1):
    31         sumup=0
    32         for tmp in range(i+1,n):
    33             sumup+=mat[i][tmp]*X[tmp]
    34         X[i]=(Z[i]-sumup)/mat[i][i]
    35     return X
    36 
    37 A=[[16,4,8],[4,5,-4],[8,-4,22]]
    38 y=[-4,3,10]
    39 print "The result of the fomula is:"+str(solve(A,y))  # [-2.25  4.    2.  ]
  • 相关阅读:
    AcWing 171. 送礼物
    AcWing 167. 木棒
    AcWing 166. 数独
    AcWing 168. 生日蛋糕
    AcWing 180 排书
    A*与IDA* 算法介绍
    AcWing 170. 加成序列[曾用名:加法链]
    AcWing 普通队列与循环队列写法
    AcWing 181. 回转游戏
    AcWing 1129. 热浪【单源最短路】
  • 原文地址:https://www.cnblogs.com/qw12/p/6078578.html
Copyright © 2020-2023  润新知