我正在尝试更改数组的每个第i个元素,因为事件发生了。这可以通过以下代码达到。在此示例中,应更改每个第二个元素。由于参数定义的数组大小,'内部'循环的第二个参数应该由变量'Upper'设置。
model Test
Boolean Event;
Real Vector[6](start = ones(6), fixed = true);
Integer Upper;
algorithm
when Event then
Vector := ones(6);
Upper := 3;
for i in {2*j for j in 1:Upper} loop
Vector[i] := Vector[i]+1;
end for;
end when;
equation
Event = if time <=1 then false else true;
end Test;
Dymola不接受这个解决方案,说明'无法计算1:Upper'的最后一个参数。当我直接输入3而不是'Upper'时,代码可以正常工作。
有可能解决这个问题吗?或者是否有更简单的方法来更改算法部分中的每个第i个元素?
提前致谢。
答案 0 :(得分:1)
我想说这是一个Dymola问题。 OpenModelica处理得很好。 这是一个可能更适合你的替代配方(隐藏函数中的所有内容应该让Dymola更快乐,因为没有难以推断的尺寸大小)。
function incrementEveryIth
input Real v[:];
input Integer i;
input Real increment := 1;
output Real o[size(v,1)] := v;
algorithm
o := {if mod(n,i)<>0 then v[n] else (v[n]+increment) for n in 1:size(v,1)};
end incrementEveryIth;
model Test
Boolean Event;
Real Vector[6](start = ones(6), each fixed = true);
algorithm
when Event then
Vector := incrementEveryIth(pre(Vector),2);
end when;
equation
Event = if time <=1 then false else true;
end Test;
或许这一个:
model Test
Boolean Event;
Real Vector[6](start = ones(6), each fixed = true);
algorithm
when Event then
Vector := pre(Vector); // This should not really be needed, but OpenModelica insists
Vector[1:2:6] := Vector[1:2:6] + {1,1,1};
end when;
equation
Event = if time <=1 then false else true;
end Test;