MATLAB中的Gauss-Seidel方法

MATLAB中的Gauss-Seidel方法,matlab,numerical-methods,gauss,Matlab,Numerical Methods,Gauss,我试图在MATLAB中实现Gauss-Seidel方法。但我的代码中有两个主要错误,我无法修复它们: 我的代码在小矩阵上收敛得很好,但在大矩阵上永远不会收敛 代码进行冗余迭代。如何防止重复迭代 N=5; A=兰特(N,N); b=兰特(N,1); x=零(N,1); 总和=0; xold=x; 抽搐 对于n_iter=1:1000 对于i=1:N 对于j=1:N if(j~=i) sum=sum+(A(i,j)/A(i,i))*xold(j); 其他的 继续; 结束 结束 x(i)=-和+b(

我试图在MATLAB中实现Gauss-Seidel方法。但我的代码中有两个主要错误,我无法修复它们:

  • 我的代码在小矩阵上收敛得很好,但在大矩阵上永远不会收敛

  • 代码进行冗余迭代。如何防止重复迭代

  • N=5;
    A=兰特(N,N);
    b=兰特(N,1);
    x=零(N,1);
    总和=0;
    xold=x;
    抽搐
    对于n_iter=1:1000
    对于i=1:N
    对于j=1:N
    if(j~=i)
    sum=sum+(A(i,j)/A(i,i))*xold(j);
    其他的
    继续;
    结束
    结束
    x(i)=-和+b(i)/A(i,i);
    总和=0;
    结束
    三个方程的if(abs(x(i)-xold(j))
    %Gauss-seidal方法
    clc;
    x1=0;
    x2=0;
    x3=0;
    m=输入(“输入迭代次数”);
    对于i=1:1:m
    x1(i+1)=(-0.01-0.52*x2(i)-x3(i))/0.3
    x2(i+1)=0.67-1.9*x3(i)-0.5*x1(i+1)
    x3(i+1)=(0.44-0.1*x1(i+1)-0.3*x2(i+1))/0.5
    er1=abs((x1(i+1)-x1(i))/x1(i+1))*100
    er2=abs((x2(i+1)-x2(i))/x2(i+1))*100
    er3=abs((x3(i+1)-x3(i))/x3(i+1))*100
    
    如果er1首先是一般性的。Gauß-Seidel和Jacobi方法仅适用于对角占优矩阵,而不是一般的随机矩阵。因此,要获得正确的测试示例,您需要实际地建设性地确保该条件,例如通过

    A = rand(N,N)+N*eye(N)
    
    或类似的

    否则,该方法将在某些或所有组件中向无穷远方向发散


    现在,让我们来看看您的实现中的其他一些奇怪之处。您的目标是什么

    if(abs(x(i)-xold(j))<0.001)
    
    甚至更短,使用matlab的语言功能

    for i = 1:N
        J = [1:(i-1) (i+1):N];
        x(i) = ( b(i) - A(i,J)*xold(J) )/A(i,i);
    end   
    
    if(abs(x(i)-xold(j))<0.001)
    
    for i = 1:N
        sum = b(i);
        for j = 1:N
            if (j ~= i)
                sum = sum - A(i,j) * xold(j);
            end
        end
        x(i) = sum/A(i,i);
    end
    
    for i = 1:N
        J = [1:(i-1) (i+1):N];
        x(i) = ( b(i) - A(i,J)*xold(J) )/A(i,i);
    end