help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Successive Over-Relaxation ... what is wrong? Improvements?


From: Sergei Steshenko
Subject: Re: Successive Over-Relaxation ... what is wrong? Improvements?
Date: Fri, 2 Nov 2012 15:51:51 -0700 (PDT)




----- Original Message -----
> From: Sergei Steshenko <address@hidden>
> To: Joza <address@hidden>; "address@hidden" <address@hidden>
> Cc: 
> Sent: Saturday, November 3, 2012 12:44 AM
> Subject: Re: Successive Over-Relaxation ... what is wrong? Improvements?
> 
> 
> 
> 
> 
> 
> ----- Original Message -----
>>  From: Joza <address@hidden>
>>  To: address@hidden
>>  Cc: 
>>  Sent: Saturday, November 3, 2012 12:25 AM
>>  Subject: Successive Over-Relaxation ... what is wrong? Improvements?
>> 
>>  Below is an implementation I have written of the Successive Over-Relaxation
>>  Method (for pedagogical purposes). I must use a starting guess of zeros and
>>  b in Ax=b is all ones. A is sparse. 
>> 
>>  I've run Octave's CGS and it solved the problem in about 1 second 
> ... my
>>  code has been running for well over 5 minutes and nothing ...
>> 
>>  I'm sure there is something I'm missing here. Any ideas? Feel free 
> to 
>>  run
>>  the code yourself ... w is the relaxation parameter ( try 1.35) and tol is
>>  the convergence tolerance. 
>> 
>>  This is the second major algorithm I've had trouble with recently. Must 
> be
>>  something up with mu approach! Anyway, I'd really like to hear all
>>  critiques!
>> 
> ************************************************************************************************************************************************
>> 
>>  function [x, iters] = SOR(w, tol)
>> 
>>  r = sparse([1 1], [1 2], [2 -1], 1, 1000);
>>  A = toeplitz(r);
>>  b = ones(1000,1);
>>  x = zeros(1000,1);
>> 
>>  iters = 0;
>>  converged = 0;
>> 
>>  while !converged
>>      
>>      norm_x = 0.0;
>>      norm_delta_x = 0.0;
>>      for i=1:1:1000;
>>          sum = 0.0;
>>          
>>          if i==1
>>              for j=1:2
>>                  sum = sum + A(i,j)*x(j);
>>              end
>>          
>>                  elseif i==1000
>>              for j=999:1000
>>                  sum = sum + A(i,j)*x(j);
>>              end
>>          
>>                  else
>>              for j=i-1:i+1
>>                  sum = sum + A(i,j)*x(j);
>>              end
>>          end
>> 
>>          delta_x = w*(b(i) - sum)/A(i,i);
>>          x(i) = x(i) + delta_x
>>          iters = iters + 1;
>> 
>>          norm_x = max( norm_x, abs(x(i)) );
>>          norm_delta_x = max(norm_delta_x, abs(delta_x) )
>>      end
>>      
>>      if norm_delta_x <= tol + 4.0*(10^-16)*norm_x
>>          converged = 1;
>>      end
>>  end
>> 
> 
> 
> Without going into details I can definitely tell you shouldn't be writing 
> code this way.
> 
> In any decent code review lines like:
> 
>     for i=1:1:1000;
>              for j=999:1000
> 
> will be ruthlessly ruled out. This is because you are using constants, though 
> you most likely mean to use something which is a function of matrices sizes.
> 
> I.e. your code is error prone because you need to change it whenever matrices 
> sizes change.
> 
> And, by the way, I do not know ';' in
> 
>     for i=1:1:1000;
> 
> does.
> 
> 
> Regards,
>   Sergei.


And, by the way, this is completely wrong to debug such problems on data having 
several thousand elements - because one will quickly get lost in this number of 
values.

Unless he/she is a genius making no mistakes.

So, if I understand correctly, you should first reduce your problem to, say, 4 
x 4 sparse matrix and using debugger and/or print statements debug it.

Regards,
  Sergei.


>


reply via email to

[Prev in Thread] Current Thread [Next in Thread]