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;
¿Fue útil?

Solución

Bien, son bastantes preguntas.Déjame intentar responderlas:

  1. Cuál es la diferencia entre when y if.

    Las preguntas dentro de un when cláusula sólo están "activas" en el instante en que las expresiones condicionales utilizadas en la when cláusula se vuelve activa.Por el contrario, las ecuaciones dentro de un if La declaración es verdadera siempre que la expresión condicional siga siendo verdadera.

  2. ¿Cuál es el propósito de foo?

    Probablemente para visualización.No tiene un impacto claro en el modelo que puedo ver.

  3. Por que es impact listado en el when 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 condicional h<=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).

  4. Lo que hace el , hacer en el when cláusula.

    Considera lo siguiente: when {a, b} then.La cuestión es que si quieres tener un when activación de la cláusula cuando a o b hacerse realidad, podrías pensar que lo escribirás como when 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top