在Gauss-Seidel迭代法中M=D-L的基础上,我们令M=(1/w)(D-wL),B=I-M的逆A,f=M的逆b,其中w为可选择的松弛因子,要求w>0
于是M的逆=w((D-wL)的逆),B=I-M的逆A=I-w((D-wL)的逆)A=((D-wL)的逆)((1-w)D+wU)
从而得到解方程组的SOR解法
B=I-M的逆A=I-w((D-wL)的逆)A=((D-wL)的逆)((1-w)D+wU)
f=w((D-wL)的逆)b
递推公式x(k+1)=Bx(k)+f
例子同前
令w=1时就是Gauss-Seidel解法
要求精确到小数点后5位
代码如下
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 14 10:10:38 2019
@author: Minghua Chen
"""
#逐次超松弛迭代法
import numpy as np
A=[[10.0,3.0,1.0], [2.0,-10.0,3.0], [1.0,3.0,10.0]]
b=[[14.0,-5.0,14.0]]
def get_base(A):
base=list(np.zeros((len(A),len(A))))
D=[]
for i in base:
D.append(list(i))
return D
def get_U(A):
D=get_base(A)
i=0
while i<len(A):
k=i+1
while k<