2

Dymola で次のコードをコンパイルしようとしました。

class abc
  import Modelica.SIunits;
  parameter SIunits.Time delta_t=0.5;

  constant Real a[:]={4,2,6,-1,3,5,7,4,-3,-6};
  Real x;
  Integer j(start=1);
  Integer k=size(a, 1);

algorithm 
  when {(sample(0, delta_t) and j < k),j == 1} then
    x := a[j];
    j := j + 1;
  end when;
end abc;

time = 0変数はでj始まり2ます。しかし、それはで始まる必要がありj = 1ます。
誰かがこの問題について考えを持っていますか?

4

2 に答える 2

3

サンプルがゼロから始まる場所でsample(x,y)真であることを意味することに注意してください。つまり、 で真になります。x+i*yisample(0, ...)time=0

は 1からj始まり、kおそらく 1 よりも大きいためsample(0, delta_t) and j<k、シミュレーションの開始時に true になることは予想外ではないように思えます。

あなたが望むものは次のとおりだと思います:

class abc
  import Modelica.SIunits;
  parameter SIunits.Time delta_t=0.5;

  constant Real a[:]={4,2,6,-1,3,5,7,4,-3,-6};
  Real x;
  Integer j(start=1);
  Integer k=size(a, 1);

algorithm 
  when {(sample(delta_t, delta_t) and j < k),j == 1} then
    x := a[pre(j)];
    j := pre(j) + 1;
  end when;
end abc;

j==1条件のポイントがよくわかりません。最初は真であるということは、その後真に「ならない」ことを意味します。また、デクリメントされることはないため、初めてインクリメントしたときにj値に戻る必要がある理由がわかりません。1

preの右側の値の周りにa を追加したことに注意してくださいj。これが equationセクションにある場合は、が必要になると確信していpreます。これはalgorithmセクションであるため、主にコードの意図を文書化するためのものです。また、セクションequationからalgorithmセクションへの切り替えに対してコードを堅牢にします。

于 2013-02-19T13:36:08.753 に答える
1

もちろん、sample(0, delta_t) and j<ktrue になる式によってトリガーされる time = 0 のイベントがあります。

しかし、Dymola の古いバージョンでは、離散変数の初期化にバグがあります。例えばsample(0.0, delta_t) and j<kdymola74で削除しても、time=0でjは2になります。問題は、初期化されていない when 句の pre 値が正しいことでした。私の知る限り、これは少なくともバージョン FD1 2013 で修正されています。

于 2013-02-19T13:35:42.967 に答える