Marko Vidalis
Marko Vidalis

Reputation: 353

Matlab code for Gauss-Seidel and Successive over relaxation iterative methods

I need to code the Gauss Seidel and Successive over relaxation iterative methods in Matlab. I have created the below code for each of them, however my final solution vector does not return the correct answers and i'm really struggling to figure out why. Could anyone please help me? In both cases, x is the final solution vector and i returns the number of iterations.

Thanks in advance

Gauss Seidel Method:

function [x,i] = gaussSeidel(A,b,x0,tol)
x2 = x0;
count = 0;
D = diag(diag(A));
U = triu(A-D);
disp(U);
L = tril(A-D);
disp(L);
C = diag(diag(A));
disp(C);
Inv = inv(C+D);
error = inf;
      while error>tol
          x1 = x2;
          x2 = Inv*(b-(U*x1));
          error = max(abs(x2-x1)/abs(x1));
          count = count + 1;
      end
x = x2;
i = count;
end

SOR Method:

function [x,i] = sor(A,b,x0,tol,omega)
[m,n] = size(A);
D = diag(diag(A));
U = triu(A-D);
L = tril(A-D);
count = 1;
xtable = x0;
w = omega;
if size(b) ~= size(x0)
    error('The given approximation vector does not match the x vector size');
elseif m~=n
    error('The given coefficient matrix is not a square');
else
    xnew = (inv(D+w*L))*(((1-w)*D-w*U)*x0 +w*b);
    RelError = (abs(xnew-x0))/(abs(xnew));
    RelErrorCol = max(max(RelError));
    while RelErrorCol>tol
        xnew = (inv(D+w*L))*(((1-w)*D-w*U)*x0 +w*b);
        RelError = (abs(xnew-x0))/(abs(xnew));
        RelErrorCol = max(max(RelError));
        x0 = xnew;
        count = count+1;
        xtable = [xtable, xnew];
    end
    disp(xtable);
    x = xnew;
    i = count;
end

Upvotes: 1

Views: 38850

Answers (1)

rayryeng
rayryeng

Reputation: 104503

Gauss-Seidel: Your line that describes C is wrong. Actually it shouldn't be there. Also for the Inv line, it should be inv(D+L), not inv(C+D).

As for the SOR method, in hindsight it seems right. To double check, compare with this method:

http://www.netlib.org/templates/matlab/sor.m. This method relies on http://www.netlib.org/templates/matlab/split.m


Edit: April 4, 2014 - Also check: https://www.dropbox.com/s/p9wlzi9x9evqj5k/MTH719W2013_Assn4_Part1.pdf?dl=1 . I taught a course on Applied Linear Algebra and have MATLAB code that implements Gauss-Seidel and SOR. Check slides 12-20 for the theory and how to implement Gauss-Seidel and slides 35-37 for the SOR method.

Let me know how it goes.

Upvotes: 3

Related Questions