精华内容
下载资源
问答
  • MATLAB实现雅可比与高斯塞德尔迭代

    千次阅读 2020-10-15 23:18:44
    概述 用MATLAB编程实现,形成m函数文件。...%高斯塞德尔迭代法 G=-(diag(diag(A))+tril(A,-1))\triu(A,1); R=max(abs(eig(G))); if(R>=1) disp('Gauss-Seidel is not work'); else disp('Gauss-Sei

    概述

    用MATLAB编程实现,形成m函数文件。输入A,b矩阵,无返回值,解得x向量直接显示在命令行窗口,同时绘制出x向量的收敛曲线。
    A = [ 2 − 1 1 1 1 1 1 1 − 2 ] b = [ 1 1 1 ] A=\begin{bmatrix} 2&-1&1\\1&1&1\\1&1&-2\end{bmatrix} b=\begin{bmatrix} 1\\1\\1\end{bmatrix} A=211111112b=111

    高斯塞德尔方法

    代码

    function [] = gaussseidel(A,b)
    %高斯塞德尔迭代法
    G=-(diag(diag(A))+tril(A,-1))\triu(A,1);
    R=max(abs(eig(G)));
    if(R>=1)
         disp('Gauss-Seidel is not work');
    else
         disp('Gauss-Seidel is going well');
         disp('x vector:')
         d1=(diag(diag(A))+tril(A,-1))\b;
         x=zeros(size(b));
         for k=1:100
            x(:,k+1)=G*x(:,k)+d1;
            if(max(abs(x(:,k+1)-x(:,k)))<10^-4)
                break;
            end
         end
         disp(x(:,k+1));
         e=1:k+1;
         plot(e,x,'- o');
         xlabel('generations');
         ylabel('vector_x');
    end
    end
    

    结果

    A=[2 -1 1;1 1 1;1 1 -2];b=[1;1;1];
    gaussseidel(A,b);
    Gauss-Seidel is going well
    x vector:
    0.6667
    0.3333
    0
    在这里插入图片描述

    可见,高斯塞德尔方法收敛且成功求出结果。

    雅可比方法

    代码

    function [] = jacobi(A,b)
    %雅可比迭代法
    B=-(diag(diag(A)))\(tril(A,-1)+triu(A,1));
    R=max(abs(eig(B)));
    if(R>=1)
         disp('Jacobi is not work');
    else
         disp('Jacobi is going well');
         disp('x vector:')
         d1=diag(diag(A))\b;
         x=zeros(size(b));
         for k=1:100
            x(:,k+1)=B*x(:,k)+d1;
            if(max(abs(x(:,k+1)-x(:,k)))<10^-4)
                break;
            end
         end
         disp(x(:,k+1));
         e=1:k+1;
         plot(e,x,'- o');
         xlabel('generations');
         ylabel('vector_x');
    end
    end
    

    结果

    A=[2 -1 1;1 1 1;1 1 -2];b=[1;1;1];
    jacobi(A,b)
    Jacobi is not work
    可见,雅可比方法不收敛。

    代码思路

    首先判断收敛性

    判断迭代矩阵的谱半径的上界是否小于1。
    若大于1则结束程序。

    迭代求解

    高斯塞德尔迭代矩阵

    G = − D − 1 ( L + U ) G=-D^{-1}(L+U) G=D1(L+U)
    x ( k + 1 ) = G x ( k ) + d 1 x^{(k+1)}=Gx^{(k)}+d_{1} x(k+1)=Gx(k)+d1

    雅可比迭代矩阵

    B = − ( D + L ) − 1 U B=-(D+L)^{-1}U B=(D+L)1U
    x ( k + 1 ) = B x ( k ) + d 1 x^{(k+1)}=Bx^{(k)}+d_ {1} x(k+1)=Bx(k)+d1
    每次迭代后判断
    ∣ x k + 1 − x k ∣ < 1 0 − 4 |x^{k+1}-x^k|<10^{-4} xk+1xk<104
    结果为“真”跳出迭代循环,输出迭代末尾x向量。并绘出收敛曲线。

    展开全文
  • 高斯塞德尔迭代法matlab代码的MATLAB 它是一个Matlab代码,它借助于高斯-德尔方法(它是一个迭代过程,并且随着n的增加而收敛到实际值)来找到具有n个变量的线性方程组的解。 在迭代过程中,应用GS方法之前的首要...
  • 分别用雅可比 迭代法与高斯塞德尔迭代法解下列方程组: 雅可比迭代法: #include&lt;stdio.h&gt; #include&lt;math.h&gt; #define eps 1e-6 #define max 100 //雅可比迭代法 void jacobi...

    分别用雅可比 迭代法与高斯塞德尔迭代法解下列方程组:
    这里写图片描述
    雅可比迭代法:

    #include<stdio.h>
    #include<math.h>
    #define eps 1e-6
    #define max 100
    //雅可比迭代法
    void jacobi(float *a,int n,float x[])
    {
        int i,j,k=0;
        float epsilon,s;
        float *y=new float[n];
        for(i=0;i<n;i++)x[i]=0;
        while(1)
        {
            epsilon=0;
            k++;
            for(i=0;i<n;i++)
            {
                s=0;
                for(j=0;j<n;j++)
                {
                    if(j==i)continue;
                    s+=*(a+i*(n+1)+j)*x[j];
                }
                y[i]=(*(a+i*(n+1)+n)-s)/(*(a+i*(n+1)+i));
                epsilon+=fabs(y[i]-x[i]);
            }
            for(i=0;i<n;i++)x[i]=y[i];
            if(epsilon<eps)
            {
                printf("%d\n",k);return;}
            if(k>=max)
            {printf("fasan");return;}
        }
        delete y;
    }
    
    void main()
    {
        int i;
        float a[4][5]={10,-1,2,0,-11,
                       0,8,-1,3,-11,
                       2,-1,10,0,6,
                       -1,3,-1,11,25};
        float x[4];
        jacobi(a[0],4,x);
        for(i=0;i<4;i++)printf("x[%d]=%f\n",i+1,x[i]);
    
        float b[9][10]={31,-13,0,0,0,-10,0,0,0,-15,
                       -13,35,-9,0,-11,0,0,0,0,27,
                       0,-9,31,-10,0,0,0,0,0,-23,
                       0,0,-10,79,-30,0,0,0,-9,0,
                       0,0,0,-30,57,-7,0,-5,0,-20,
                       0,0,0,0,7,47,-30,0,0,12,
                       0,0,0,0,0,-30,41,0,0,-7,
                       0,0,0,0,-5,0,0,27,-2,7,
                       0,0,0,0,0,0,0,-2,29,-10};
        float xx[9];
        jacobi(b[0],9,xx);
        for(i=0;i<9;i++)printf("xx[%d]=%f\n",i+1,xx[i]);
    }
    

    高斯赛德尔迭代法:

    #include<stdio.h>
    #include<math.h>
    #define N 500
    //高斯塞德尔
    void gauss(float *a,int n,float x[])
    {
        int i,j,k=1;
        float d,dx,eps;
        for(i=0;i<=n-1;i++)x[i]=0.0;
        while(1)
        {
            eps=0;
            for(i=0;i<=n-1;i++)
            {
                d=0;
                for(j=0;j<=n-1;j++)
                {
                    if(j==i)continue;
                    d+=*(a+i*(n+1)+j)*x[j];
                }
                dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));
                eps+=fabs(dx-x[i]);
                x[i]=dx;
            }
            if(eps<1e-6)
            {printf("%d\n",k);return;}
            if(k>N)
            {
                printf("fasan\n");
                return;
            }
            k++;
        }
    }
    
    void main()
    {
        int i;
        float a[4][5]={10,-1,2,0,-11,
                       0,8,-1,3,-11,
                       2,-1,10,0,6,
                       -1,3,-1,11,25};
        float x[4];
        float b[9][10]={31,-13,0,0,0,-10,0,0,0,-15,
                       -13,35,-9,0,-11,0,0,0,0,27,
                       0,-9,31,-10,0,0,0,0,0,-23,
                       0,0,-10,79,-30,0,0,0,-9,0,
                       0,0,0,-30,57,-7,0,-5,0,-20,
                       0,0,0,0,7,47,-30,0,0,12,
                       0,0,0,0,0,-30,41,0,0,-7,
                       0,0,0,0,-5,0,0,27,-2,7,
                       0,0,0,0,0,0,0,-2,29,-10};
        float xx[9];
        gauss(a[0],4,x);
        for(i=0;i<4;i++)printf("x[%d]=%f\n",i+1,x[i]);
    
        gauss(b[0],9,xx);
        for(i=0;i<9;i++)printf("xx[%d]=%f\n",i+1,xx[i]);
    }
    
    展开全文
  • 高斯塞德尔迭代法matlab代码Monge-安培方程的数值方法 这项工作研究了解决Monge-Ampere方程的多重网格方法。 我们利用方程的单调性以另一种方式将其写出,然后使用完全逼近方案对其进行数值求解。 抽象的: Monge-...
  • 任务概述分别用雅可比迭代算法和高斯塞德尔算法求解给定的线性方程组Ax⃗ =b⃗ A\vec{x}=\vec{b} 函数接口定义:int Jacobi( int n, double a[][MAX_SIZE], double b[], double x[], double TOL, int MAXN );int ...

    任务概述

    分别用雅可比迭代算法和高斯塞德尔算法求解给定的线性方程组 Ax⃗ =b⃗ 
    函数接口定义:

    int Jacobi( int n, double a[][MAX_SIZE], double b[], double x[], double TOL, int MAXN );
    
    int Gauss_Seidel( int n, double a[][MAX_SIZE], double b[], double x[], double TOL, int MAXN );

    裁判程序样例

    #include <stdio.h>
    #include <math.h>
    
    #define MAX_SIZE 10
    #define bound pow(2, 127)
    #define ZERO 1e-9 /* X is considered to be 0 if |X|<ZERO */
    
    int Jacobi( int n, double a[][MAX_SIZE], double b[], double x[], double TOL, int MAXN );
    
    int Gauss_Seidel( int n, double a[][MAX_SIZE], double b[], double x[], double TOL, int MAXN );
    
    int main()
    {
        int n, MAXN, i, j, k;
        double a[MAX_SIZE][MAX_SIZE], b[MAX_SIZE], x[MAX_SIZE];
        double TOL;
    
        scanf("%d", &n);
        for (i=0; i<n; i++) {
            for (j=0; j<n; j++)
                scanf("%lf", &a[i][j]);
            scanf("%lf", &b[i]);
        }
        scanf("%lf %d", &TOL, &MAXN);
    
        printf("Result of Jacobi method:\n");
        for ( i=0; i<n; i++ )
            x[i] = 0.0;
        k = Jacobi( n, a, b, x, TOL, MAXN );
        switch ( k ) {
            case -2:
                printf("No convergence.\n");
                break;
            case -1: 
                printf("Matrix has a zero column.  No unique solution exists.\n");
                break;
            case 0:
                printf("Maximum number of iterations exceeded.\n");
                break;
            default:
                printf("no_iteration = %d\n", k);
                for ( j=0; j<n; j++ )
                    printf("%.8f\n", x[j]);
                break;
        }
        printf("Result of Gauss-Seidel method:\n");
        for ( i=0; i<n; i++ )
            x[i] = 0.0;
        k = Gauss_Seidel( n, a, b, x, TOL, MAXN );
        switch ( k ) {
            case -2:
                printf("No convergence.\n");
                break;
            case -1: 
                printf("Matrix has a zero column.  No unique solution exists.\n");
                break;
            case 0:
                printf("Maximum number of iterations exceeded.\n");
                break;
            default:
                printf("no_iteration = %d\n", k);
                for ( j=0; j<n; j++ )
                    printf("%.8f\n", x[j]);
                break;
        }
    
        return 0;
    }
    
    /* Your function will be put here */

    输入样例

    3
    2   -1  1   -1
    2   2   2   4
    -1  -1  2   -5
    0.000000001 1000

    输出样例

    Result of Jacobi method:
    No convergence.
    Result of Gauss-Seidel method:
    no_iteration = 37
    1.00000000
    2.00000000
    -1.00000000

    算法思路

    实现细节

    心得体会

    展开全文
  • 雅可比迭代法和高斯-塞德尔迭代法 雅可比迭代法和高斯-塞德尔迭代
  • https://wenku.baidu.com/view/ac6a0d89d0d233d4b04e6905.html 另外附上迭代收敛的条件: 且越小,收敛的越快。

    https://wenku.baidu.com/view/ac6a0d89d0d233d4b04e6905.html
    另外附上迭代收敛的条件:
    在这里插入图片描述
    且越小,收敛的越快。
    在这里插入图片描述

    展开全文
  • 计算线性方程组Ax=b,利用A=D-L-U,将线性方程组改写为x=Bx+f,用迭代的方法进行计算 以6阶希尔伯特矩阵为例,如果需计算其他矩阵,改一下A,要计算其他阶数,改一下n的值就好 clc clear format rat%也可以用format ...
  • ○1高斯-赛德尔迭代法比雅克比的迭代次数少一半多,说明高斯-赛德尔迭代法优于雅克比迭代法,收敛速度更快,效率更高。但也不绝对,有时也会出现雅克比迭代法收敛而高斯-赛德尔迭代法不收敛的情况。 ○2SOR法的迭代...
  • //高斯塞德尔迭代法 bool LinearEqu::GS() { int n = this->getSize(); int i,j,k; vector<double> x1(n); vector<double> x2(n); vector<double> b(n); vector<vector <double> > a(n ,vector(n)); double ...
  • 高斯-塞德尔迭代法也是求解线性方程组解的一种方法,与雅可比不同之处在于,求解某个未知数的某代值时,直接使用上一未知数在该代的值。 C++代码如下: #include&lt;stdio.h&gt; #include&lt;math.h&...
  • %e为精度,N为最大迭代次数 n=length(b); N=100; e=1e-4; x0=zeros(n,1); x=x0; x0=x+2*e; k=0; A1=tril(A); A2=inv(A1); while norm(x0-x,inf)>e&&k<N k=k+1; x0=x; x=-A2*(A-A1)*x0+A2*b; ...
  • 今天小编就为大家分享一篇python实现高斯(Gauss)迭代法的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • %e为精度,N为最大迭代次数 n=length(b); N=100; e=1e-4; x0=zeros(n,1); x=x0; x0=x+2*e; k=0; A1=tril(A); A2=inv(A1); while norm(x0-x,inf)>e&&k<N k=k+1; x0=x; x=-A2*(A-A1)*x0+A2*b; ...
  • MATLAB实现高斯赛德尔迭代法MATLAB实现高斯赛德尔迭代
  • 程序用红黑高斯-塞德尔迭代法及有限差分实现偏微分方程: −(delta)u + k^2*u = f 设定有限差分hx,hy,误差大小,迭代次数,即可计算各个节点的数值。 如需计算其他偏微分方程,只需改动迭代部分的表达式即可。 程序...
  • "请输入最大迭代次数:" ) ) print ( "请输入初始向量:" ) # 初始向量 x0 = np . empty ( [ m , 1 ] ) for i in range ( m ) : x0 [ i ] = np . array ( list ( map ( float , input ( ) . ...
  • 判断迭代方法收敛性时计算高斯塞德尔迭代矩阵谱半径以判断。 代码与运行结果 function [] = sor(A,b,w) %基于高斯塞德尔的超松弛迭代求解向量 G=-(tril(A))\triu(A,1); R=max(abs(eig(G))); if(R>=
  • 高斯赛德尔迭代

    2018-04-08 19:48:18
    高斯赛德尔迭代
  • //N迭代次数,n指是x的下标 double e = 0 ; double [][] X = new double [ 30 ][ 30 ]; double b[] = new double [ 30 ]; double a[][] = new double [ 30 ][ 30 ]; Scanner in = new ...
  • 高斯-赛德尔算法.doc

    2020-10-07 10:48:24
    班级09医软1班 指导教师金力 工作组成员谢清泉负责程序主体部分的编写 魏月圆负责流程图和实验报告的书写 项波波负责程序的调试和修改 王兆德负责材料的收集和整理 一 实验名称 高斯塞德尔迭代法 二 实验目的 理解...
  • 题目一: 1.假设理想状态下的弹道轨迹满足抛物线方程y=a+bx+cx^2(注:真实状态下的轨迹并不是那样,一般发射后段的轨迹比较倾斜,这是因为后段受...高斯列主元消去法: 1.原理: 算法: 3.matlab代码: A=[1,1,1...
  • 利用c++语言实现雅克比迭代、高斯塞德尔迭代和超松弛迭代。并可进行迭代方式的选择。
  • 包含代码和文档 分别用雅克比迭代法和高斯-赛德尔迭代法求解方程组,精确到小数点后6位,分别就 给出相应的计算结果
  • 计算方法线性方程组求解高斯赛德尔迭代法、高斯列主元消去法 、计算方法线性方程组求解高斯赛德尔迭代法、高斯列主元消去法 计算方法线性方程组求解高斯赛德尔迭代法、高斯列主元消去法 计算方法线性方程组求解高斯...
  • 数值分析实验内容,用matlab写程序实现高斯-赛德尔(Gauss-Seidel)迭代法。 迭代法解线性方程组的基本思想是构造一串收敛到解的序列,即建立一种从已有近似解计算新的近似解的规则,有不同的计算规则得到不同的迭代...
  • 潮流计算高斯-赛德尔迭代法是求解电力系统潮流的方法。通过编程获得电力系统模型,通过计算电力网的节点导纳矩阵和各节点电压、功率,从而计算该电网的潮流。
  • [数值分析]高斯-塞德尔迭代公式解线性方程组 在雅可比迭代公式的基础上,对于收敛的迭代过程,所求出的“新值”常比“老值”更准确些,因此可以用它替代老值作进一步的计算,这样的思想就是著名的高斯-塞德尔迭代...

空空如也

空空如也

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

高斯塞德尔迭代