Почему элементы массива Modelica автоматически присваиваются нулю, когда в разделе алгоритма назначается какой-либо один элемент

Если массив определен в Dymola и любому элементу массива присвоено значение в разделе алгоритма, оказывается, что Dymola неявно добавляет уравнения для всех неназначенных элементов массива. Рассмотрим пример ниже:

model AlgorithmAssignment

  // Declare an array with two elements
  Real myArray[2];

algorithm 
  // Assign a value to array element 1 in algorithm section
  // This yields no error and implicitly assigns myArray[2] := 0;
  myArray[1] := 10;

end AlgorithmAssignment;

Эта проблема привлекла мое внимание при попытке запустить модель, похожую на приведенный ниже код:

model EquationAndAlgorithmAssignment

  // Declare an array with two elements
  Real myArray[2];

equation 
  // Define element 1 in the equation section
  myArray[1] = 10;

algorithm 
  // Define element 2 in the algorithm section
  myArray[2] := 1;

  // This model is over-defined because the equation myArray[2] := 1 in the
  // algorithm section implicitly adds an equation myArray[1] := 0
  // This behavior is unexpected.

end EquationAndAlgorithmAssignment;

Как отмечено в комментариях к коду, такое поведение мне кажется странным. Один элемент массива назначается в разделе уравнения, другой - в разделе алгоритма. Мне не интуитивно понятно, что Димола неявно добавляет уравнение myArray [1]: = 0 просто потому, что раздел алгоритма содержит уравнение myArray [2]: = 1.

Я был бы признателен, если бы кто-нибудь мог дать рекомендации или комментарии о том, почему это происходит, и если / почему это поведение дизайна.


person Justin Kauffman    schedule 25.04.2018    source источник


Ответы (1)


В спецификации языка Modelica 3.4 (раздел 11.1.2) говорится:

  • Недискретная переменная инициализируется своим начальным значением (т.е. значением начального атрибута).
  • Дискретная переменная v инициализируется с помощью pre (v).
  • Если хотя бы один элемент массива появляется слева от оператора присваивания, то весь массив инициализируется в этом разделе алгоритма.

[...]

Раздел алгоритма рассматривается как атомарное векторное уравнение, которое сортируется вместе со всеми другими уравнениями.

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

Частично это связано с тем, что не всегда известно, какие индексы присвоены, а какие -. Таким образом, они считаются назначенными всегда, даже если всем переменным безусловно присвоены постоянные индексы.

person sjoelund.se    schedule 25.04.2018