雅可比迭代和高斯—赛德尔迭代法

一、雅可比迭代法

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

\left ( D-L-U \right )X= b

DX=\left ( L+U \right )X+b

X^{k+1}=D^{-1}\left ( L+U \right )X^{k}+D^{-1}b

1.1雅可比迭代法的matlab代码

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

12x_{1}-2x_{2}+x_{3} =5x

-2x_{1}+12x_{2}-2x_{3}+x_{4}=5

x_{1}-2x_{2}+12x_{3}-2x_{4}+x_{5}=5

x_{2}-2x_{3}+12x_{4}-2x_{5}+x_{6}=5

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

x_{46}-2x_{47}+12x_{48}-2x_{49}+x_{50}=5 

x_{47}-2x_{48}+12x_{49}-2x_{50}=5 

x_{48}-2x_{49}+12x_{50}=5

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)

二、高斯—赛德尔迭代法

      高斯—赛德尔迭代法是再雅可比迭代法的基础上,在计算y_{k+1}时尽可能地用最新的x_{k+1}来替换x_{k} 。同样对于线性方程组 AX=b,我们首先将系数矩阵A分解为对角矩阵D、下三角矩阵L和上三角矩阵U:

\left ( D-L-U \right )X= b

DX^{\left ( k+1 \right )}=LX^{\left ( k+1 \right )}+UX^{\left ( k \right )}+b

\left ( D-L \right )X^{\left ( k+1 \right )}=UX^{\left ( k \right )}+b

X^{\left ( k+1 \right )}=\left ( D-L^{} \right )^{-1}UX^{\left ( k \right )}+\left ( D-L^{} \right )^{-1}b 

 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)

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
首先,我们需要明确雅可比迭代法高斯德尔迭代法迭代公式: 雅可比迭代法: $$ x_i^{(k+1)}=\frac{1}{a_{ii}} \left(b_i-\sum_{j=1,j\neq i}^{n} a_{ij}x_j^{(k)}\right),\quad i=1,2,\cdots,n $$ 高斯德尔迭代法: $$ x_i^{(k+1)}=\frac{1}{a_{ii}} \left(b_i-\sum_{j=1}^{i-1} a_{ij}x_j^{(k+1)}-\sum_{j=i+1}^{n} a_{ij}x_j^{(k)}\right),\quad i=1,2,\cdots,n $$ 其中,$a_{ij}$ 和 $b_i$ 分别表示系数矩阵和常数向量的元素,$x_i^{(k)}$ 表示第 $k$ 次迭代后第 $i$ 个未知量的值。 下面是 MATLAB 的实现: % 雅可比迭代法 function [x, k] = Jacobi(A, b, x0, epsilon, maxIter) % A:系数矩阵 % b:常数向量 % x0:迭代初值 % epsilon:迭代精度 % maxIter:最大迭代次数 % x:方程组的 % k:迭代次数 n = length(b); x = x0; for k = 1 : maxIter for i = 1 : n temp = b(i); for j = 1 : n if j ~= i temp = temp - A(i, j) * x(j); end end x(i) = temp / A(i, i); end if norm(A * x - b, inf) < epsilon return; end end % 高斯德尔迭代法 function [x, k] = GaussSeidel(A, b, x0, epsilon, maxIter) % A:系数矩阵 % b:常数向量 % x0:迭代初值 % epsilon:迭代精度 % maxIter:最大迭代次数 % x:方程组的 % k:迭代次数 n = length(b); x = x0; for k = 1 : maxIter for i = 1 : n temp = b(i); for j = 1 : i - 1 temp = temp - A(i, j) * x(j); end for j = i + 1 : n temp = temp - A(i, j) * x(j); end x(i) = temp / A(i, i); end if norm(A * x - b, inf) < epsilon return; end end
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天下弈星~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值