为什么在算法部分中分配任何一个元素时,Modelica 数组元素会自动分配为零
Why are Modelica array elements automatically assigned to zero when any one element is assigned in an algorithm section
如果在 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.
如果有人能提供指导或意见说明为什么会发生这种情况,我将不胜感激,if/why这是设计行为。
Modelica 语言规范 3.4(第 11.1.2 节)说:
- A non-discrete variable is initialized with its start value (i.e. the value of the start-attribute).
- A discrete variable v is initialized with pre(v).
- If at least one element of an array appears on the left hand side of
the assignment operator, then the complete array is initialized in
this algorithm section.
[...]
An algorithm section is treated as an atomic vector-equation, which is sorted together with all other equations.
因此,在每次执行算法块时,您的所有变量都将使用起始值进行初始化。没有内存、预变量等,因此如果您在 if 语句中分配给变量,则该值将在该部分的下一次执行时丢失。
造成这种情况的部分原因是并不总是知道分配给哪些索引以及哪些索引。因此,即使所有变量都无条件地分配了常量索引,它们也被认为总是被分配。
如果在 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.
如果有人能提供指导或意见说明为什么会发生这种情况,我将不胜感激,if/why这是设计行为。
Modelica 语言规范 3.4(第 11.1.2 节)说:
- A non-discrete variable is initialized with its start value (i.e. the value of the start-attribute).
- A discrete variable v is initialized with pre(v).
- If at least one element of an array appears on the left hand side of the assignment operator, then the complete array is initialized in this algorithm section.
[...]
An algorithm section is treated as an atomic vector-equation, which is sorted together with all other equations.
因此,在每次执行算法块时,您的所有变量都将使用起始值进行初始化。没有内存、预变量等,因此如果您在 if 语句中分配给变量,则该值将在该部分的下一次执行时丢失。
造成这种情况的部分原因是并不总是知道分配给哪些索引以及哪些索引。因此,即使所有变量都无条件地分配了常量索引,它们也被认为总是被分配。