如果在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。这是不直观的。
如果有人能就此发生这种情况提供指导或评论,以及是否/为何这是设计行为,我将不胜感激。
答案 0 :(得分:3)
Modelica语言规范3.4(第11.1.2节)说:
- 使用其起始值(即start-attribute的值)初始化非离散变量。
- 使用pre(v)初始化离散变量v。
- 如果数组中至少有一个元素出现在左侧 赋值运算符,然后初始化完整数组 这个算法部分。
[...]
算法部分被视为原子矢量方程,与所有其他方程一起排序。
因此,所有变量都将使用算法块每次执行开始时的起始值进行初始化。没有内存,预变量等,所以如果你在if语句中赋值变量,这个值将在下一次执行该段时丢失。
部分原因是并不总是知道分配了哪些索引以及哪些索引。因此,即使所有变量都无条件地分配了常量索引,也会认为它们始终被分配。