Ошибка из-за оператора задержки в разделе алгоритма - PullRequest
1 голос
/ 06 июля 2019

Я реализовал оператор задержки в разделе алгоритмов класса, как показано в тестовом примере ниже, но во время выполнения кодов в 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 ]

2 голосов
/ 08 июля 2019

Как сказал tbeu в своем ответе, проблема в OpenModelica.В Dymola ваш пример имитирует, как и ожидалось.Поэтому, пожалуйста, сообщите о проблеме здесь .

Исследуя немного, я понял, что следующая комбинация препятствует переводу вашей модели:

  • использование задержки
  • в разделе алгоритма
  • внутри цикла 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 заменен на , тогда как цикл модель переводит и имитирует.Но задержанный сигнал z[1] не верен , и ошибка увеличивается с частотой x.На низких частотах, таких как 1 Гц, она едва заметна, но с частотой, например, 20 Гц, амплитуда значительно неправильная.Так что не обманывайтесь этим решением.

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 голосов
/ 08 июля 2019

Похоже на проблему с инструментом. С другой стороны, почему вы рассчитываете z для k = 1 и никогда не используете его?

1 голос
/ 10 июля 2019

Это ошибка в OpenModelica.Для него создан тикет: https://trac.openmodelica.org/OpenModelica/ticket/5572

...