Модель Modelica первого порядка с нулевой постоянной времени - PullRequest
3 голосов
/ 21 апреля 2020

Я хотел бы выяснить, возможно ли (и семантически законно) в Modelica моделировать модель передаточной функции первого порядка с постоянной времени , равной нулю (T ниже ). Я использую OpenModelica 1.15.0 ~ dev-48-g3656b95, но я задаю вопрос в общем контексте Modelica.

Мой контекст экспериментирует с уменьшением порядка моделей на моделях Modelica, что заставляет меня попробовать использовать Modelica.Blocks.Continuous.FirstOrder с иногда нулевой постоянной времени. Однако, чтобы упростить обсуждение, вот плоская модель, над которой я работаю (упрощение и адаптация стандартного блока FirstOrder):

model FirstOrderZero
  import Modelica.SIunits;

  Real u "input";
  Real y "output";

  parameter Real k(unit="1")=1 "Gain";
  constant SIunits.Time T=0 "Time Constant";

equation
  u = 1;
  der(y) = (k*u - y)/T;

end FirstOrderZero;

Я понимаю, что инструменты Modelica работают с Symboli c Уравнение анализа, постоянная времени T должна быть constant, а не parameter. Действительно, для T=0 дифференциальное уравнение вырождается в алгебраическое уравнение c y = k*u. Если инструмент моделирования Modelica не может генерировать разные пути кода для различных значений T (что, как мне кажется, не делает инструмент Modelica, за исключением, может быть, Modia в будущем?), Тот факт, что T является нулевым или нет, должен решаться на начало анализа уравнения.

Я не понимаю, почему вышеупомянутая модель не может симулировать («деление на ноль в момент времени 0 [...], где выражение делителя равно 0,0» с OM 1.15 dev) тогда как работает , когда последнее уравнение переписывается как:

 T*der(y) = (k*u - y);

Я бы предположил, что анализ уравнения symboli c должен переформулировать уравнение автоматически? (Я вижу в OM Transformational Debugger, что уравнение становится der(y) = (k - y)/0.0, что, конечно, нарушает симуляцию).

Или, может быть, синтаксически некорректно для записи уравнений Modelica с деление на нулевую константу?

1 Ответ

3 голосов
/ 22 апреля 2020

Изменчивость T

Если постоянная времени T является постоянной, параметр или, возможно, (дискретная) переменная зависит от того, что вы хотите сделать.

  • значение констант фиксируется во время трансляции
  • параметры могут изменяться после трансляции (то есть до начала симуляции), но не во время симуляции
  • дискретные переменные могут изменять свое значение во время симуляции, но только при экземпляры событий
  • непрерывные переменные могут изменять свое значение во время моделирования

См. 4.4.4 Префиксы вариабельности компонентов дискретные, параметр, константа в Спецификации Modelica 3.4 для деталей .

Для элементов первого порядка вы обычно используете передаточную функцию, которая не изменится во время симуляции, но пользователь должен иметь возможность установить значение T. Поэтому parameter будет естественным выбором.

Почему ваша симуляция завершается неудачей

Используя постоянную для T, инструмент Modelica может оптимизировать ваши уравнения больше, чем когда вы используете параметр. И в зависимости от того, как вы пишете свои уравнения, вы получите другое оптимизированное уравнение.

Для constant T=0 ваша исходная модель уменьшается до

model FirstOrderZero
  Real u, y;
  parameter Real k=1;
equation 
  u = 1;
  der(y) = (k*u - y)/0;
end FirstOrderZero;

Для решения y необходима его производная der(y) - но ее нельзя вычислить, так как деление на ноль всегда

Во втором случае с T*der(y) = (k*u - y); ваша модель уменьшается до

model FirstOrderZero
  Real u, y;
  parameter Real k=1;
equation 
  u = 1;
  0 * der(y) = (k*u - y);
end FirstOrderZero;

Уравнение 0 * der(y) = (k*u - y) приводит к 0 = (k*u - y) и, следовательно, y = k*u. Деления на ноль нет, и модель может быть смоделирована.

Видите ли, хотя Modelica является точным языком, может иметь значение, как вы пишете свои уравнения.

Что вы можете сделать

Элемент первого порядка с T = 0 больше не элемент первого порядка, а только пропорциональный коэффициент усиления. Чтобы смоделировать это, используйте блок Modelica.Blocks.Continuous.TransferFunction.

. Если T не ноль, параметрируйте его следующим образом:

Modelica.Blocks.Continuous.TransferFunction transferFunction(b={k}, a={T,1})

, а если его ноль, используйте

Modelica.Blocks.Continuous.TransferFunction transferFunction(b={k}, a={1})
...