Files
CalWay_Python/228-15.py
2025-06-19 09:48:44 +08:00

84 lines
2.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#模 范数
def Norm(x,v):
if len(x[0]) == 1:
if v == 1:
return sum([abs(i[0]) for i in x])
elif v == 2:
return (sum([i[0]**2 for i in x]))**0.5
elif v == float("inf"):
return max([abs(i[0]) for i in x])
else:
if v == 1:
return max([sum([abs(x[i][j]) for i in range(len(x))]) for j in range(len(x[0]))])
elif v == float("inf"):
return max([sum([abs(i) for i in x[j]]) for j in range(len(x))])
return None
# 计算矩阵的行列式
def Det(A):
if len(A) == 2:
return A[0][0] * A[1][1] - A[0][1] * A[1][0]
det = 0
for c in range(len(A)):
sub_matrix = [row[:c] + row[c+1:] for row in A[1:]]
det += ((-1) ** c) * A[0][c] * Det(sub_matrix)
return det
# 计算矩阵的逆矩阵
def Inverse(A):
n = len(A)
# 计算代数余子式矩阵
B = [[0 for i in range(n)] for j in range(n)]
for i in range(n):
for j in range(n):
minor = [row[:j] + row[j+1:] for row in (A[:i] + A[i+1:])]
B[j][i] = ((-1) ** (i + j)) * sum(minor[k][l] * (-1) ** (k + l) for k in range(n - 1) for l in range(n - 1))
det = Det(A)
print("det(A):",det)
if det == 0:
print("矩阵不可逆")
return None
A_inv = [[B[i][j] / det for j in range(n)] for i in range(n)]
return A_inv
def FixInv(A):
n = len(A)
if n == 2:
return [[A[1][1] / Det(A), -A[0][1] / Det(A)],
[-A[1][0] / Det(A), A[0][0] / Det(A)]]
B = [[0 for i in range(n)] for j in range(n)]
for i in range(n):
for j in range(n):
t = [row[:j] + row[j+1:] for row in (A[:i] + A[i+1:])]
B[j][i] = ((-1) ** (i + j)) * Det(t)
det = Det(A)
if det == 0:
print("矩阵不可逆")
return None
A_inv = [[B[i][j] / det for j in range(n)] for i in range(n)]
return A_inv
# 计算矩阵的条件数
def Cond(A,v):
# inv_A = Inverse(A)
inv_A = FixInv(A)
print(inv_A,Norm(A, v), Norm(inv_A, v))
return Norm(A, v) * Norm(inv_A, v)
#把矩阵换成题干的矩阵#########################
if __name__ == "__main__":
A = [
[1,2],
[1.001,2.001]
]
#把范数的种类数换成题干的要求inf是无穷范数#########################
print(f"矩阵A的条件数为: {Cond(A, float('inf')):.5f}")
#把矩阵换成题干的矩阵#########################
A = [
[1,2],
[3,4]
]
#把范数的种类数换成题干的要求inf是无穷范数########################
print(f"矩阵A的条件数为: {Cond(A, float('inf')):.5f}")