This commit is contained in:
2025-06-04 21:39:19 +08:00
parent 3badad06a0
commit 94c7e886bf
5 changed files with 333 additions and 0 deletions

35
227-8.py Normal file
View File

@@ -0,0 +1,35 @@
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 Dot(A,B):
if len(A[0]) != len(B):
return None
return [[sum([A[i][j] * B[j][k] for j in range(len(A[0]))]) for k in range(len(B[0]))] for i in range(len(A))]
if __name__ == "__main__":
A = [[1, 3], [-2, 4]]
x = [[1], [-1]]
print("Norm of x with v=1:", Norm(x, 1))
print("Norm of x with v=inf:", Norm(x, float("inf")))
print("Norm of x with v=2:", Norm(x, 2))
print("Dot product of A and x:", Dot(A, x))
print("Norm of Ax with v=2:", Norm(Dot(A, x), 2))
print("Norm of A with v=inf:", Norm(A, float("inf")))
print("Norm of A with v=1:", Norm(A, 1))

88
228-12.py Normal file
View File

@@ -0,0 +1,88 @@
def MullerSolve(fx,x0,x1,x2,err1,err2,N):
count = 0
f0 = fx(x0)
f1 = fx(x1)
f2 = fx(x2)
q = (x2 - x1) / (x1 - x0)
p = 0
a = 0
b = 0
c = 0
while True:
p = (x2 - x0) / (x1 - x0)
a = q**2 * f0 - q*p*f1 + q*f2
b = q**2 *f0 - p**2 *f1 + (p + q)*f2
c = p*f2
h1 = 0
if b.real < 0:
h1 = -2 * c / (b - (b**2 - 4*a*c)**0.5)
else:
h1 = -2 * c / (b + (b**2 - 4*a*c)**0.5)
x3 = x2 + h1 * (x2 - x1)
f3 = fx(x3)
k = err1 + 1
if abs(f3) < 1:
k = abs(x3 - x2)
else:
k = abs(x3 - x2) / abs(f3)
if abs(f3) < err2 or k < err1:
return x3, 1
count += 1
if count > N:
return None, 0
x0 = x1
x1 = x2
x2 = x3
f0 = f1
f1 = f2
f2 = f3
q = h1
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
if __name__ == "__main__":
A =[
[1,0,1],
[2,2,1],
[-1,0,0]
]
lam = []
count = 0
k = -100
fx = lambda x: Det([[A[i][j] - x * (1 if i == j else 0) for j in range(len(A))] for i in range(len(A))])
k = 10
while len(lam) < len(A):
for i in range(-k,k):
re,sta = MullerSolve(fx, i, i + 1, i + 2, 1e-10, 1e-10, 100)
if sta == 1:
a = round(re.real, 9)
b = round(re.imag, 9)
re_t = complex(a, b)
if re_t not in lam:
if re_t.imag != 0:
lam.append(re_t)
lam.append(re_t.conjugate())
else:
lam.append(a)
if len(lam) == len(A):
break
k *= 10
p = abs(lam[0])
for i in range(len(lam)):
print(f"λ{i+1} = {lam[i]}")
if abs(lam[i]) > p:
p = abs(lam[i])
print(f"谱半径 = {p:.3f}")

56
228-13.py Normal file
View File

@@ -0,0 +1,56 @@
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 SOR(A,b,x,w,err,N):
count = 0
n = len(A)
while True:
count += 1
for i in range(n):
sum1 = sum(A[i][j] * x[j] for j in range(i))
sum2 = sum(A[i][j] * x[j] for j in range(i, n))
x[i] += w*(b[i] - sum1 - sum2) / A[i][i]
r = [[b[i] - sum(A[i][j] * x[j] for j in range(len(A[0])))] for i in range(n)]
err_now = Norm(r, float("inf"))
x_t = [round(i,5) for i in x]
print(f"{count}次迭代, 误差 = {err_now:.5}, x = {x_t}")
if err_now < err:
return x, count, 1
if count > N:
return None,count, 0
if __name__ == "__main__":
A = [
[4,-1,0,-1,0,0],
[-1,4,-1,0,-1,0],
[0,-1,4,0,0,-1],
[-1,0,0,4,-1,0],
[0,-1,0,-1,4,-1],
[0,0,-1,0,-1,4]
]
b = [2,3,2,2,1,2]
x = [0,0, 0, 0, 0, 0]
err = 1e-5
w = 1
x1,k,sta = SOR(A, b, x, w, err, 100)
print(f"w = {w}, 解为: {x1}, 迭代次数: {k}, 状态: {'收敛' if sta == 1 else '未收敛'}")
w = 1.1
x = [0, 0, 0, 0, 0, 0]
x2,k,sta = SOR(A, b, x, w, err, 100)
print(f"w = {w}, 解为: {x2}, 迭代次数: {k}, 状态: {'收敛' if sta == 1 else '未收敛'}")

60
228-15.py Normal file
View File

@@ -0,0 +1,60 @@
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)
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)
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]
]
print(f"矩阵A的条件数为: {Cond(A, float('inf')):.5f}")
A = [
[1,2],
[3,4]
]
print(f"矩阵A的条件数为: {Cond(A, float('inf')):.5f}")

94
228-17.py Normal file
View File

@@ -0,0 +1,94 @@
def SovleRowMain(A,b,round_num=15):
ks = 0.00000001
n = len(A)
if len(A[0]) != n:
print("A要为方阵")
return None, None, None, None
if len(b) != n:
print("b与A的行数不匹配")
return None, None, None, None
p = list(range(n))
for i in range(n):
row_max = abs(A[i][i])
row_max_index = i
for j in range(i + 1, n):
if abs(A[j][i]) > row_max:
row_max = abs(A[j][i])
row_max_index = j
A[i], A[row_max_index] = A[row_max_index], A[i]
b[i], b[row_max_index] = b[row_max_index], b[i]
p[i], p[row_max_index] = p[row_max_index], p[i]
if abs(A[i][i]) < ks:
print("A矩阵奇异无法进行高斯消元")
return None, None, None, None
for j in range(i + 1, n):
m = round(A[j][i] / A[i][i],round_num)
A[j][i] = m
for k in range(i + 1, n):
A[j][k] -= round(m * A[i][k],round_num)
b[j] -= round(m * b[i],round_num)
if abs(A[n - 1][n - 1]) < ks:
print("A矩阵奇异无法进行高斯消元")
return None, None, None, None
# 回代求解
b[n - 1] = round(b[n - 1]/A[n - 1][n - 1],round_num)
for i in range(n - 2, -1, -1):
for j in range(i + 1, n):
b[i] -= round(A[i][j] * b[j],round_num)
b[i] /= round(A[i][i])
b = [round(b[i], round_num) for i in range(n)]
# 得到L,U和P矩阵
L = [[0 for i in range(n)] for j in range(n)]
U = [[0 for i in range(n)] for j in range(n)]
P = [[0 for i in range(n)] for j in range(n)]
for i in range(n):
for j in range(n):
if i == j:
L[i][j] = 1
U[i][j] = A[i][j]
elif i < j:
U[i][j] = A[i][j]
else:
L[i][j] = A[i][j]
P[i][p[i]] = 1
return P,L,U,b
def IterativeMethod(A, b, err, N):
b_c = [b[i] for i in range(len(b))]
A_c = [[A[i][j] for j in range(len(A[0]))] for i in range(len(A))]
P,L,U,x0 = SovleRowMain(A_c, b_c,4)
print(L)
print(U)
print(f"初始解为: {x0}")
count = 0
while count<N:
r1 = [b[i] - sum([A[i][j] * x0[j] for j in range(len(A[0]))]) for i in range(len(A))]
A_c = [[A[i][j] for j in range(len(A[0]))] for i in range(len(A))]
d1 = SovleRowMain(A_c, r1,4)[3]
x0 = [x0[i] + d1[i] for i in range(len(x0))]
print(f"{count+1}次迭代, x{count+2} = {x0}, r{count+1} = {r1}, d{count+1} = {d1}")
err_now = max(abs(r1[i]) for i in range(len(r1)))
count += 1
if err_now < err:
break
return x0,count
if __name__ == "__main__":
A = [
[51,82],
[151/3,81]
]
b = [235,232]
err = 1e-4
N = 1000
x = IterativeMethod(A, b, err, N)[0]
print(f"解为: {x}")