59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
|
|
#列 行
|
|
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))
|