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

Если в 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.

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

1 Ответ

0 голосов
/ 25 апреля 2018

Modelica Language Specification 3.4 (раздел 11.1.2) гласит:

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

[...]

Секция алгоритма обрабатывается как атомное векторное уравнение, которое сортируется вместе со всеми другими уравнениями.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...