ee
This commit is contained in:
55
按方法整理/矩阵-雅可比迭代法.py
Normal file
55
按方法整理/矩阵-雅可比迭代法.py
Normal 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 '未收敛'}")
|
||||
Reference in New Issue
Block a user