为什么在算法部分中分配任何一个元素时,Modelica数组元素会自动分配为零

时间:2018-04-25 03:11:21

标签: modelica dymola

如果在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;

如代码注释中所述,这种行为对我来说似乎很奇怪。在等式部分中分配一个数组元素,在算法部分中分配另一个数组元素。 Dymola隐含地添加了一个方程式myArray [1]:= 0,因为算法部分包含方程式myArray [2]:= 1。这是不直观的。

如果有人能就此发生这种情况提供指导或评论,以及是否/为何这是设计行为,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

Modelica语言规范3.4(第11.1.2节)说:

  
      
  • 使用其起始值(即start-attribute的值)初始化非离散变量。
  •   
  • 使用pre(v)初始化离散变量v。
  •   
  • 如果数组中至少有一个元素出现在左侧   赋值运算符,然后初始化完整数组   这个算法部分。
  •   
     

[...]

     

算法部分被视为原子矢量方程,与所有其他方程一起排序。

因此,所有变量都将使用算法块每次执行开始时的起始值进行初始化。没有内存,预变量等,所以如果你在if语句中赋值变量,这个值将在下一次执行该段时丢失。

部分原因是并不总是知道分配了哪些索引以及哪些索引。因此,即使所有变量都无条件地分配了常量索引,也会认为它们始终被分配。