一、雅可比迭代法

       对于线性方程组AX=b,我们首先将系数矩阵A分解为对角矩阵D、下三角矩阵L和上三角矩阵U:

python 雅可比迭代法 雅可比迭代法矩阵_线性代数

python 雅可比迭代法 雅可比迭代法矩阵_matlab_02

python 雅可比迭代法 雅可比迭代法矩阵_python_03

1.1雅可比迭代法的matlab代码

  在这里,我们求解下面的带状方程(以下程序均是以求解该带状方程为例):

python 雅可比迭代法 雅可比迭代法矩阵_python 雅可比迭代法_04

python 雅可比迭代法 雅可比迭代法矩阵_python 雅可比迭代法_05

python 雅可比迭代法 雅可比迭代法矩阵_python 雅可比迭代法_06

python 雅可比迭代法 雅可比迭代法矩阵_matlab_07

.............

python 雅可比迭代法 雅可比迭代法矩阵_线性代数_08

 

python 雅可比迭代法 雅可比迭代法矩阵_线性代数_09

 

python 雅可比迭代法 雅可比迭代法矩阵_matlab_10


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)

二、高斯—赛德尔迭代法

      高斯—赛德尔迭代法是再雅可比迭代法的基础上,在计算

python 雅可比迭代法 雅可比迭代法矩阵_python_11

时尽可能地用最新的

python 雅可比迭代法 雅可比迭代法矩阵_matlab_12

来替换

python 雅可比迭代法 雅可比迭代法矩阵_python_13

 。同样对于线性方程组 AX=b,我们首先将系数矩阵A分解为对角矩阵D、下三角矩阵L和上三角矩阵U:

python 雅可比迭代法 雅可比迭代法矩阵_线性代数

python 雅可比迭代法 雅可比迭代法矩阵_线性代数_15

python 雅可比迭代法 雅可比迭代法矩阵_算法_16

python 雅可比迭代法 雅可比迭代法矩阵_python_17

 

 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)