#列 行 def getIndexFromDownMatrix(col, row): if row > col: row, col = col, row return (1+col)*col//2+row # 平方根法求解 def SqrtSolve(A,b): n = len(b) L = [0]*(n*(n+1)//2) for j in range(n): for i in range(j,n): if i == j: L[getIndexFromDownMatrix(i,j)] = A[getIndexFromDownMatrix(i,j)] for k in range(j): L[getIndexFromDownMatrix(i,j)] -= L[getIndexFromDownMatrix(j,k)]**2 L[getIndexFromDownMatrix(i,j)] = L[getIndexFromDownMatrix(i,j)]**0.5 else: L[getIndexFromDownMatrix(i,j)] = A[getIndexFromDownMatrix(i,j)] for k in range(j): L[getIndexFromDownMatrix(i,j)] -= L[getIndexFromDownMatrix(i,k)]*L[getIndexFromDownMatrix(j,k)] L[getIndexFromDownMatrix(i,j)] /= L[getIndexFromDownMatrix(j,j)] # 打印下三角矩阵 print("下三角矩阵 L:") for i in range(n): L_row = [] for j in range(n): if j <= i: L_row.append(L[getIndexFromDownMatrix(i,j)]) else: L_row.append(0) print(L_row) # print(L) for i in range(n): for k in range(i): b[i] -= L[getIndexFromDownMatrix(i,k)]*b[k] b[i] /= L[getIndexFromDownMatrix(i,i)] # 打印 b 向量 print("y 向量:") print(b) for i in range(n-1,-1,-1): for k in range(i+1,n): b[i] -= L[getIndexFromDownMatrix(k,i)]*b[k] b[i] /= L[getIndexFromDownMatrix(i,i)] return b #把A,b换成题干的数值########################################### if __name__ == "__main__": # 储存下三角矩阵 a11, a21, a22, a31, a32, a33 ... A = [4,2,2,-2,-3,14] b = [10,5,4] # print("x:") print("x: \n",SqrtSolve(A,b))