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变量j2. 但它应该以j = 1.
有人对这个问题有想法吗?

4

2 回答 2

3

请记住,这sample(x,y)意味着样本在从零开始的x+i*y地方为真。i也就是说,sample(0, ...)time=0.

由于j从 1 开始并且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在右侧值周围添加了j. 如果这是在一个 equation部分中,我很确定这pre将是必需的。既然是algorithmsection,主要是记录代码的意图。它还使代码在切换equationalgorithm部分时变得健壮。

于 2013-02-19T13:36:08.753 回答
1

当然,在 time = 0 时有一个事件由sample(0, delta_t) and j<k变为 true 的表达式触发。

但在旧版本的 Dymola 中,离散变量的初始化存在错误。例如,即使您sample(0.0, delta_t) and j<k在 dymola74 中删除,j 也会在 time=0 时变为 2。问题是未初始化的 when 子句的 pre 值是正确的。据我所知,这至少在 FD1 2013 版本中得到了纠正。

于 2013-02-19T13:35:42.967 回答