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

Serge Steer Serge.Steer at inria.fr
Mon Jan 28 18:07:53 CET 2013


If the initial position of your sphere are randomly set, it can be 
normal than you do not have the same number of iteration from one 
simulation to an other one.
can you check using
rand("seed",0)
to force identical initial points for your various tests.

Serge Steer
Le 28/01/2013 16:18, Ezequiel Soulé a écrit :
> 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 iterations
>
> sup_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...)
>
>
> _______________________________________________
> users mailing list
> users at lists.scilab.org
> http://lists.scilab.org/mailman/listinfo/users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20130128/aa407feb/attachment.htm>


More information about the users mailing list