照着上面的式子写
def SOR(A,b,x,e,w,times=100):
#A为方程组系数矩阵
#b为右端向量
#x为初始解
#e为误差大小
#w为松弛因子
#times为迭代次数
D = np.mat(np.diag(np.diag(A)))
L = np.triu(A, 1)
U = np.tril(A, -1)
Sw = (D+w*L).I*((1-w)*D-w*U)
fw = w*((D+w*L).I)*b
x0=x
x = Sw * x0 + fw
k = 1
while k < times:
if abs(np.max(abs(x-x0), axis=0))>e:
x0=x
x = Sw * x0 + fw
k += 1
else:
print('当w为', w, '时,SOR在%d次内收敛' % k)
break
print('SOR迭代解为\n', x)
#例子
A = np.mat([[4,-6,2,-8],[-6,10,-6,14],[2,-6,35,-15],[-8,14,-15,22]])
b = np.mat('-8;12;16;13')
x = np.mat('0;0;0;0')
e = pow(10,-6)
times = 500
w = 1.5
SOR(A,b,x,e,w,times)
结果