一、雅可比迭代法
对于线性方程组AX=b,我们首先将系数矩阵A分解为对角矩阵D、下三角矩阵L和上三角矩阵U:
1.1雅可比迭代法的matlab代码
在这里,我们求解下面的带状方程(以下程序均是以求解该带状方程为例):
.............
function X0=jacobi(A,b,X0,delta,max1)
%输入 -A代表线性方程组AX=b的系数矩阵
% -b代表线性方程组AX=b右侧的数值
% -X0代表线性方程组AX=b进行高斯-赛德尔迭代法求解的迭代初值
% -delta代表余项AX(k)-B的范数允许误差
% -max1代表迭代的次数
%输出 -X0代表通过雅可比迭代法求解线性方程组AX=b的解
[N,N]=size(A);
L=-tril(A,-1);
U=-triu(A,1);
D=A+L+U;
B=inv(D)*(L+U)
f=inv(D)*b;
for k=1:max1
X0=B*X0+f;
err=abs(norm(A(:,:)*X0(:)-b(:),2))
if err<delta
break
end
end
1.2雅可比迭代法的python代码
import numpy as np
def jacobi(A,b,X0,max1):
'''A代表线性方程组AX=b的系数矩阵
b代表线性方程组AX=b右边的部分
X0代表高斯—赛德尔迭代的初始值
max1代表迭代的次数'''
n = np.shape(A)[0]
L = -np.tril(A, -1)
U = -np.triu(A, 1)
D = A + L + U
B = np.dot(np.linalg.inv(D),L+U)
f = np.dot(np.linalg.inv(D),b)
for i in range(max1):
X0 = np.dot(B, X0) + f
return X0
n=50
#线性方程组AX=b右边的部分
b=np.zeros((n,1))
for i in range(n):
b[i]=5
#线性方程组AX=b的系数矩阵
A=np.zeros((n,n))
for i in range(n):
A[i,i]=12
if i>=0 and i<=48:
A[i,i+1]=-2
if i>=0 and i<=47:
A[i,i+2]=1
if i>=1:
A[i,i-1]=-2
if i>=2:
A[i,i-2]=1
#迭代的初始值
X0=np.zeros((n,1))
for i in range(n):
X0[i]=0
#进行迭代的次数
max1=50
#进行高斯—赛德尔迭代求解线性方程组AX=b的解
X=jacobi(A,b,X0,max1)
#输出由高斯—赛德尔迭代求得的线性方程组的解
print(X)
二、高斯—赛德尔迭代法
高斯—赛德尔迭代法是再雅可比迭代法的基础上,在计算时尽可能地用最新的来替换 。同样对于线性方程组 AX=b,我们首先将系数矩阵A分解为对角矩阵D、下三角矩阵L和上三角矩阵U:
2.1高斯—赛德尔迭代法的matlab代码
function X0=Gauss_Saidel(A,b,X0,max1)
%输入 -A代表线性方程组AX=b的系数矩阵
% -b代表线性方程组AX=b右侧的数值
% -X0代表线性方程组AX=b进行高斯-赛德尔迭代法求解的迭代初值
% -max1代表迭代的次数
%输出 -X0代表通过高斯-赛德尔迭代法求解线性方程组AX=b的解
[N,N]=size(A);
L=-tril(A,-1);
U=-triu(A,1);
D=A+L+U;
B=inv(D-L)*U;
f=inv(D-L)*b;
for k=1:max1
X0=B*X0+f
end
2.2高斯—赛德尔迭代法的python代码
import numpy as np
def Gauss_Saidel(A,b,X0,max1):
'''A代表线性方程组AX=b的系数矩阵
b代表线性方程组AX=b右边的部分
X0代表高斯—赛德尔迭代的初始值
max1代表迭代的次数'''
n=np.shape(A)[0]
L=-np.tril(A,-1)
U=-np.triu(A,1)
D=A+L+U
B=np.dot(np.linalg.inv(D-L),U)
f=np.dot(np.linalg.inv(D-L),b)
for i in range(max1):
X0=np.dot(B,X0)+f
return X0
n=50
#线性方程组AX=b右边的部分
b=np.zeros((n,1))
for i in range(n):
b[i]=5
#线性方程组AX=b的系数矩阵
A=np.zeros((n,n))
for i in range(n):
A[i,i]=12
if i>=0 and i<=48:
A[i,i+1]=-2
if i>=0 and i<=47:
A[i,i+2]=1
if i>=1:
A[i,i-1]=-2
if i>=2:
A[i,i-2]=1
#迭代的初始值
X0=np.zeros((n,1))
for i in range(n):
X0[i]=0
#进行迭代的次数
max1=50
#进行高斯—赛德尔迭代求解线性方程组AX=b的解
X=Gauss_Saidel(A,b,X0,max1)
#输出由高斯—赛德尔迭代求得的线性方程组的解
print(X)