This commit is contained in:
2025-06-19 09:34:40 +08:00
parent 9248b0d302
commit 839a79bb32
3 changed files with 112 additions and 1 deletions

View File

@@ -0,0 +1,55 @@
import math
#模 范数
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
#Jacobi 雅可比迭代
def Jacobi(A,b,x,err,N):
count = 0
n = len(A)
while True:
count += 1
x_tt = x.copy() # 保存上一次迭代的解
for i in range(n):
sum1 = sum(A[i][j] * x_tt[j] for j in range(i))
sum2 = sum(A[i][j] * x_tt[j] for j in range(i+1, n))
x[i] = (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__":
##########################################################################
#把矩阵改成题干的矩阵b改成题干结果err精度要求修改##########################
A = [
[10,-1,2,0],
[-1,11,-1,3],
[2,-1,10,-1],
[0,3,-1,8]
]
b = [6,25,-11,15]
x = [0,0, 0, 0] # 初始解
err = 1e-5 # 精度要求
x1,k,sta = Jacobi(A, b, x, err, 100)
print(f"解为: {x1}, 迭代次数: {k}, 状态: {'收敛' if sta == 1 else '未收敛'}")