由于算法部分中的延迟运算符而导致错误

时间:2019-07-06 16:51:19

标签: delay modelica openmodelica

我已经在一个类的算法部分中实现了一个延迟运算符,如下面的测试用例所示,但是在Open modelica中执行代码期间,我遇到了以下错误。我该如何解决该问题?

 model test3
     Real x=sin(377*time);
     Real z;
     parameter Real tau[:]={0.01,0.02};

  equation

  algorithm
     for k in 1: 2 loop
        z:=delay(x,tau[k]);

     end for;

    end test3;

3 个答案:

答案 0 :(得分:2)

看起来像一个工具问题。另一方面,为什么您要为k = 1计算z却从不使用呢?

答案 1 :(得分:2)

像tbeu在回答中说的那样,这是OpenModelica中的一个问题。在Dymola中,您的示例将按预期进行模拟。因此,请报告问题here

仔细研究一下,我意识到以下组合会阻止您的模型进行翻译:

  • 延迟的使用
  • 在算法部分
  • 在for循环内

因此,您必须摆脱其中任何一个。

解决方法

如果您事先知道tau[:]的大小,请使用分隔行来计算z,而不是for循环:

model sep_lines
  Real x = sin(8 * time);
  Real z[2];
  parameter Real tau[2] = {0.02, 0.01};
equation

algorithm
  z[1] := delay(x, tau[1]);
  z[2] := delay(x, tau[2]);
end sep_lines;

也许您可以使用等式部分而不是算法节部分。然后,您根本不需要for循环,因为如果需要,函数调用(在这种情况下为delay)会自动向量化。您的代码将减少为:

model eqs
  Real x = sin(8 * time);
  Real z[3];
  parameter Real tau[3] = {0.03, 0.02, 0.01};
equation
  z = delay(x, tau);
end eqs;

额外问题

如果将for循环替换为 while循环,则模型会进行翻译和模拟。但是延迟信号z[1]不正确,并且误差随x的频率而增加。在1 Hz之类的低频下,它几乎看不见,但是频率例如20 Hz幅度是错误的。因此,不要被这个解决方案所欺骗。

model while_ "Compiles, but the amplitude of z[1] is wrong"
   Real x = sin(2*Modelica.Constants.pi * 20 * time);
   Real z[size(tau, 1)];
   parameter Real tau[:] = {0.02, 0.01};
 protected
   Integer i;
 algorithm
   i := 0;
   while i < size(tau, 1) loop
     i := i + 1;
     z[i] := delay(x, tau[i]);
   end while;
 end while_;

答案 2 :(得分:1)

这是OpenModelica中的错误。已为其创建票证:https://trac.openmodelica.org/OpenModelica/ticket/5572