Plot SOR method Successive over-relaxation
Afficher commentaires plus anciens
1. Determine the optimal value of the relaxation parameter for the SOR method for the system. Using this value, solve the system. Take x^0 = 0, and therminate iteration when |x^(k+1) − x^k|∞ falls below 5 × 10^−6. Find the number of iterations required to achieve convergence.
2. Generate a plot of the number of iterations required by the SOR method to achieve convergence as a function of the relaxation parameter ω. Take x^0 = 0, and therminate iteration when |x^(k+1)−x^k|∞ falls below 5×10^−6. Find the number of iterations required to achieve convergence.
I am using this code to solve #1. Can some one help me to fix the code and solve #2 the plot between iterations and W ?
function x = sor ( A, b, xold, W, TOL, Nmax )
clear all;
clc;
A=[7, -3, 0, 0, 0;
-3, 9, 1, 0, 0;
0, 1, 3, -1, 0;
0, 0, -1, 10, -4;
0, 0, 0, -4, 6];
b=[4; -6; 3; 7; 2];
TOL=5*10^(-6);
xold=[0,0,0,0,0];
Nmax=100;
n = length ( b );
for i=1:n
for j=1:n
if i == j
D(i,j)=A(i,j);
else
D(i,j)=0;
end
end
end
for i=1:n
for j=1:n
if i<= j
L(i,j)=0;
U(i,j)=A(i,j);
else
L(i,j)=A(i,j);
U(i,j)=0;
end
end
end
for i=1:n
for j=1:n
if i>= j
U(i,j)=0;
else
U(i,j)=A(i,j);
end
end
end
W=2/(1+sqrt(1-(max(abs(eig(inv(D)*(L+U)))))^2))
[r c] = size ( A );
if ( c ~= n )
disp ( 'sor error: matrix dimensions and vector dimension not compatible' )
return
end;
xnew = zeros ( 1, n );
if ( nargout == 0 )
s = sprintf ( '%3d \t %10f ', 0, xold(1) );
for j = 2 : n
s = sprintf ( '%s%10f ', s, xold(j) );
end;
disp ( s );
end;
for its = 1 : Nmax
xnew(1) = ( 1 - W ) * xold(1) + W * ( b(1) - sum ( A(1,2:n) .* xold(2:n) ) ) / A(1,1);
for i = 2 : n-1
xnew(i) = ( 1 - W ) * xold(i) + W * ( b(i) - sum ( A(i,1:i-1) .* xnew(1:i-1) ) - sum ( A(i,i+1:n) .* xold(i+1:n) ) ) / A(i,i);
end;
xnew(n) = ( 1 - W ) * xold(n) + W * ( b(n) - sum ( A(n,1:n-1) .* xnew(1:n-1) ) ) / A(n,n);
if ( nargout == 0 )
s = sprintf ( '%3d \t %10f ', its, xnew(1) );
for j = 2 : n
s = sprintf ( '%s%10f ', s, xnew(j) );
end;
disp ( s );
end;
conv = max ( abs ( xnew - xold ) );
if ( conv < TOL )
x = xnew;
return
else
xold = xnew;
end;
end;
disp ( 'sor error: maximum number of iterations exceeded' );
if ( nargout == 1 ) x = xnew;
end;
Thank you
1 commentaire
ateq alsaadi
le 5 Avr 2015
Réponses (0)
Catégories
En savoir plus sur Data Type Identification dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!