differenza tra "quando" e "se" in OpenModelica?
-
21-12-2019 - |
Domanda
Sono nuovo su OpenModelica e ho alcune domande riguardanti il codice di "BouncingBall.mo" che è distribuito con il software come codice di esempio.
1) qual è la differenza tra 'Quando' E 'Se'?
2) qual è lo scopo della variabile 'pippo' nel codice?
3)in linea(15) - "quando {h <= 0,0 e v <= 0,0,impatto}",, non dovrebbe essere l'espressione for 'Quando' essere sufficiente come "{h <= 0,0 e v <= 0,0}" perché questo diventa VERO quando si verifica l'impatto, qual è lo scopo impatto(per me è ridondante qui) e cosa significa la virgola(,) Prima impatto significa?
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;
Soluzione
OK, sono parecchie domande.Provo a rispondere:
Qual è la differenza tra
when
Eif
.Le domande all'interno di a
when
sono "attive" solo nel momento in cui le espressioni condizionali utilizzate nel filewhen
la clausola diventa attiva.Al contrario, le equazioni all'interno di anif
sono vere finché l'espressione condizionale rimane vera.Qual è lo scopo
foo
?Probabilmente per la visualizzazione.Non ha alcun impatto chiaro sul modello che posso vedere.
Perché è
impact
elencato nelwhen
clausola.Uno dei problemi che hai cosiddetto I sistemi Zeno come questo è che continuerà a rimbalzare indefinitamente con intervalli sempre più piccoli.Sospetto che
impact
flag qui ha lo scopo di indicare quando il sistema ha smesso di rimbalzare.Questo viene normalmente fatto controllando per assicurarsi che l'espressione condizionaleh<=0.0
diventa effettivamente falso ad un certo punto.Poiché il rilevamento degli eventi include la tolleranza numerica, a un certo punto l'altezza dei rimbalzi non esce mai dall'intervallo di tolleranza ed è necessario rilevarlo, altrimenti la palla non rimbalzerà mai più e continuerà a cadere.(è difficile da spiegare senza eseguire effettivamente la simulazione e vedere l'effetto).Cosa fa il
,
fare nelwhen
clausola.Considera quanto segue:
when {a, b} then
.Il fatto è che, se vuoi avere un filewhen
la clausola si attiva quando uno dei duea
Ob
diventare realtà, potresti pensare di scriverlo comewhen a or b then
.Ma questo non è corretto perché si attiverà solo quando il file Primo uno diventa vero.Per vederlo meglio, considera questo codice:
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;
Quindi il set di equazioni 1 verrà eseguito due volte qui perché verrà eseguito quando a
diventa vero e poi di nuovo quando b
diventa vero.Ma il set di equazioni 2 verrà eseguito solo una volta Quando a
diventa vero.Questo perché l'intera espressione a or b
diventa vero solo in un istante.
Questi sono punti comuni di confusione su when
.Speriamo che queste spiegazioni aiutino.