Question

Je suis nouveau sur OpenModelica et j'ai quelques questions concernant le code de 'BouncingBall.mo' qui est distribué avec le logiciel comme exemple de code.

1) quelle est la différence entre 'quand' et 'si'?

2) quel est le but de la variable 'foo' dans le code ?

3)en ligne(15) - "quand {h <= 0,0 et v <= 0,0,impact}",, l'expression pour 'quand' être suffisant comme "{h <= 0,0 et v <= 0,0}" parce que cela devient VRAI quand un impact se produit, quel est le but de impact(pour moi, c'est redondant ici) et que fait la virgule (,) avant impact moyens?

model BouncingBall
  parameter Real e = 0.7 "coefficient of restitution";
  parameter Real g = 9.81 "gravity acceleration";
  Real h(start = 1) "height of ball";
  Real v "velocity of ball";
  Boolean flying(start = true) "true, if ball is flying";
  Boolean impact;
  Real v_new;
  Integer foo;
equation
  impact = h <= 0.0;
  foo = if impact then 1 else 2;
  der(v) = if flying then -g else 0;
  der(h) = v;
  when {h <= 0.0 and v <= 0.0,impact} then
      v_new = if edge(impact) then -e * pre(v) else 0;
    flying = v_new > 0;
    reinit(v, v_new);

  end when;
end BouncingBall;
Était-ce utile?

La solution

OK, ça fait pas mal de questions.Permettez-moi d'essayer d'y répondre :

  1. Quelle est la différence entre when et if.

    Les questions à l'intérieur d'un when clause ne sont "actives" qu'au moment où les expressions conditionnelles utilisées dans la when la clause devient active.En revanche, les équations à l'intérieur d'un if L'instruction est vraie tant que l'expression conditionnelle reste vraie.

  2. Quel est le but de foo?

    Probablement pour la visualisation.Cela n’a pas d’impact clair sur le modèle que je peux voir.

  3. Pourquoi est-ce impact répertorié dans le when clause.

    L'un des problèmes que vous rencontrez est ce qu'on appelle Systèmes Zeno comme celui-ci c'est qu'il continuera à rebondir indéfiniment avec des intervalles de plus en plus petits.Je soupçonne le impact Le drapeau ici est destiné à indiquer quand le système a cessé de rebondir.Cela se fait normalement en vérifiant que l'expression conditionnelle h<=0.0 devient en fait FAUX à un moment donné.Étant donné que la détection d'événements inclut une tolérance numérique, à un moment donné, la hauteur des rebonds ne sort jamais de la plage de tolérance et vous devez le détecter, sinon la balle ne rebondira plus jamais et continuera simplement de tomber.(c'est difficile à expliquer sans exécuter la simulation et voir l'effet).

  4. Que fait le , faire dans le when clause.

    Considérer ce qui suit: when {a, b} then.Le problème, c'est que si vous voulez avoir un when la clause se déclenche lorsque l'un ou l'autre a ou b devenu vrai, vous pourriez penser que vous l'écrirez comme when a or b then.Mais ce n'est pas correct car cela ne se déclenchera que lorsque le d'abord on devient vrai.Pour mieux voir cela, considérez ce code :

    a = time>1.0;
    b = time>2.0;
    when {a, b} then
      // Equation set 1
    end when;
    when a or b then
      // Equation set 2
    end when;

Donc l'ensemble d'équations 1 sera exécuté deux fois ici car il sera exécuté quand a devient vrai et encore une fois quand b devient vrai.Mais l'ensemble d'équations 2 ne sera exécuté que une fois quand a devient vrai.C'est parce que toute l'expression a or b ne devient vrai qu’à un instant.

Ce sont des points de confusion courants concernant when.Espérons que ces explications vous aideront.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top