Как сказал 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_;