如何在Modelica中更改数组的每个第i个元素

时间:2014-12-19 13:53:29

标签: arrays modelica

我正在尝试更改数组的每个第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个元素?

提前致谢。

1 个答案:

答案 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;