2014-02-10 23 views
1

我對雅可比方法寫了下面的功能,並需要修改它來執行高斯 - 賽德爾雅可比迭代高斯 - 賽德爾

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)更新,但我不確定如何寫它,謝謝

回答

0

在高斯 - 賽德爾,改變迭代循環爲:

for j = 1:n 
    jj = 1:n; 
    jj(j) = []; 
    Xtemp = x; 
    Xtemp(j) = []; 
    y(j) = (b(j) - sum(A(j,jj) * Xtemp))/A(j,j); 
end 
+0

我試過這個,並得到了與jacobi完全相同的結果 –

+0

@ J.c請在我的答案中看到我的更新。謝謝。 – lennon310

2

你只是單純地要擺脫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就地計算並始終使用最新的值。

0
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