赞
踩
通过输入系数矩阵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]]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。