В моей модели я запутался, почему начальные условия НЕ указаны полностью.
Вот код и скриншот:
model WithAlgebraicLoop_Right
extends Modelica.Icons.Example;
Real x;
Real y(start=1, fixed=true);
Boolean cond;
equation
cond = x > 0.5;
when pre(cond) then
y = 1*time;
end when;
x = sin(y*10*time);
end WithAlgebraicLoop_Right;
Я думаю, что во время инициализации x
можно было вычислить из y
, поэтому cond
можно было вычислить из x
, так почему же Dymola не делает так, как я думаю?
Конечно, переменная дискретного времени cond
может быть рассчитана в соответствии с заданными уравнениями. Однако его предварительное значение для итерации события при инициализации неизвестно и должно быть установлено либо путем установки фиксированного начального значения, либо с помощью начального уравнения, как вы предпочитаете.
model WithAlgebraicLoop_Right1
Real x;
Real y(start=1, fixed=true);
Boolean cond(start=false, fixed=true);
equation
cond = x > 0.5;
when pre(cond) then
y = 1*time;
end when;
x = sin(y*10*time);
end WithAlgebraicLoop_Right1;
или
model WithAlgebraicLoop_Right2
Real x;
Real y(start=1, fixed=true);
Boolean cond;
initial equation
pre(cond) = false;
equation
cond = x > 0.5;
when pre(cond) then
y = 1*time;
end when;
x = sin(y*10*time);
end WithAlgebraicLoop_Right2;
Да, это так, см. раздел 8.6 об инициализации спецификации языка Modelica версии 3.4 (Specification.modelica.org/maint/3.4/…): Для всех дискретных переменных vd уравнение pre(vd) = startExpression добавляется в уравнения инициализации, если start = startExpression и fixed = true.
Кстати, я бы предпочел фиксированное начальное значение, так как вы можете легко изменить их в компонентах, чего нельзя сказать об исходных уравнениях. См. это обсуждение для получения дополнительной информации: github.com/mtiller/ModelicaBook/issues/133
В разделе 8.6 вы также можете прочитать о различной инициализации переменных непрерывного и дискретного времени. То, что вы упомянули выше, справедливо только для переменных с непрерывным временем, но cond
является переменной с дискретным временем.
установка фиксированного начального значения может вычислить предварительное значение переменных? Я думал, что установка фиксированного начального значения означает, что вы знаете значение переменной от времени = 0 с и далее, но не
pre-value
. Но я проверяю модель, она работает без предупреждений, поэтому я не уверен, что это за внутренний механизм.