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

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 '未收敛'}")