我尝试使用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
开始
有没有人对这个问题有所了解?
答案 0 :(得分:3)
请注意,sample(x,y)
表示样本在x+i*y
处为真,其中i
从零开始。也就是说sample(0, ...)
的{{1}}成为现实。
由于time=0
从1开始而且j
大概超过1,所以k
在模拟开始时应该变为真,这似乎并不出人意料。
我怀疑你想要的是:
sample(0, delta_t) and j<k
我真的没有看到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
部分,因此主要是记录代码的意图。它还使代码可以从algorithm
切换到equation
部分。
答案 1 :(得分:1)
当然,由sample(0, delta_t) and j<k
表达式触发的时间= 0的事件变为真。
但是在旧版本的Dymola中,离散变量的初始化存在一个错误。例如,即使你删除了dymola74中的sample(0.0, delta_t) and j<k
,j也会在时间= 0时变为2。问题在于when子句的前置值,其中未初始化正确。据我所知,这至少在版本FD1 2013中得到了纠正。