63 lines
2.0 KiB
Python
63 lines
2.0 KiB
Python
import math
|
||
|
||
# 获取下三角矩阵的索引
|
||
# 列 行
|
||
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] # b向量,常数项
|
||
|
||
# print("x:")
|
||
print("x: \n",SqrtSolve(A,b))
|