Насколько мне известно, атрибут start может принимать только выражения с постоянной или изменчивостью параметров (см. Спецификацию Modelica 3.4, раздел 3.8). Поэтому единственное реальное решение, которое приходит мне в голову, это что-то вроде хака:
- Установите фиксированный атрибут параметра, используемого для начального значения (
StartValue
в вашем примере), равным false
и
- вычислить значение в исходном уравнении
Это приведет к:
model TestStartValue
Real value1=1000;//calculated by some model
Real value2=-1000;//calculated by some model
parameter Real InputValue = 100;//Input to model
final parameter Real StartValue(fixed=false);
Real x(start=StartValue);
initial equation
StartValue=if InputValue < value2 then 1.8 elseif InputValue > value1 then 2.8 else 0.5;
equation
(x-1)*(x-2)*(x-3)=0;
end TestStartValue;
Не уверен, что это будет работать во всех инструментах и в будущих версиях! Я на самом деле не думаю, что это предназначено для использования таким образом. Кроме того, это может вызвать проблемы позже, поскольку обычно предполагается, что параметры устанавливаются до начала симуляции, а не во время ее инициализации ...
Другой альтернативой может быть использование исходного уравнения, которое должно давать что-то вроде:
model TestStartValueInitEq
Real value1=1000;//calculated by some model
Real value2=2000;//calculated by some model
parameter Real InputValue = 100;//Input to model
Real x;
initial equation
if InputValue < value2 then
pre(x)-2=0;
elseif InputValue > value1 then
pre(x)-3=0;
else
pre(x)-1=0;
end if;
equation
(x-1)*(x-2)*(x-3)=0;
end TestStartValueInitEq;
Недостаток этого решения состоит в том, что исходное уравнение фактически предназначено для установки значения для переменных состояния. Для них начальное значение может быть выбрано свободно (более или менее), поскольку не существует уравнения, определяющего его при инициализации. Это не тот случай, который даст несколько уравнений для x
во время инициализации, что будет тормозить модель. Во избежание этого в Dymola pre()
помогает (не уверен, что в других инструментах). Это приводит к «избыточным последовательным начальным условиям». с которым Димола может справиться. Чтобы уравнения были избыточными, они должны давать одинаковый результат. Следовательно, вы не можете использовать оценки для результата, как в исходном коде, поэтому я изменил их для второго примера.
Тем не менее оба решения кажутся мне несовершенными. Если есть другое решение, пожалуйста, добавьте его ...