也许我误解了你的问题,但我怀疑这里有一个简单的答案。听起来您有一个数组,并且您想在特定时间用特定变量的值填充该数组,然后绘制该数组。因此,例如,假设您有一个变量x
,并且您想记录x
跨越某些阈值的时间。像这样的简单模型就足够了:
model RecordVariables
Real x;
Real times[10];
initial equation
x = 11;
equation
der(x) = -x;
when x<=10.0 then
times[1] = time;
end when;
when x<=9.0 then
times[2] = time;
end when;
when x<=8.0 then
times[3] = time;
end when;
when x<=7.0 then
times[4] = time;
end when;
when x<=6.0 then
times[5] = time;
end when;
when x<=5.0 then
times[6] = time;
end when;
when x<=4.0 then
times[7] = time;
end when;
when x<=3.0 then
times[8] = time;
end when;
when x<=2.0 then
times[9] = time;
end when;
when x<=1.0 then
times[10] = time;
end when;
end RecordVariables;
当然,写出所有这些when
条款是相当乏味的。所以我们实际上可以像这样创建一个更紧凑的版本:
model RecordVariables2
Real x;
Real times[5];
Integer i;
Real next_level;
initial equation
next_level = 10.0;
x = 11;
i = 1;
algorithm
der(x) :=-x;
when x<=pre(next_level) then
times[i] :=time;
if i<size(times,1) then
i :=pre(i) + 1;
next_level :=next_level - 1.0;
end if;
end when;
end RecordVariables2;
关于这种方法的一些评论。首先,注意pre
运算符的使用。这对于区分变量的值i
以及子句next_level
生成的事件之前和之后是必要的。when
其次,您会注意到子句中的if
语句when
,它阻止索引i
变得足够大以“溢出”times
缓冲区。这使您可以设置times
为您想要的任何大小,并且永远不会冒这样的溢出风险。但是请注意,在此模型中完全有可能将某些值设置times
得如此之大,以至于永远不会填充某些值。
我希望这有帮助。