Изменчивость 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})