精华内容
下载资源
问答
  • Gauss-Seidel迭代法

    2014-04-13 20:50:16
    Gauss-Seidel迭代法
  • Gauss-Seidel迭代法3.c

    2021-06-11 15:27:26
    Gauss-Seidel迭代法
  • Jacobi迭代法和Gauss-Seidel迭代法.docx
  • Jacobi迭代法求解线性方程组以及Gauss-Seidel迭代法求解线性方程组的程序,C语言
  • 求解线性⽅方程组 Ax=b,其中 A 为 ...比较 Jacobi 迭代法Gauss-Seidel 迭代法、逐次超松弛迭代法、 共轭梯度法与高斯消去法、列主元消去法的计算时间。改变逐次超松弛迭代法的松弛因⼦, 分析其对收敛速度的影响。
  • 在电力系统潮流计算阶段需要选用最科学的算法,由于Gauss-Seidel迭代法可以降低计算误差,所以在提高计算精度方面发挥着重要作用。基于此,介绍了Gauss-Seidel迭代算法基本原理以及Gauss-Seidel迭代算法用于潮流计算的...
  • 基于Matlab的Gauss-Seidel迭代法电力系统潮流计算.pdf
  • 给出了一定条件下的外推Gauss-Seidel迭代法的最优外推参数和谱半径,并深入细致的讨论了Gauss-Seidel迭代法和外推Gauss-Seidel迭代法的收敛速度的比较,证明了在一定的条件下,最优外推Gauss-Seidel迭代法总是比Gauss-...
  • H矩阵的预条件Gauss-Seidel迭代法,杭丹,王晓燕,讨论了新的预条件矩阵下的预条件Gauss-Seidel法并将此法应用于H-矩阵,得到了相应的收敛性结果,最后,给出一个数值例子验证所得到的�
  • PAGE PAGE 1 Gauss-Seidel迭代法的程序 function x=Gauss_Seidel(A,b) [m,n]=size(A; x0=zeros(n,1; x=zeros(n,1; k=0; for i=1:n x(i)=b(i; for j=1:i-1 x(i)=x(i)-A(i,j*x(j; end for j=i+1:n x(i)=x(i)-A(i,j*x0...
  • 数值分析方法,详细对比分析线性方程组的Jacobi迭代法与Gauss-Seidel迭代法数值解法,包含MATLAB程序文件,可做参考。
  • 给出一种预条件Gauss-Seidel迭代法,证明了当系数矩阵A为不可约的Z-矩阵、H-矩阵、正定矩阵时该方法收敛,从而扩展了该方法的适用范围,最后通过数值例子验证所得的主要结论。
  • 给出一种改进的Gauss-Seidel迭代法(IMGS方法),从理论上证明了当系数矩阵为M-矩阵和H-矩阵时IMGS方法是收敛的。最后用数值例子验证了所得的主要结论。
  • 考虑外推Gauss-Seidel迭代法的收敛性及其与H-矩阵的关系,给出了外推Gauss-Seidel迭代法与Jacobi迭代法收敛性的关系及收敛的参数范围. 利用最优尺度矩阵及M-1N的估计量给出了H-矩阵外推Gauss-Seidel法谱半径的上界...
  • Jacobi与Gauss-Seidel迭代法的比较,汪洁,李松,针对在实际中求解系数矩阵为稀疏阵的大型线性方程组比较复杂的缺陷,提出了迭代法是解线性方程组的一个重要的实用方法。利用数学
  • 设矩阵A是奇异M矩阵具有Frobenius标准型,相容线性方程组为Ax = b.给出了修正Gauss - Seidel迭代法(MGS)收敛的一些充分条件,推广了一些最新的结果.
  • 讨论线性方程Ax=b的Gauss-Seidel迭代法的求解问题HadjidimosA等提出了预条件矩阵I+Ca论文给出了线性方程组改进的Gauss-Seidel方法(称之为IMGS方法)对H阵的收敛结果,并给出数值例子。
  • 本文将改进的Gauss-Seidel迭代法应用于一类有很强应用背景的矩阵―H-矩阵及其比较矩阵,在较目前参考文献更一般的分裂条件下,得到相应的收敛结果及谱半径的比较结果,进而比较了其收敛速度的大小。所用方法不同于...
  • MATLAB数学实验——Jacobi迭代法&Gauss-Seidel迭代法 一、迭代算法的数学知识 二、Jacobi迭代法的MATLAB实现 三、Gauss迭代法的MATLAB实现 四、例子

    MATLAB数学实验——Jacobi迭代法&Gauss-Seidel迭代法

    一、迭代算法的数学知识

    线性方程组的数值求解方法,有经典的Jacobi和Gauss-Seidel迭代方法。
    二者通过迭代,从而求解方程。
    基本思路:
    ①将矩阵方程AX=b中的A分解为(U+L+D),即上三角矩阵、下三角矩阵和对角矩阵之和;
    ②将等式化为:Xk+1=BXk+d的格式,从而求得X。

    (1) Jacobi迭代法

    A=U+L+D
    AX=b
    →(U+L+D)X=b
    →DX=-(U+L)X+b
    →DX=-(A-D)X+b
    →X=(E+D-1A)X+D-1b=BJX+dJ

    Xk+1=BJXk+dJ
    BJ=E+D-1A;
    dJ=D-1b;

    (2) Gauss-Seidel迭代法

    A=U+L+D
    AX=b
    →(U+L+D)X=b
    →(L+D)X=-UX+b
    →X=-(L+D)-1UX+(L+D)-1b

    Xk+1=BGXk+dG
    BG=-(L+D)-1U;
    dG=(L+D)-1b;

    二、Jacobi迭代法的MATLAB实现

    调用格式:
    X=Jacobi_2(A,b,X0,Norm,Error,Max,p)
    Norm:范数的名称,Norm=1,2,inf;
    error:近似解的误差;
    Max:迭代的最大次数;
    p:是否需要画图(不输入则不画),p=1,0,不输入

    %用Jacobi迭代法解线性方程组Ax=b
    %Norm:范数的名称,Norm=1,2,inf;
    %error:近似解的误差;
    %Max:迭代的最大次数;
    function X=Jacobi_2(A,b,X0,Norm,Error,Max,p)
    if nargin==6
        p=0;
    end
    a=[];
    x=[];
    [N N]=size(A);
    X=X0;
    [L,D,U]=LUD(A);
    B=eye(N)-inv(D)*A;
    d=inv(D)*b;
    X1=A\b;
    Result=lt_con(B);
    if Result~=1
        error('迭代算法不收敛');
        return
    end
    disp '迭代算法收敛,继续计算...'
    for i=1:Max
        X=B*X+d;
        errX=norm(X-X1,Norm);
        %X0=X;
        a(i)=errX;
        x=i;
        if errX<Error
            diedaicishu=i;
            if p==1
                disp('迭代次数:')
                disp(diedaicishu)
                plot(1:x,a);
            end
            return
        end
    end
    if errX>=Error
        disp('请注意:Jacobi迭代次数已经超过最大迭代次数Max.')
    end
    if p==1
        plot(1:x,a);
    end
    
    end
    

    三、Gauss迭代法的MATLAB实现

    调用格式:
    X=G_S(A,b,X0,Norm,Error,Max,p)
    Norm:范数的名称,Norm=1,2,inf;
    error:近似解的误差;
    Max:迭代的最大次数;
    p:是否需要画图(不输入则不画),p=1,0,不输入

    %用Gauss-Seidel迭代法解线性方程组Ax=b
    %Norm:范数的名称,Norm=1,2,inf;
    %error:近似解的误差;
    %Max:迭代的最大次数;
    function X=G_S(A,b,X0,Norm,Error,Max,p)
    if nargin==6
        p=0;
    end
    a=[];
    x=[];
    [N N]=size(A);
    X=X0;
    [L,D,U]=LUD(A);
    B=-inv(D+L)*U;
    d=inv(D+L)*b;
    X1=A\b;
    Result=lt_con(B);
    if Result~=1
        error('迭代算法不收敛');
        return
    end
    disp '迭代算法收敛,继续计算...'
    % disp '...'
    % pause(0.1)
    % disp '..'
    % pause(0.1)
    % disp '.'
    % pause(1)
    for i=1:Max
        X=B*X+d;
        errX=norm(X-X1,Norm);
        %X0=X;
        a(i)=errX;
        x=i;
        if errX<Error
            diedaicishu=i;
            if p==1
                disp('迭代次数:')
                disp(diedaicishu)
                plot(1:x,a);
            end
            return
        end
    end
    if errX>=Error
        disp('请注意:Gauss-Seidel迭代次数已经超过最大迭代次数Max.')
    end
    if p==1
        plot(1:x,a);
    end
    end
    

    四、例子

    A=[2,-1,1; 3,6,2;3,3,7];
    b=[15,5,8]';
    X0=[0,0,0]';
    Jacobi_2(A,b,X0,inf,1e-3,1000,1);
    hold on
    G_S(A,b,X0,inf,1e-3,1000,1);
    

    例子结果:
    (1)命令行窗口:
    在这里插入图片描述

    (2)绘图窗口(蓝色为Jacobi迭代误差,红色为Gauss-Seidel迭代误差,横轴为迭代次数):
    在这里插入图片描述

    [20200212]更新:补充lt_con()子程序代码:

    %计算迭代的收敛性,作为迭代的子程序
    %
    function Result=lt_con(B)
    syms k;
    l=length(B);
    C=zeros(size(B));
    for i=1:l
        C(i)=limit(B(i)^k,k,inf);
    end
    Crit=C;
    %Crit=limit(B^k,k,inf);
    if Crit==0
        Result=1;
    else
        Result=0;
    end
    end
    

    [20210104]更新:补充LUD()子程序代码:

    function [L U D]=LUD(A)
    [n m]=size(A);
    L=zeros(size(A));
    U=zeros(size(A));
    D=zeros(size(A));
    if n<=0
        error('输入矩阵错误')
        return;
    end
    if n~=m
        error('输入矩阵错误')
        return;
    end
    for i=1:n-1
        L(i+1:end,i)=A(i+1:end,i);
        U(i,i)=A(i,i);
        D(i,i+1:end)=A(i,i+1:end);
    end
    U(n,n)=A(n,n);
    end
    

    确保有以上子程序,迭代法才能顺利运行。

    转载请注明出处

    展开全文
  • Gauss-Seidel迭代法的python实现

    千次阅读 2020-03-23 10:56:56
    Gauss-Seidel迭代法求线性方程组的原理和python代码Gauss-Seidel迭代法求线性方程组的介绍举例讲解算法描述Gauss-Seidel迭代法的python代码 Gauss-Seidel迭代法求线性方程组的介绍 举例讲解 算法描述 Gauss-...

    Gauss-Seidel迭代法求线性方程组的介绍

    在这里插入图片描述

    举例讲解

    在这里插入图片描述
    在这里插入图片描述

    算法描述

    在这里插入图片描述

    Gauss-Seidel迭代法的python代码

    import numpy as np
    
    def G_S(a, b, x, g):   # a为系数矩阵  b增广的一列  x迭代初始值  g计算精度
        x = x.astype(float)  #设置x的精度,让x计算中能显示多位小数
        m, n = a.shape
        times = 0          #迭代次数
        if (m < n):
            print("There is a 解空间。")  # 保证方程个数大于未知数个数
        else:
            while True:
                for i in range(n):
                    s1 = 0
                    tempx = x.copy()    #记录上一次的迭代答案
                    for j in range(n):
                        if i != j:
                            s1 += x[j] * a[i][j]
                    x[i] = (b[i] - s1) / a[i][i]
                    times += 1                  #迭代次数加一
                gap = max(abs(x - tempx))       #与上一次答案模的差
    
                if gap < g:             #精度满足要求,结束
                    break
    
                elif times > 10000:     #如果迭代超过10000次,结束
                    break
                    print("10000次迭代仍不收敛")
    
        print(times)
        print(x)
    
    
    if __name__ == '__main__':      #当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。
        a = np.array([[8, -3, 2], [4, 11, -1], [6, 3, 12]])
        b = np.array([20, 33, 36])
        x = np.array([0, 0, 0])     #迭代初始值
        g = 1e-6                      #精度为0.000001
        G_S(a, b, x, g)
    
    
    展开全文
  • Jacobi迭代法与Gauss-Seidel迭代法

    万次阅读 多人点赞 2016-01-25 19:29:58
    今天刚好有朋友和我讨论泊松图像融合算法,我说我过去文章里给出的是最原始、最直观...但是过去我浅尝辄止了,也没深究,今天刚好再提到,小看了一下,似乎涉及高斯-塞德尔迭代法。这是一种常用的基于迭代的数值方法。

    之前我在博客里介绍过牛顿-拉弗逊迭代法,对数据挖掘技术熟悉的同学应该还知道有梯度下降法(其实也是一种迭代算法)。今天刚好有朋友和我讨论泊松图像融合算法,我说我过去文章里给出的是最原始、最直观的实现算法。对于理解泊松融合的原理比较有帮助,但是效率可能并不理想。印象中,泊松融合是有一个以矩阵为基础的快速算法的。但是过去我浅尝辄止了,也没深究,今天刚好再提到,小看了一下,似乎涉及高斯-塞德尔迭代法。好吧,博主君暂且把知道的这部分内容做个介绍吧。


    一、雅各比迭代法


    考虑如下方程组:
    4xy+z=74x8y+z=212x+y+5z=15 4x-y+z=7\\4x-8y+z=-21\\-2x+y+5z=15
    上述方程可表示成如下形式:
    x=7+yz4y=21+4x+z8z=15+2xy5 x=\frac{7+y-z}{4} \\y=\frac{21+4x+z}{8}\\z=\frac{15+2x-y}{5}
    这样就提出了下列雅可比迭代过程:

    xk+1=7+ykzk4yk+1=21+4xk+zk8(3)zk+1=15+2xkyk5 \begin{aligned} x_{k+1} & =\frac{7+y_k-z_k}{4} \\ y_{k+1} & =\frac{21+4x_k+z_k}{8} & (3) \\ z_{k+1} & =\frac{15+2x_k-y_k}{5} \end{aligned}

    如果从P0=(x0,y0,z0)=(1,2,2)P_0=(x_0,y_0,z_0)=(1,2,2)开始,则上式中的迭代将收敛到解(2,4,3)(2,4,3)

    x0=1,y0=2x_0=1,y_0=2z0=2z_0=2代入上式中每个方程的右边,即可得到如下新值:
    x1=7+224=1.75y1=21+4+28=3.375z1=15+225=3.00 x_1=\frac{7+2-2}{4}=1.75\\y_1=\frac{21+4+2}{8}=3.375\\z_1=\frac{15+2-2}{5}=3.00

    新的点P1=(1.75,3.375,3.00)P_1=(1.75,3.375,3.00)P1P_1更接近(2,4,3)(2,4,3)。使用迭代过程(3)生成点的序列{P0P_0}将收敛到解(2,4,3)(2,4,3)

    这里写图片描述

    这个过程称为雅可比迭代,可用来求解某些类型的线性方程组。从上表中可以看出,经过19步选代,选代过程收敛到一个精度为9 位有效数字的近似值(2.00000000, 4.00000000, 3.00000000)。但有时雅可比迭代法是无效的。通过下面的例子可以看出,重新排列初始线性方程组后,应用雅可比迭代法可能会产生一个发散的点的序列。

    设重新排列的线性方程组如下:
    2x+y+5z=154x8y+z=214xy+z=7 -2x+y+5z=15\\4x-8y+z=-21\\4x-y+z=7

    这些方程可以表示为如下形式:
    x=15+y5z2y=21+4x+z8z=74x+y5 x=\frac{-15+y-5z}{2} \\y=\frac{21+4x+z}{8}\\z=\frac{7-4x+y}{5}

    这可以用如下雅可比迭代过程求解:
    \begin{aligned}
    x_{k+1} & =\frac{-15+y_k+5z_k}{2} \
    y_{k+1} & =\frac{21+4x_k+z_k}{8} \
    z_{k+1} & =7-4x_k+y_k
    \end{aligned}

    如果从P0=(x0,y0,z0)=(1,2,2)P_0=(x_0,y_0,z_0)=(1,2,2)开始,则上式中的迭代将对解(2,4,3)(2,4,3)发散。将x0=1x_0=1y0=2y_0=2z0=2z_0=2带入上式中每个方程的右边,即可得到新值x1x_1y1y_1z1z_1

    x1=15+2+102=1.5y1=21+4+28=3.375z1=74+2=5.00 x_1=\frac{-15+2+10}{2}=-1.5\\y_1=\frac{21+4+2}{8}=3.375\\z_1=7-4+2=5.00

    新的点P1=(1.5,3.375,5.00)P_1=(-1.5,3.375,5.00)P0P_0更远地偏离(2,4,3)(2,4,3)。使用上述迭代过程生成点的序列是发散的。

    这里写图片描述


    二、高斯-塞德尔迭代法


    有时候通过其他方面可以加快迭代的收敛速度。观察由雅可比迭代过程(3)产生的三个序列{xkx_k},{yky_k}和{zkz_k},它们分别收敛到2,4和3。由于xk+1x_k+1被认为是比xkx_k更好的xx之近似值,所以在计算yk+1y_k+1时用xk+1x_k+1来替换xkx_k是合理的。同理,可用xk+1x_k+1yk+1y_k+1计算zk+1z_k+1。下面的例子演示了对上述例子中给出的方程组使用上述方法的情况。

    设给定上述线性方程组并利用高斯-塞德尔(Gauss-Seidel)迭代过程求解:

    xk+1=7+ykzk4yk+1=21+4xk+1+zk8zk+1=15+2xk+1yk+15x_{k+1}=\frac{7+y_k-z_k}{4}\\ y_{k+1}=\frac{21+4x_{k+1}+z_k}{8}\\ z_{k+1}=\frac{15+2x_{k+1}-y_{k+1}}{5}

    如果从P0=(x0,y0,z0)=(1,2,2)P_0=(x_0,y_0,z_0)=(1,2,2)开始,用上式中的迭代可收敛到解(2,4,3)(2,4,3)
    y0=2y_0=2z0=2z_0=2代入上式第一个方程可得

    x1=7+224=1.75x_1=\frac{7+2-2}{4}=1.75

    x1=1.75x_1=1.75z0=2z_0=2代入第二个方程可得

    y1=21+4×1.75+28=3.75y_1=\frac{21+4\times1.75+2}{8}=3.75

    x1=1.75x_1=1.75y1=3.75y_1=3.75代入第三个方程可得

    z1=15+2×1.753.755=2.95z_1=\frac{15+2\times1.75-3.75}{5}=2.95

    新的点P1=(1.75,3.75,2.95)P_1=(1.75,3.75,2.95)P0P_0更接近解(2,4,3)(2,4,3),而且比之前例子中的值更好。用迭
    代(7)生成序列{PkP_k收敛到(2,4,3)(2,4,3)

    这里写图片描述

    正如前面讨论的,应用雅各比迭代法计算有时可能是发散的。所以有必要建立一些判定条件来判断雅可比迭代是否收敛。在给出这个条件之前,先来看看严格对角占优矩阵的定义。
    设有NN×\timesNN维矩阵AA,如果

    这里写图片描述
    其中,ii是行号,jj是列号,则称该矩阵是严格对角占优矩阵。显然,严格对角占优的意思就是指对角线上元素的绝对值不小于所在行其他元素的绝对值和。

    \begin{aligned}
    a_{11}x_1+a_{12}x_2+…+a_{1j}x_j+…+a_{1N}x_N& =b_1 \
    a_{21}x_1+a_{22}x_2+…+a_{2j}x_j+…+a_{2N}x_N& =b_2 \
    … … \
    a_{j1}x_1+a_{j2}x_2+…+a_{jj}x_j+…+a_{jN}x_N& =b_j \
    … … \
    a_{N1}x_1+a_{N2}x_2+…+a_{Nj}x_j+…+a_{NN}x_N& =b_N
    \end{aligned}

    设第k点为Pk=(x1(k),x2(k),...,xj(k),...,xN(k),)P_k=(x_1^{(k)},x_2^{(k)},...,x_j^{(k)},...,x_N^{(k)},),则下一点为Pk+1=(x1(k+1),x2(k+1),...,xj(k+1),...,xN(k+1),)P_{k+1}=(x_1^{(k+1)},x_2^{(k+1)},...,x_j^{(k+1)},...,x_N^{(k+1)},)。向量PkP_k的上标(k)(k)可用来标识属于这一点的坐标。迭代公式根据前面的值(x1(k),x2(k),...,xj(k),...,xN(k),)(x_1^{(k)},x_2^{(k)},...,x_j^{(k)},...,x_N^{(k)},),使用上述线性方程组中第jj行求解xj(k+1)x_j^{(k+1)}

    雅可比迭代:

    xj(k+1)=bjaj1x1(k)...ajj1xj1(k)ajj+1xj+1(k)...ajNxN(k)ajjx_j^{(k+1)}=\frac{b_j-a_{j1}x_1^{(k)}-...-a_{jj-1}x_{j-1}^{(k)}-a_{jj+1}x_{j+1}^{(k)}-...-a_{jN}x_N^{(k)}}{a_{jj}}

    其中j=1,2,...,Nj=1,2,...,N
    雅可比迭代使用所有旧坐标来生成所有新坐标,而高斯-塞德尔迭代尽可能使用新坐标得到更新的坐标。

    高斯-塞德尔迭代:

    xj(k+1)=bjaj1x1(k+1)...ajj1xj1(k+1)ajj+1xj+1(k)...ajNxN(k)ajjx_j^{(k+1)}=\frac{b_j-a_{j1}x_1^{(k+1)}-...-a_{jj-1}x_{j-1}^{(k+1)}-a_{jj+1}x_{j+1}^{(k)}-...-a_{jN}x_N^{(k)}}{a_{jj}}

    其中j=1,2,...,Nj=1,2,...,N

    下面的定理给出了雅可比迭代收敛的充分条件。
    (雅可比选代) 设矩阵AA具有严格对角优势,则AX=BAX=B有惟一解X=PX = P。利用前面给出的迭代式可产生一个向量序列{PkP_k},而且对于任意初始向量P0P_0,向量序列都将收敛到PP

    当矩阵AA具有严格对角优势时,可证明高斯-塞德尔迭代法也会收敛。在大多数情况下,高斯-塞德尔迭代法比雅可比迭代法收敛得更快,因此通常会利用高斯-塞德尔迭代法。但在某些情况下,雅可比迭代会收敛,而高斯-塞德尔迭代不会收敛。

    特别说明:以上内容主要取材自《数值方法(MATLAB版)(第四版)》马修斯等著,电子工业出版社2010年出版发行。

    展开全文
  • 本文主要介绍了数理统计中解线性方程组的Jacobi迭代法和Gauss-Seidel迭代法,并且基于python对两种算法进行了实现

    之前的文章介绍过Gauss消元法、Doolittle和Crout分解等解线性方程组的直接方法。但是直接法不是在任何时候都可用的,它有以下缺点:

    • 在有舍入误差的情况下,直接法只能得到方程的近似解。
    • 如果待求解问题规模很大,直接法求解的计算量是很大的,更糟的是随着计算量的增大舍入误差积累也会越多,从而得到的解误差更大。所以直接法适合小规模稠密型方程组的求解。
    • 另外,直接法的程序设计也比较复杂。

    迭代法解线性方程组

    对于方程组 Ax=bAx=b 一般可以将其写成如下形式
    x=Mx+g x=Mx+g 建立上述方程组的迭代公式:
    x(k+1)=Mx(k)+g,k=0,1,2, x^{(k+1)}=Mx^{(k)}+g,k=0,1,2,\dots 这个迭代公式有什么用呢?

    当向量序列 x(k)x^{(k)} 收敛于 xx^* 时,有
    x=Mx+g x^*=Mx^*+g 可以发现 xx^* 即为方程组 x=Mx+gx=Mx+g 的解,也就是说,当 x(k)x^{(k)} 收敛时,x(k)x^{(k)} 即为方程组的解。

    以上就是迭代法解方程组的基本原理,只要x(k)x^{(k)}收敛,就可以通过k步迭代得到方程组的近似解。

    下面介绍两种经典的迭代法:Jacobi迭代法和Gauss-Seidel迭代法。


    Jacobi迭代法

    假设有下列线性方程组
    {a11x1+a12x2+a13x3=b1a21x1+a22x2+a23x3=b2a31x1+a32x2+a33x3=b3 \left\{\begin{array}{l}a_{11}x_1+a_{12}x_2+a_{13}x_3=b_1\\a_{21}x_1+a_{22}x_2+a_{23}x_3=b_2\\a_{31}x_1+a_{32}x_2+a_{33}x_3=b_3\end{array}\right.
    将其写成下面形式
    {x1=1a11(b1a12x2a13x3)x2=1a22(b2a21x1a23x3)x3=1a33(b3a31x1a32x2) \left\{\begin{array}{l}x_1=\frac1{a_{11}}(b_1-a_{12}x_2-a_{13}x_3)\\x_2=\frac1{a_{22}}(b_2-a_{21}x_1-a_{23}x_3)\\x_3=\frac1{a_{33}}(b_3-a_{31}x_1-a_{32}x_2)\end{array}\right.
    建立迭代公式
    {x1(k+1)=1a11(b1a12x2(k)a13x3(k))x2(k+1)=1a22(b2a21x1(k)a23x3(k))x3(k+1)=1a33(b3a31x1(k)a32x2(k)) \left\{\begin{array}{l}x_1^{(k+1)}=\frac1{a_{11}}(b_1-a_{12}x_2^{(k)}-a_{13}x_3^{(k)})\\x_2^{(k+1)}=\frac1{a_{22}}(b_2-a_{21}x_1^{(k)}-a_{23}x_3^{(k)})\\x_3^{(k+1)}=\frac1{a_{33}}(b_3-a_{31}x_1^{(k)}-a_{32}x_2^{(k)})\end{array}\right.
    对于每一个 xi(k+1)x_i^{(k+1)} ,有如下公式
    xi(k+1)=1aii(bij=1i1aijxj(k)j=i+1naijxj(k))i=1,2,,n,k=0,1, x_i^{(k+1)}=\frac1{a_{ii}}(b_i-\sum_{j=1}^{i-1}a_{ij}x_j^{(k)}-\sum_{j=i+1}^na_{ij}x_j^{(k)})\\i=1,2,\cdots,n,k=0,1,\cdots 然后我们就可根据这个公式解线性方程组了。

    但是为了便于理论分析,我们把它写成矩阵的形式。
    假设方程组为 Ax=bAx=b,将 AA 分裂为
    A=DLU A = D - L - U 其中 DD 为对角矩阵 diag(a11,a22,,ann)diag(a_{11},a_{22},\dots,a_{nn})L-LU-U 分别如下
    L=(0a210a31a320an1an2ann10)  U=(0a12a13a1n0a23a2nan1n0) -L=\begin{pmatrix}0&&&&\\a_{21}&0&&&\\a_{31}&a_{32}&0&&\\\vdots&\vdots&\ddots&\ddots&\\a_{n1}&a_{n2}&\dots&a_{nn-1}&0\end{pmatrix}\\ \;\\ -U=\begin{pmatrix}0&a_{12}&a_{13}&\dots&a_{1n}\\&0&a_{23}&\dots&a_{2n}\\&&\ddots&\ddots&\vdots\\&&&\ddots&a_{n-1n}\\&&&&0\end{pmatrix} 则方程组和迭代公式可写为
    (DLU)x=b  x=D1(L+U)x+D1b  x(k+1)=D1(L+U)x(k)+D1b()  k=0,1, (D - L - U)x=b\\ \;\\ x = D^{-1}(L+U)x + D^{-1}b\\ \;\\ x^{(k+1)} = D^{-1}(L+U)x^{(k)} + D^{-1}b(迭代公式)\\ \;\\ k=0,1,\cdots
    可以验证矩阵形式的迭代公式和上面大括号方程组表示的迭代公式一致的。


    下面根据公式 x(k+1)=D1(L+U)x(k)+D1bx^{(k+1)} = D^{-1}(L+U)x^{(k)} + D^{-1}b 编写代码

    算法代码

    def Jfunction(A,b,k):
        n = A.shape[1]
        D = np.eye(n)
        D[np.arange(n),np.arange(n)] = A[np.arange(n),np.arange(n)]
        LU = D - A
        X = np.zeros(n)
        for i in range(k):
            D_inv = np.linalg.inv(D)
            X =  np.dot(np.dot(D_inv,LU),X) + np.dot(D_inv,b)
        return X
    

    实验
    解下列方程组
    在这里插入图片描述
    方程组的精确解为 x=(1,1,1)x = (1,1,1)

    A = np.array([
        [10,3,1],
        [2,-10,3],
        [1,3,10]
    ])
    b = np.array([14,-5,14])
    k = 6
    X = Jfunction(A,b,k);
    

    实验结果
    在这里插入图片描述


    Gauss-Seidel迭代法

    在J迭代法中在计算 xi(k+1)x_i^{(k+1)}时,前 i1i-1 个分量已经计算完成了,如果可以利用这些信息,可能加速迭代法的收敛。因此我们对迭代公式做如下修改
    {x1(k+1)=1a11(b1a12x2(k)a13x3(k))x2(k+1)=1a22(b2a21x1(k+1)a23x3(k))x3(k+1)=1a33(b3a31x1(k+1)a32x2(k+1)) \left\{\begin{array}{l}x_1^{(k+1)}=\frac1{a_{11}}(b_1-a_{12}x_2^{(k)}-a_{13}x_3^{(k)})\\x_2^{(k+1)}=\frac1{a_{22}}(b_2-a_{21}x_1^{(k+1)}-a_{23}x_3^{(k)})\\x_3^{(k+1)}=\frac1{a_{33}}(b_3-a_{31}x_1^{(k+1)}-a_{32}x_2^{(k+1)})\end{array}\right. 这就是Gauss-Seidel迭代法的迭代公式
    对于每一个 xi(k+1)x_i^{(k+1)} ,有如下公式
    xi(k+1)=1aii(bij=1i1aijxj(k+1)j=i+1naijxj(k))i=1,2,,n,k=0,1, x_i^{(k+1)}=\frac1{a_{ii}}(b_i-\sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)}-\sum_{j=i+1}^na_{ij}x_j^{(k)})\\i=1,2,\cdots,n,k=0,1,\cdots 上述公式也可以写成矩阵形式,我们可以从J迭代法的矩阵形式推出G-S迭代法的矩阵形式

    按照J迭代法的迭代公式有
    x(k+1)=D1(L+U)x(k)+D1b  Dx(k+1)=Lx(k)+Ux(k)+b x^{(k+1)} = D^{-1}(L+U)x^{(k)} + D^{-1}b\\ \;\\ Dx^{(k+1)} =Lx^{(k)}+Ux^{(k)}+b 不难发现 Lx(k)Lx^{(k)} 对应了G-S迭代公式中的 j=1i1aijxj(k+1)\sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)} 部分,因此按照G-S迭代法的迭代公式,上面迭代公式应该写成
    Dx(k+1)=Lx(k+1)+Ux(k)+b Dx^{(k+1)} =Lx^{(k+1)}+Ux^{(k)}+b 整理,得
    x(k+1)=(DL)1Ux(k)+(DL)1b x^{(k+1)} =(D-L)^{-1}Ux^{(k)}+(D-L)^{-1}b


    下面根据公式 x(k+1)=(DL)1Ux(k)+(DL)1bx^{(k+1)} =(D-L)^{-1}Ux^{(k)}+(D-L)^{-1}b 编写代码

    算法代码

    def G_Sfunction(A,b,k):
        n = A.shape[1]
        D = np.eye(n)
        D[np.arange(n),np.arange(n)] = A[np.arange(n),np.arange(n)]
        LU = D - A
        L = np.tril(LU)
        U = np.triu(LU)
        D_L = D - L
        X = np.zeros(n)
        for i in range(k):
            D_L_inv = np.linalg.inv(D_L)
            X =  np.dot(np.dot(D_L_inv,U),X) + np.dot(D_L_inv,b)
        return X
    

    实验
    解下列方程组(一样的例题)
    在这里插入图片描述
    方程组的精确解为 x=(1,1,1)x = (1,1,1)

    A = np.array([
        [10,3,1],
        [2,-10,3],
        [1,3,10]
    ])
    b = np.array([14,-5,14])
    k = 6
    X = G_Sfunction(A,b,k);
    

    实验结果
    在这里插入图片描述
    可以发现G-S迭代法在第4次迭代完成的时候就已经达到了J迭代法第六次迭代完成的效果了。


    迭代法的特点

    • 只能求的近似解
    • 可以在迭代的过程中对误差进行矫正
    • 如果系数矩阵是稀疏的,即使面对大规模的问题,也可能通过较小的计算量得到方程组的解
    • 原理简单方便实现
    展开全文
  • 《矩阵与数值分析》上机作业,采用Jacobi迭代法和Gauss-Seidel迭代法求解线性方程组的根。采用C语言编程,程序简单实用,有运行结果,修改方程组系数即可求解不同维数线性方程组的根。
  • 本C++程序是利用Gauss-Seidel迭代法解N维线性方程组的很好的程序,源代码的编译环境是VC++6.0,绝对可以用。
  • Jacobi Gauss-Seidel迭代法

    千次阅读 2017-01-14 10:27:45
    考虑线性方程组Ax = b时,一般当A为低阶稠密矩阵时,用主元消去法解此方程组是有效方法。但是,对于由工程技术中产生的大型稀疏矩阵方程组(A的阶数很高,但...Jacobi、Gauss-Seidel迭代法就是解决其中问题的两种方法。
  • ``Gauss-Seidel迭代法-例3.8 clc;clear;format long A=[5,-1,-1,-1;-1,10,-1,-1;-1,-1,5,-1;-1,-1,-1,10]; b=[-4;12;8;34]; x=[1,2,3,4]’; D = diag(diag(A)); B = -(D+tril(A,-1))\triu(A,1); f= (D+tril(A,-1))\b...
  • 给出了当‖B‖F=√ nΣ I=1 b2/1 ≥1,b2=nΣj=1|bij|=1,n时,Gauss-Seiel迭代法收敛的充分条件,并给出了敛速估计。
  • (I+Cα)预条件Gauss-Seidel迭代法的收敛结果

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 698
精华内容 279
关键字:

gauss-seidel迭代法