loopsif-statementdymola

Using Conditional Statements in Dymola


I'm new on Dymola and I can't manage to get this code running. I'm trying to create a random generation to simulate the number of people in a room.

Here is the code I have so far. Do you have any idea what could be the problem ?

model Trial

  Real p(start=rand()/32767);
  Real E(start=1);

equation 

when (sample(1,3600)) then//sample(start+interval) ce qui donne "start + i*interval"
    p = rand()/32767;

    if E == 1 then
      if p < 0.2 then
        E = 2;
      elseif p < 0.6 then
        E = 3;
      else
        E = 4;
      end if;

    elseif E == 2 then
      if p < 0.2 then
        E = 1;
      elseif p < 0.6 then
        E = 3;
      else
        E = 4;
      end if;

    elseif E == 3 then
      if p < 0.2 then
        E = 1;
      elseif p < 0.6 then
        E = 2;
      else
        E = 4;
      end if;

    elseif E == 4 then
      if p < 0.2 then
        E = 1;
      elseif p < 0.6 then
        E = 2;
      else
        E = 3;
      end if;
    end if;

end when;

  annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
        coordinateSystem(preserveAspectRatio=false)),
    experiment(StopTime=86400, __Dymola_Algorithm="Dassl"));
end Trial;


Solution

  • I would suggest you have a look at Modelica.Math.Random.Examples.GenerateRandomNumbers. Based on this example, I ended up with:

    model Trial
    
      parameter Integer id=Modelica.Math.Random.Utilities.initializeImpureRandom(globalSeed) "A unique number used to sort equations correctly";
      parameter Integer globalSeed=30020 "Global seed to initialize random number generator";
    
      Real p(start=Modelica.Math.Random.Utilities.impureRandom(id=id));
      Integer E(start=1, fixed=true);
    
    equation 
    
      when (sample(1, 3600)) then
        //sample(start+interval) ce qui donne "start + i*interval"
        p = Modelica.Math.Random.Utilities.impureRandom(id=id);
    
        if pre(E) == 1 then
          if p < 0.2 then
            E = 2;
          elseif p < 0.6 then
            E = 3;
          else
            E = 4;
          end if;
    
        elseif pre(E) == 2 then
          if p < 0.2 then
            E = 1;
          elseif p < 0.6 then
            E = 3;
          else
            E = 4;
          end if;
    
        elseif pre(E) == 3 then
          if p < 0.2 then
            E = 1;
          elseif p < 0.6 then
            E = 2;
          else
            E = 4;
          end if;
    
        else
          // if E == 4 
          if p < 0.2 then
            E = 1;
          elseif p < 0.6 then
            E = 2;
          else
            E = 3;
          end if;
        end if;
    
      end when;
    
      annotation (
        Icon(coordinateSystem(preserveAspectRatio=false)),
        Diagram(coordinateSystem(preserveAspectRatio=false)),
        experiment(StopTime=86400, __Dymola_Algorithm="Dassl"));
    end Trial;
    

    I also corrected: