4
model try
discrete Integer x(start = 1);
algorithm
when time >= 3 then
  x:= x + 5;
end when;
x:= 5;
end try;

model try1
discrete Integer x(start = 1);
algorithm
x:= 5;
when time >= 3 then
  x:= x + 5;
end when;
end try;

OpenModelica での両方のシミュレーション結果は、x が常に 5 に等しいということです。なぜですか?

tryモデルの xは 5 であるべきだと思われます。しかしtry1、時間が 3 に等しいのに、モデルの x が 10 でないのはなぜですか?

4

1 に答える 1

3

コメントが2つあります。whenまず、句を扱うときは、pre(...)演算子を使用して、新しい値と前の値のどちらを参照しているかを明示的に明確にすることが賢明であることが多いことに注意してください。この場合に厳密に必要かどうかはわかりません (知っていたとしても、Modelica ツールのすべての開発者が一貫したセマンティクスを使用しているかどうかはわかりません)。コードの読者。

もう 1 つの問題は、アルゴリズムの処理にあります。通常、ステートメントはalgorithmセクションに表示される順序で実行されます。しかし、when句は非同期の性質を持っているため、少し注意が必要です。繰り返しますが、モデル内の他の代入ステートメントとの句のインターリーブに関して正確なセマンティクスが何であるかは明確ではありませんが、あなたのようなセクションをwhen書くalgorithmことは少しあいまいです. whenステートメントが評価され、新しい値が与えられたと仮定しましょうx。その値がどのくらい保持されると予想されますか? whenコンパイラには、アルゴリズムを繰り返し評価する自由があります。セクションは、節が呼び出された直後に評価される場合xがあります。その場合、新しい値が与えられます。5(おそらく、時間がまったく進まなくても)。

このモデルであなたの意図が本当に何なのかわかりません。しかし、1 つの値で開始し、時間 >3 の後に (古い値に基づいて) 新しい値を取得したい場合、Modelica でこれを達成する方法が 2 つあります。価値。次のモデルを検討してください。

  model InitAndEvent
    discrete Integer x(start=1);
  algorithm
    when initial() then
      x := 5;
    end when;
    when time >= 3 then
      x := pre(x) + 5;
    end when;
  end InitAndEvent;

このモデルはpre演算子を使用しますが、さらに重要なことは、initial()イベントを使用して の初期値を提供することですx。このようにして、xtoの値を常に上書きするという以前のモデルでおそらく経験していた問題を回避できます5。これを行う別の方法は次のとおりです。

  model InitAndEvent
    discrete Integer x(start=1);
  initial algorithm
    x := 5;
  algorithm
    when time >= 3 then
      x := pre(x) + 5;
    end when;
  end InitAndEvent;

正直に言うと、ツールが異なれば、これらのバージョンごとにセマンティクスが異なる可能性があります。when initial()バージョンはおそらくより普遍的に一貫していると思います。

アップデート:

あなたの誤解は、その後の評価の意味を考慮していないことに起因すると思います。の場合try1、time==3 でwhen句が評価されx、新しい値が与えられます。

しかし、次のモデル評価ではどうなるでしょうか? アルゴリズム セクションが再度評価されx5 に設定されます。条件式が false になり、次にtrue になるまで、when句は再度評価されません。したがって、この場合、トリガーは 1 回だけです。3 を超えるすべての時間について評価する場合は、ifステートメントを使用する必要があります。

そして、この質問を念頭に置いてください...when節の実行と次のモデル評価 (xリセット時) の間にどのくらいのシミュレーション時間が経過しますか? おそらくなし。アルゴリズム セクションがいつ実行されるかを知る方法はありません (イベント、使用される積分器などによって異なります)。xそのため、シミュレーションの開始時に 1 回と で 1 回値を与えたい場合time==3は、モデルでそれを述べる必要があります (私の例で行ったように)。

于 2012-09-11T20:18:40.490 に答える