【问题标题】:Jacobi iteration to Gauss-SeidelJacobi 迭代到 Gauss-Seidel
【发布时间】:2014-03-07 05:53:51
【问题描述】:

我为 Jacobi 方法编写了以下函数,需要对其进行修改以执行 Gauss-Seidel

function [ x,iter] = jacobi( A,b,tol,maxit )
%jacobi iterations
%   

x=zeros(size(b));

[n,m]=size(A);

i=1;

iter=maxit;

for i=1:maxit

    for j=1:n

        y(j)=(b(j)-A(j,1:j-1)*x(1:j-1)-A(j,j+1:n)*x(j+1:n))/A(j,j)

    end

    if max(abs(A*y'-b))<tol
        iter=i;
        break;
    end
    x=y';

end

我知道我需要让x(1:j-1) 更新,但不确定如何编写,谢谢

【问题讨论】:

    标签: matlab linear-algebra numerical-methods


    【解决方案1】:

    您只需要去掉 y 并将任何出现的 y 替换为 x。

    for j=1:n
    
        x(j)=(b(j)-A(j,1:j-1)*x(1:j-1)-A(j,j+1:n)*x(j+1:n))/A(j,j)
    
    end
    
    if max(abs(A*x-b))<tol
        iter=i;
        break;
    end
    

    Jacobi 从旧向量计算一个新向量,然后一次替换所有变量。

    Gauß-Seidel 就地计算并始终使用最新值。

    【讨论】:

      【解决方案2】:
      function [x succes iter]=gausssedel(A,b,x0,tol,maxiter)
      
      n=length(A);
      succes=0;
      iter=maxiter;
      x=zeros(n,1);
      
      while maxiter > 0
          maxiter=maxiter-1;
          for i=1:n
             % suma=A(i,1:i-1)*x(i,1-i)+A(i,i+1:n)*x0(i+1:n);
               suma=A(i,1:i-1)*x(1:i-1)+A(i,i+1:n)*x0(i+1:n);
              x(i) = (b(i)-suma)/A(i,i);
          end
          if norm(x-x0) < tol
              succes=1;
              break;
          end
          x0=x;
      
      end
      iter=iter-maxiter;
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-08
        • 2014-01-16
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多