基本思想是将系数矩阵(有限元和有限差分中都是稀疏矩阵)A,进行分解为
A =D-L-L.T
L:A的下三角矩阵的负数。
预处理矩阵则为:
有了预处理矩阵,则SSOR分解流程如下:
1:给定初始x,w,计算,
,p初始值=z
def ssor_PCG_decompose(A,b,T):
'''
求Ax = b.迭代次数T,
'''
D = np.diag(np.diag(A))
A_l = np.tril(-A,-1)#A的严格的下三角矩阵
x = np.zeros(len(b),dtype=complex)#initial x
w= 0.5
DA_l = temp = D-w*A_l
M = np.dot(np.dot(DA_l,np.linalg.inv(D)),DA_l.T)/np.sqrt(w*(2-w))#预处理矩阵
M_1 = np.linalg.inv(M)
fai = np.zeros(T)
r = b - np.dot(A,x)#residual
z = np.dot(M_1,r)
p = np.copy(z)
for I in range(T):
fai[i] = np.linalg.norm(r)
Ap = np.dot(App)
r_temp = np.dot(App)
alpha = r_temp/np.dot(p.T,Ap)
x = x+alpha*p
r = r-alpha*Ap
z = np.dot(M_1,r)
beta = np.dot(r.T,z)/r_temp
p = z+beta*p
return x,fai
对比直接使用求解的结果和普通的共轭梯度求得的解的结果:
可见SSOR的收敛性相较于CG较好。
但是需要注意A和的谱条件数小(特征值分布值集中)