第九课 线性联立方程的高斯赛德尔迭代
在雅可比迭代中,{x}k+1(在上一课中被称为xnew)的所有分量都是使用{x}k(在上一课中为x)的分量推出的。因此,新的向量值完全是根据旧的向量值获得的。
然而,在对等式
第一行进行评估后,有一个新的(x1)k+1可用,它可能比(x1)k更接近真实解。在高斯-塞德尔技术中,新值(x1)k+1立即由“旧”解x中的(x1)k值来替换。在对第二行进行计算后,(x2)k+1由(x2)k进行替换,以此类推。下表显示了上式运行过程的收敛性。
很明显,比上一课的迭代速度更快
高斯-塞德尔迭代过程和上一课的因数是完全一样的,但具有一个不同的排列方式
因为在运算[U]{x}k中,行i的评估不依赖于Xi、Xi-1等,因此可以在需要时采取更新变量,看了下面的展开式能更好的理解。
右手边的值需要通过一个矩阵向量乘法和一个向量加法完成,得到下面这个方程:
这个方程为下面这个形式
这个方程和我们之前提到的‘从前迭代法’完全相同,所以可以使用subfor子程序。
计算实例:通过高斯赛德尔解方程
每个向量除以主对角线值然后重新排列得到:
因此
假设开始值为
得到
经过‘从前迭代法’,得到
第二次迭代方程为
再使用‘从前迭代法’,得到
收敛过程仍然有些慢,但会比雅可比迭代快一些。
代码如下:其中有一个主程序和两个子程序,分别为‘从前迭代法’子程序subfor,检查是否收敛的子程序checkit。
#线性联立方程的高斯赛德尔迭代
import numpy as np
import math
import B
n=3
converged=np.array([False])
u=np.zeros((n,n))
xnew=np.zeros((n,1))
a=np.array([[16,4,8