Frage

Ich bin neu bei OpenModelica und habe ein paar Fragen zum Code von „BounceBall.mo“, der mit der Software als Beispielcode verteilt wird.

1) Was ist der Unterschied zwischen 'Wann' Und 'Wenn'?

2)Was ist der Zweck der Variablen? 'foo' im Code?

3)in Zeile(15) - „wenn {h <= 0,0 und v <= 0,0,impact}“,, sollte nicht der Ausdruck für sein 'Wann' genügen als „{h <= 0,0 und v <= 0,0}“ denn das wird WAHR Was ist der Zweck, wenn ein Aufprall auftritt? Auswirkungen(für mich ist es hier überflüssig) und was bedeutet das Komma(,) Vor Auswirkungen bedeutet?

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;
War es hilfreich?

Lösung

OK, das sind einige Fragen.Lassen Sie mich versuchen, sie zu beantworten:

  1. Was ist der Unterschied zwischen when Und if.

    Die Fragen in a when -Klausel sind nur zu dem Zeitpunkt „aktiv“, zu dem die in der Klausel verwendeten bedingten Ausdrücke verwendet werden when Klausel wird aktiv.Im Gegensatz dazu sind Gleichungen innerhalb von an if Die Anweisung ist wahr, solange der bedingte Ausdruck wahr bleibt.

  2. Was ist der Zweck von foo?

    Wahrscheinlich zur Visualisierung.Soweit ich weiß, hat es keine eindeutigen Auswirkungen auf das Modell.

  3. Warum ist impact aufgeführt in der when Klausel.

    Eines der Probleme, die Sie haben, heißt Zeno-Systeme wie dieses ist, dass es in immer kleineren Abständen auf unbestimmte Zeit weiter springt.Ich vermute das impact Das Flag hier soll anzeigen, wann das System aufgehört hat zu springen.Dies erfolgt normalerweise durch eine Überprüfung, um sicherzustellen, dass der bedingte Ausdruck vorliegt h<=0.0 tatsächlich wird FALSCH Irgendwann.Da die Ereigniserkennung numerische Toleranzen umfasst, verlässt die Höhe der Absprünge irgendwann nie den Toleranzbereich und Sie müssen dies erkennen, sonst springt der Ball nie wieder ab und fällt einfach weiter.(Es ist schwer zu erklären, ohne die Simulation tatsächlich auszuführen und den Effekt zu sehen.)

  4. Was bedeutet das , tun in der when Klausel.

    Folgendes berücksichtigen: when {a, b} then.Die Sache ist, wenn Sie eine haben wollen when Klausel löst aus, wenn entweder a oder b wahr werden, könnte man meinen, man würde es so schreiben when a or b then.Das ist jedoch nicht korrekt, da dies nur dann ausgelöst wird, wenn die Erste man wird wahr.Um dies besser zu sehen, betrachten Sie diesen 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;

Gleichungssatz 1 wird also ausgeführt zweimal hier, weil es wann ausgeführt wird a wird wahr und dann wieder wann b wird wahr.Aber Gleichungssatz 2 wird nur ausgeführt einmal Wann a wird wahr.Das liegt am ganzen Ausdruck a or b wird nur in einem Moment wahr.

Dies sind häufige Punkte, über die Verwirrung herrscht when.Hoffentlich helfen diese Erklärungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top