différence entre « quand » et « si » dans OpenModelica ?
-
21-12-2019 - |
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;
La solution
OK, ça fait pas mal de questions.Permettez-moi d'essayer d'y répondre :
Quelle est la différence entre
when
etif
.Les questions à l'intérieur d'un
when
clause ne sont "actives" qu'au moment où les expressions conditionnelles utilisées dans lawhen
la clause devient active.En revanche, les équations à l'intérieur d'unif
L'instruction est vraie tant que l'expression conditionnelle reste vraie.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.
Pourquoi est-ce
impact
répertorié dans lewhen
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 conditionnelleh<=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).Que fait le
,
faire dans lewhen
clause.Considérer ce qui suit:
when {a, b} then
.Le problème, c'est que si vous voulez avoir unwhen
la clause se déclenche lorsque l'un ou l'autrea
oub
devenu vrai, vous pourriez penser que vous l'écrirez commewhen 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.