通过输入系数矩阵mx,值矩阵mr,最大迭代次数n,目标误差e即可得到答案。在原博主代码基础上添加了对系数矩阵的收敛性判断。原文链接:https://blog.csdn.net/wushaoji321/article/details/106800464/
import numpy as np
def Jacobi_astringency(mx): # 判断系数矩阵的收敛性
L, D, U = [], [], [] # 初始化L,D,U矩阵
for i in range(len(mx)):
L.append([]), D.append([]), U.append([])
for j in range(len(mx)):
if i > j:
L[i].append(mx[i][j]), D[i].append(0), U[i].append(0)
if i == j:
L[i].append(0), D[i].append(mx[i][j]), U[i].append(0)
if i < j:
L[i].append(0), D[i].append(0), U[i].append(mx[i][j])
# print(L)
# print(D)
# print(U)
lu = L # 计算L+U矩阵
for i in range(len(mx)):
for k in range(len(mx)):
lu[i][k] = L[i][k] + U[i][k]
# print(L_U)
G = np.dot(-np.linalg.inv(D), lu) # 得到G矩阵
e, v = np.linalg.eig(G)
for i in range(len(e)):
count = 0 # 计算不小于一的特征值的数量
if abs(e[i]) >= 1:
count = count + 1
# print(count)
if count == 0:
return True
else:
print("迭代法不收敛")
return False
def Jacobi(mx, mr, n=100, e=0.0001): # mx为系数矩阵,mr为值矩阵,n为默认迭代次数,e为默认误差返回
if len(mx) == len(mr): # 若mx与mr长度相等则开始迭代,否则方程无解
if Jacobi_astringency(mx) == 1: # 判断系数矩阵mx是否收敛
x = []
for i in range(len(mr)):
x.append([0]) # 得到长度与mr相等的初值,并且把初值设定为零
count = 0 # 迭代次数计数
while count < n: # 没有达到迭代次数时继续迭代
tempx = [] # 暂时存储单次迭代后的解
for i in range(len(x)):
ri = mr[i][0]
for k in range(len(mx[i])):
if k != i:
ri = ri - mx[i][k] * x[k][0]
ri = ri / mx[i][i]
tempx.append([ri]) # 每次计算存储单个x值
print("第{}次迭代的值为:{}".format(count + 1, tempx))
ee = [] # 存储每两次迭代结果之间的误差
for i in range(len(x)):
ee.append(abs(x[i][0] - tempx[i][0]))
em = max(ee) # 取最大误差值
print("第{}、{}次迭代间误差值为:{}".format(count, count + 1, em))
if em < e:
return tempx # 当两次迭代的x的最大误差满足要求时,直接返回计算结果
x = tempx
count += 1
return False # 当运行到最大迭代次数时精度仍不满足要求则返回错误
else:
print("使用迭代法不收敛")
else:
print("此方程无解")
#举例
mx = [[5, 2, 1], [-1, 4, 2], [2, -5, 10]]
# print(len(mx))
mr = [[-12], [10], [1]]
# print(len(mr))
print(Jacobi(mx, mr, 100, 0.0001))
实现结果如下:
第1次迭代的值为:[[-2.4], [2.5], [0.1]]
第0、1次迭代间误差值为:2.5
第2次迭代的值为:[[-3.4200000000000004], [1.8499999999999999], [1.83]]
第1、2次迭代间误差值为:1.73
第3次迭代的值为:[[-3.5060000000000002], [0.73], [1.709]]
第2、3次迭代间误差值为:1.1199999999999999
第4次迭代的值为:[[-3.0338000000000003], [0.7689999999999999], [1.1662000000000001]]
第3、4次迭代间误差值为:0.5428
第5次迭代的值为:[[-2.94084], [1.1584499999999998], [1.0912600000000001]]
第4、5次迭代间误差值为:0.38944999999999985
第6次迭代的值为:[[-3.081632], [1.21916], [1.2673929999999998]]
第5、6次迭代间误差值为:0.17613299999999965
第7次迭代的值为:[[-3.1411426000000002], [1.0958955000000001], [1.3259064]]
第6、7次迭代间误差值为:0.12326449999999989
第8次迭代的值为:[[-3.10353948], [1.05176115], [1.2761762700000001]]
第7、8次迭代间误差值为:0.04973012999999993
第9次迭代的值为:[[-3.075939714], [1.0860269949999999], [1.246588471]]
第8、9次迭代间误差值为:0.03426584499999996
第10次迭代的值为:[[-3.0837284922], [1.107720836], [1.2582014403]]
第9、10次迭代间误差值为:0.021693841000000047
第11次迭代的值为:[[-3.0947286224600004], [1.0999671568], [1.2706061164400002]]
第10、11次迭代间误差值为:0.012404676140000293
第12次迭代的值为:[[-3.094108086008], [1.091014786165], [1.2689293028920001]]
第11、12次迭代间误差值为:0.008952370635000095
第13次迭代的值为:[[-3.0901917750444], [1.092008327052], [1.2643290102841]]
第12、13次迭代间误差值为:0.0046002926079000694
第14次迭代的值为:[[-3.08966913287762], [1.0952875510968498], [1.26404251853488]]
第13、14次迭代间误差值为:0.0032792240448498156
第15次迭代的值为:[[-3.0909235241457163], [1.095561457513155], [1.2655776021239489]]
第14、15次迭代间误差值为:0.001535083589068842
第16次迭代的值为:[[-3.091340103430052], [1.0944803179015965], [1.2659654335857207]]
第15、16次迭代间误差值为:0.0010811396115584238
第17次迭代的值为:[[-3.090985213877783], [1.0941822573496267], [1.2655081796368086]]
第16、17次迭代间误差值为:0.00045725394891205084
第18次迭代的值为:[[-3.0907745388672128], [1.09449960671215], [1.2652881714503699]]
第17、18次迭代间误差值为:0.00031734936252325596
第19次迭代的值为:[[-3.090857476974934], [1.0946622795580119], [1.2654047111295175]]
第18、19次迭代间误差值为:0.00016267284586191089
第20次迭代的值为:[[-3.0909458540491084], [1.0945832751915079], [1.2655026351739926]]
第19、20次迭代间误差值为:9.792404447517278e-05
[[-3.0909458540491084], [1.0945832751915079], [1.2655026351739926]]