Error due to delay operator in algorithm section

核能气质少年 提交于 2019-12-11 12:40:11

问题


I have implemented a delay operator in algorithm section of a class as shown in the test case below, but during the execution of the codes in Open modelica, I face the below error. how can I fix the problem?

 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;

回答1:


Looks like a tool issue. On the other hand, why would you calculate z for k=1 and never use it?




回答2:


Like tbeu said in his answer, its an issue in OpenModelica. In Dymola your example simulates as expected. So please report the issue here.

Investigating a bit I realized that the following combination prevents your model from translating:

  • usage of delay
  • in an algorithm section
  • inside a for loop

Hence, you have to get rid of either of those.

Workarounds

If you know the size of tau[:] in advance, use separate lines for the computation of z instead of the for loop:

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;

Maybe you can use an equation section instead of the algoirthm section. Then you don't need the for loop at all, since function calls (in this case the delay) are vectorized automatically if needed. Your code will reduce to:

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;

Extra issue

If the for loop is replaced with a while loop the model translates and simulates. But the delayed signal z[1] is not correct and the error increases with the frequency of x. At low frequencies like 1 Hz its barely visible, but with a frequency of e.g. 20 Hz the amplitude is considerably wrong. So don't get fooled by this solution.

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_;



回答3:


This is a bug in OpenModelica. A ticket for it was created: https://trac.openmodelica.org/OpenModelica/ticket/5572



来源:https://stackoverflow.com/questions/56916012/error-due-to-delay-operator-in-algorithm-section

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!