¿Diferencia entre 'cuándo' y 'si' en OpenModelica?
-
21-12-2019 - |
Pregunta
Soy nuevo en OpenModelica y tengo algunas preguntas sobre el código de 'BouncingBall.mo' que se distribuye con el software como código de ejemplo.
1) ¿cuál es la diferencia entre 'cuando' y 'si'?
2) ¿Cuál es el propósito de la variable? 'foo' en el código?
3)en línea(15) - "cuando {h <= 0,0 y v <= 0,0, impacto}",, ¿no debería la expresión para 'cuando' ser suficiente como "{h <= 0,0 y v <= 0,0}" porque esto se convierte VERDADERO cuando ocurre el impacto, ¿cuál es el propósito de impacto(para mí es redundante aquí) y ¿qué significa la coma (,) antes impacto ¿medio?
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;
Solución
Bien, son bastantes preguntas.Déjame intentar responderlas:
Cuál es la diferencia entre
when
yif
.Las preguntas dentro de un
when
cláusula sólo están "activas" en el instante en que las expresiones condicionales utilizadas en lawhen
cláusula se vuelve activa.Por el contrario, las ecuaciones dentro de unif
La declaración es verdadera siempre que la expresión condicional siga siendo verdadera.¿Cuál es el propósito de
foo
?Probablemente para visualización.No tiene un impacto claro en el modelo que puedo ver.
Por que es
impact
listado en elwhen
cláusula.Uno de los problemas que tienes se llama Sistemas Zeno como este. es que continuará rebotando indefinidamente con intervalos cada vez más pequeños.sospecho que
impact
La bandera aquí está destinada a indicar cuándo el sistema ha dejado de rebotar.Esto normalmente se hace comprobando que la expresión condicionalh<=0.0
en realidad se convierte FALSO en algún momento.Debido a que la detección de eventos incluye tolerancia numérica, en algún momento la altura de los rebotes nunca sale del rango de tolerancia y es necesario detectar esto o la pelota nunca vuelve a rebotar y simplemente continúa cayendo.(es difícil de explicar sin ejecutar la simulación y ver el efecto).Lo que hace el
,
hacer en elwhen
cláusula.Considera lo siguiente:
when {a, b} then
.La cuestión es que si quieres tener unwhen
activación de la cláusula cuandoa
ob
hacerse realidad, podrías pensar que lo escribirás comowhen a or b then
.Pero eso no es correcto porque sólo se activará cuando el primero uno se vuelve verdad.Para ver esto mejor, considere este código:
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;
Entonces el conjunto de ecuaciones 1 se ejecutará dos veces aquí porque se ejecutará cuando a
se vuelve cierto y luego otra vez cuando b
se vuelve verdad.Pero el conjunto de ecuaciones 2 sólo se ejecutará una vez cuando a
se vuelve verdad.Eso es porque toda la expresión a or b
sólo se hace realidad en un instante.
Estos son puntos comunes de confusión sobre when
.Ojalá estas explicaciones ayuden.