ps:这是按照自己的理解写的程序,代码比较糙。献丑了,望海涵!
#Successive Over Relaxation method
import numpy as np
import sys
def SOR(x0,A,b,w):
if A.shape[1] != x0.shape[0] and A.shape[0] != b.shape[0]:
sys.exit('Please try again! Because the dimensions are not equal.')
k = 0
eps = 1e-6
flag = True
count = 1
n = x0.shape[0]
x = np.zeros([n,1])
while flag:
for i in range(0,n):
if i==0:
x[i] = (1-w)*x0[0] + w*(b[0] - A[0,1:]@x0[1:])/A[0,0]
elif i==n-1:
x[n-1] = (1-w)*x0[n-1] + w*(b[n-1] - A[n-1,0:n-1]@x[0:n-1])/A[n-1,n-1]
else:
x[i] = (1-w)*x0[i] + w*(b[i] - A[i,0:i]@x[0:i]-A[i,i+1:]@x0[i+1:])/A[i,i]
print('No.{}:\nx = {}'.format(count,x))
count += 1
if np.linalg.norm(np.abs(x-x0),np.inf)<eps:
flag = False
print('The optimal value: x = ',x.T)
x0 = x.copy()
x0 = np.array([[0],[0],[0]])
A = np.array([[8,-3,2],[4,11,-1],[6,3,12]])
b = np.array([[20],[33],[36]])
w = 1.3
#SOR(x0,A,b,w)
x1 = np.array([[1],[1],[1]])
A1 = np.array([[2,-1,0],[-1,2,-1],[0,-1,2]])
b1 = np.array([[1],[0],[1.8]])
w1 = 1.4
#SOR(x1,A1,b1,w1)
x2 = np.array([[0],[0],[0],[0]])
A2 = np.array([[-4,1,1,1],[1,-4,1,1],[1,1,-4,1],[1,1,1,-4]])
b2 = np.array([[1],[1],[1],[1]])
w2 = 1.3
SOR(x2,A2,b2,w2)
x3 = np.array([[0],[0],[0]])
A3 = np.array([[4,-1,0],[-1,4,-1],[0,-1,4]])
b3 = np.array([[1],[4],[-3]])
w3 = 1.03
#SOR(x3,A3,b3,w3)