2012-06-13 4 views
3

Только начиная с Modelica и не понимая, как это работает.Заказ модели Modelica

В нижеследующем «методе» модели qInflow и qOutflow используются во второй строке для оценки der (h), но они еще не получили значения! (они не были определены в «данных» метода)? В каком порядке выполняется код.

equation 
assert(minV >= 0, "minV must be greater or equal to zero"); 
der(h)=(qInflow - qOutflow)/area; 
qInflow=if time > 150 then 3*flowLevel else flowLevel; 
qOutflow=Functions.LimitValue(minV, maxV, -flowGain*outCtr); 
error=ref - h; 
der(x)=error/T; 
outCtr=K*(error + x); 
end FlatTank;  

От http://www.mathcore.com/resources/documents/ie_tank_system.pdf

ответ

5

Это понятная точка смятения при переходе с языков и систем, использующих императивную семантику. Но Modelica не работает так.

При работе с Modelica важно понимать, что раздел equation содержит уравнения, не назначает. Рассмотрим это, если бы я дал вам следующие уравнения:

x + y = 3; 
x + 2*y = 5; 

Если вы понимаете, что это математический контекст, вы можете определить, что x должен иметь значение 1 и y должен иметь значение 2 Другими словами, вам нужно решить систему одновременных уравнений. Вы заметите, что левая часть этих уравнений равна не переменных (в общем), они являются выражениями. Уравнение - это просто соотношение, которое приравнивает одно выражение с левой стороны к другому выражению справа. Кроме того, это соотношение равно всегда true и поэтому заказ не имеет значения.

Это сильно отличается от императивных языков программирования с императивной семантикой. Но это также очень сильно, потому что вы можете сформулировать эти отношения (линейные системы уравнений, нелинейные системы уравнений, неявные уравнения и т. Д.), И компилятор разработает наиболее эффективный способ их решения.

Возвращаясь к вашему примеру, когда вы смотрите на код в своем вопросе, вы интерпретируете эти уравнения в качестве операторов присваивания. Это понятие усиливается, потому что у них просто есть переменные с левой стороны. Но они действительно являются уравнениями. В системе на основе уравнений вы не беспокоитесь о том, назначена ли данная переменная ранее.Вместо этого требование просто состоит в том, что для каждой переменной существует (где-то) уравнение и нет дополнительных уравнений. Другими словами, вы должны иметь такое же количество переменных, что и неизвестные, и что система уравнений имеет уникальное решение. Это все, что требует Modelica.

Теперь Modelica поддерживает тип императивной семантики, к которой вы привыкли. Но они должны использоваться только в особых случаях, поскольку они ограничивают интерпретацию математического поведения таким образом, что он мешает символической манипуляции, которая позволяет компиляторам Modelica генерировать действительно быстрый код. Так что это больше, чем вопрос стиля. Вы должны использовать уравнения, если это вообще возможно, и алгоритмы в Modelica должны использоваться только в качестве последнего средства.

Последнее примечание. Некоторым людям может быть интересно: «Вы говорите мне, что эти уравнения будут помещены в какую-нибудь гигантскую систему уравнений и решены путем инверсии матрицы или Ньютона-Рафсона или что-то в этом роде? Почему это так сложно, когда его можно было бы решить гораздо проще !» Но он не будет решен как гигантская система уравнений. Если его можно решить как простой набор заданий , он будет. Это один (среди многих) различных методов символической манипуляции, которые будут применяться. На самом деле, это ключевой момент в Modelica ... вам не нужно беспокоиться об оптимизации метода решения, инструмент позаботится об этом. И что более важно, если вы подключаете компоненты таким образом, чтобы возникала одновременная система, вам также не нужно об этом беспокоиться. Инструменты Modelica могут обрабатывать такие «алгебраические петли» для вас, они будут оптимизировать его, чтобы найти наиболее эффективную для вычислений формулировку и не будут зависеть от того, как вы переформулируете свою модель для этих случаев.

Помогло ли это?

+0

Да, это так! Я продолжил использовать компонентный пример, и это сделало гораздо больше смысла. Великолепно получить инструкцию от автора! – Matt

+0

Отлично. Рад, что это помогло. Малая коррекция «от * a * Автор» (есть много авторов спецификации Modelica, а кроме того, есть еще несколько других книг на Modelica, кроме моей) –

1

Вы не можете знать порядок выполнения уравнений в модели Modelica, пока вы не запустите инструмент Modelica на него (вы можете изменить порядок любое уравнение в исходной модели и получить то же самое результат). И тогда заказ верен только для этого инструмента с настройками, которые вы использовали.

Это был заказ выбран OpenModelica компилятором (OMC + S + simCodeTarget = дамп model.mo):

error = ref - h;
outCtr = K * (error + x);
der(x) = DIVISION(error, T, #SHARED_LITERAL_2(String#);
qOutflow = LimitValue(minV, maxV, (-flowGain) * outCtr);
qInflow = if time > 150.0 then 3.0 * flowLevel else flowLevel;
der(h) = DIVISION(qInflow - qOutflow, area, #SHARED_LITERAL_3(String#);

Этот пример был немного скучным, потому что левая и правая стороны без уравнения изменили место (h = error - ref было бы жизнеспособным, если бы h не был выбран как переменная состояния и т. Д.).

Смежные вопросы