当前位置: 代码迷 >> 综合 >> 线性联立方程的高斯赛德尔迭代(Gauss-Seidel iteration)(python,数值积分)
  详细解决方案

线性联立方程的高斯赛德尔迭代(Gauss-Seidel iteration)(python,数值积分)

热度:72   发布时间:2024-01-20 21:15:56.0

第九课 线性联立方程的高斯赛德尔迭代

在雅可比迭代中,{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],[4,5,-4],[8,-4,22]],dtype=np.float)
b=np.array([[4],[2],[5]],dtype=np.float)
x=np.array([[1],[1],[1]],dtype=np.float)
tol=1.0e-5
limit=100
print('系数矩阵')
print(a[:,0])
print('右手边向量',b[:,0])
print('初始猜测值',x[:,0])
for i in range(1,n+1):diag=a[i-1,i-1]a[i-1,:]=a[i-1,:]/diagb[i-1,0]=b[i-1,0]/diag
u[:]=0
for i in range(1,n+1):u[i-1,i:]=-a[i-1,i:]a[i-1,i:]=0
print('前几次迭代值')
iters=0
while(True):iters=iters+1xnew[:]=b[:]+np.dot(u,x)B.subfor(a,xnew)if iters<5:print(x[:,0])B.checkit(xnew,x,tol,converged)if converged==True or iters==limit:breakx[:,0]=xnew[:,0]
print('到收敛需要迭代次数',iters)
print('解向量',x[:,0])   
subfor
def subfor(a,b):
#一个下三角的从前迭代法n=a.shape[0]for i in range(1,n+1):total=b[i-1]if i>1:for j in range(1,i):total=total-a[i-1,j-1]*b[j-1]b[i-1]=total/a[i-1,i-1]
checkit
def checkit(loads,oldlds,tol,converged):
#检查前后两个量的收敛性neq=loads.shape[0]big=0.0 converged[:]=Truefor i in range(1,neq+1):if abs(loads[i-1,0])>big:big=abs(loads[i-1,0])for i in range(1,neq+1):if abs(loads[i-1,0]-oldlds[i-1,0])/big>tol:converged[:]=False

终端输出结果如下:
在这里插入图片描述
程序结果与计算结果一致。