OpenModelica の「when」と「if」の違いは何ですか?
-
21-12-2019 - |
質問
私は OpenModelica を初めて使用します。サンプル コードとしてソフトウェアとともに配布されている「BouncingBall.mo」のコードに関していくつか質問があります。
1) の違いは何ですか 'いつ' そして 'もし'?
2) 変数の目的は何ですか 「ふー」 コードの中で?
3)行(15)中 - 「{h <= 0.0 および v <= 0.0 の場合、影響}」、、という表現をすべきではないでしょうか。 'いつ' として十分です 「{h <= 0.0 および v <= 0.0}」 これはこうなるから 真実 衝撃が起こったとき、その目的は何ですか インパクト(私にとってここは冗長です)そしてコンマ(,) 前に インパクト 手段?
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;
解決
OK、かなりの数の質問があります。それらに答えてみましょう。
違いは何ですか
when
そしてif
.内の質問
when
句で使用される条件式が「アクティブ」になるのは、句で使用される条件式が成立する瞬間だけです。when
条項が有効になります。対照的に、内部の方程式は、if
条件式が true である限り、ステートメントは true となります。目的は何ですか
foo
?おそらく視覚化のためでしょう。私が確認した限り、モデルに明らかな影響はありません。
なぜですか
impact
に記載されているwhen
句。あなたが抱えている問題の 1 つは、いわゆる ゼノシステムはこんな感じ それは、間隔がどんどん小さくなって無限に跳ね返り続けるということです。私が疑っているのは、
impact
ここでのフラグは、システムのバウンスがいつ停止したかを示すことを目的としています。これは通常、条件式が次のとおりであることを確認することによって行われます。h<=0.0
実際にはなる 間違い ある時点で。イベント検出には数値的な許容値が含まれるため、ある時点でバウンスの高さが許容範囲を超えることはなく、これを検出する必要があります。そうしないと、ボールは二度とバウンドせず、落下し続けます。(実際にシミュレーションを実行して効果を確認しないと説明するのは困難です)。は何ですか
,
で行うwhen
句。次のことを考慮してください。
when {a, b} then
. 。問題は、もしあなたがwhen
次のいずれかの場合に句がトリガーされますa
またはb
true になると、次のように書くと思うかもしれません。when a or b then
. 。しかし、それは正しくありません。なぜなら、それは次の場合にのみトリガーされるからです。 初め 一つが真実になります。これをよりよく理解するには、次のコードを検討してください。
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;
したがって、方程式セット 1 が実行されます 二度 ここで実行されるのは a
trueになり、その後またいつ b
が真実になります。ただし、方程式セット 2 は実行されるだけです 一度 いつ a
が真実になります。それは、表現全体が a or b
ある瞬間にのみ真実になります。
これらは、よくある混乱のポイントです when
. 。これらの説明がお役に立てば幸いです。