[Scilab-users] modifying a variable changes the value of another variable!!!

Ezequiel Soulé ezequielsoule at gmail.com
Mon Jan 28 16:18:41 CET 2013


The algorithm essentially starts with a set of spheres in random positions
and in a relatively dense state, and runs an iterative process where the
spheres are moved in each iteration in order to reduce the overlaps.
The core of the script is more or less like this


   superp=calc_D_superp_dobcel(pos);  //this line uses an external
function to calculate a matrix with the overlap between paritcles,
defined as superp(i,j)=max(R(i)+R(j)-D(i,j),0) . D(i,j) is the
distance between the spheres and R is the radius. pos is a 3-colum
matrix containging the coordinates of the position of each sphere

    control=0;    //number of
iterationssup_2(int(control/max_mov*20)+1)=sumsupant/max_mov*20;  //
this defines a third control system as will be described bellow. **
while max(superp)>tol  // the maximum value of superp controls when
the system is considered overlap-free and the algorithm is finished

...
// Several lines where the positions of each sphere are modified,
acording to the values of the matrix superp
...

superp=calc_D_superp_dobcel(pos);  //matrix superp is re-calculated
with the new positions

control=control+1;

 if control>max_mov then break; end   // control by maximum number of iterations

//the following belongs to the third control system:

    if length(sup_2)==int(control/max_mov*20) then
sup_2(int(control/max_mov*20)+1)=sum(superp)/max_mov*20;    //**
    else    //**
       sup_2(int(control/max_mov*20)+1)=sup_2(int(control/max_mov*20)+1)
+ sum(superp)/max_mov*20;   //**
   end     //**

  if length(sup_2)>4.5 then    //**
      if sup_2($-1)>0.85*sup_2($-2) & sup_2($-2)>0.85*sup_2($-3) then
break; end     //**
      if sup_2($-1)>0.7*sup_2($-2) & sup_2($-2)>0.7*sup_2($-3) &
sup_2($-3)>0.6*sup_2($-4) then break; end    //**
  end     //**
end     //ends while loop


The third control system essentially controls if the overlap is decreasing
as the iterations proceed. It defines a new variable, sup_2, that stores
the average value of sum(superp) in max_mov/20 iterations. If this average
does not decrease fast enough (>15% decrease in two or >30%decrease in
three consecutive groups of max_mov/20 iterations), it considers that it
will not converge and breaks.
Now, this third control system seems to be problem. As you can see, non of
its lines (marked with ** for more clarity), affects the values of superp
(at least, it shouldn´t). But still, the value of superp is modified when I
include this control system.
The other problem I had was with a similar algorithm, without the third
control system, but just adding a "pause" rigth after the last end. This
will also modify the values of superp and the number of iterations.
As I said, the error in superp is not important (it is in the order of
1.d-15), but this difference propagates exponentially through the
iterations and can significantly modify (like a 30%) the total number of
iterations (I was trying to evaluate if the third control really worked,
but I couldn´t do it because the algortihm CONVERGES with a different
number of iterations...)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20130128/40e0bc45/attachment.htm>


More information about the users mailing list