MATLAB中的Gauss-Seidel方法

时间:2017-02-02 21:36:49

标签: matlab numerical-methods gauss

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

  1. 我的代码在小矩阵上很好地收敛,但它从不收敛于大矩阵。

  2. 代码进行冗余迭代。如何防止冗余迭代?

  3. Gauss-Seidel Method on wikipedia

    N=5;
    A=rand(N,N);
    b=rand(N,1);
    x = zeros(N,1);
    sum = 0;
    xold = x;
    tic
    for n_iter=1:1000
        for i = 1:N
            for j = 1:N
                if (j ~= i)
                    sum = sum + (A(i,j)/A(i,i)) * xold(j);
                else
                    continue;
                end
            end
            x(i) = -sum + b(i)/A(i,i);
            sum = 0;
        end
        if(abs(x(i)-xold(j))<0.001)
            break;
        end
        xold = x;
    end
    gs_time=toc;
    prompt1='Gauss-Seidel Method Time';
    prompt2='x Matrix';
    disp(prompt2);
    disp(x);
    disp(prompt1);
    disp(gs_time);
    

2 个答案:

答案 0 :(得分:0)

%Gauss-seidal method for three equations
clc;
x1=0;
x2=0;
x3=0;
m=input('Enter number of iteration');
for 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

    if er1<=0.01
       er2<=0.01
       er3<=0.01
        break;
    end
end

答案 1 :(得分:0)

首先,概括。 Gauß-Seidel Jacobi方法仅适用于对角占优矩阵,而不适用于一般随机矩阵。因此,要获取正确的测试示例,您需要实际地建设性地确保该条件,例如通过

A = rand(N,N)+N*eye(N)

或类似。

  

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


现在在您的实现中还有其他一些奇怪之处。

if(abs(x(i)-xold(j))<0.001)

是什么意思?请注意,该指令位于循环之外 ,其中ij是迭代变量,因此索引值可能为 undefined 。由于惯性,它们意外地都将具有值N,因此该准则至少有意义。

您要测试的是整个矢量差异的一些范数,因此使用sum(abs(x-xold))/Nmax(abs(x-xold))。在右侧,您可能希望乘以应用于x的相同范数构造,以便考虑到问题的严重性,从而针对相对误差进行测试。


此外,您可以缩短/简化内循环

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

使用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