变量¶
正如我们在前一节中所提到的,模型定义的特征之一就是包含变量声明。变量声明的基本语法就是在变量的“类型”(将在内建类型章节中简短讨论)之后紧随变量的名称,
Real x;
相同类型的变量可以组合在一起使用下面的语法:
Real x, y;
变量声明也可以跟随在描述的后面。
Real alpha "angular acceleration";
可变性¶
参数¶
模型中的变量声明默认假定为连续变量(连续型变量的解通常是连续的,但是也可能包含间断点)。然而,正如在引入物理那节中提到的,能够在变量声明前加入parameter
(参数)限定词,以表明该变量是先验已知的。我们可以认为这个参数作为模型的“输入数据”,是不随时间变化的常数。
常数¶
与parameter
(参数)限定符关系密切的是constant
(常数)限定词。当被置于变量声明前,constant
(常数)限定符意味着变量的值是先验已知的常数,且不随时间变化。这两者之间的区别在于一旦模型被编译,parameter
限定词的值是可以随着模拟改变而改变的,但是constant
限定词的值是不会改变的。对于模型开发者来说,constant
限定词的应用是保证终端用户者不能更改该constant
。constant
限定词经常被用于代表物理常数。比如像数学中的pi或者重力加速度这样在大多数工程仿真中被假定为常数的量。
离散变量¶
另外一种可以放在变量声明前的限定词是discrete
(离散)限定词。目前还没有相关的例子可以演示discrete
限定词的作用。但为了完整起见,它作为最后一个可变性限定词也列举在这里。
内建类型¶
目前为止,很多例子声明变量的时候引用Real
(实数)类型。顾名思义,Real
用于代表实数变量(实数变量在Modelica编译器中通常被编译为浮点数)。然而,Real
仅仅是Modelica语言的四大内置类型之一。
另外一种内置类型是Integer
(整数)类型。这种类型用于代表整数值。Integer
变量有许多用途,包括代表数组的大小(这种用途的例子将在向量与数组这节中讨论)。
其他内置类型是Boolean
(布尔值)(用于代表值的true
(真)或false
(假))和String
(用于代表字符串)。
每一个内置类型都限定了变量值的可能值。显然,Integer
变量不能是2.5
。Boolean
或者String
(字符)不能是7
。Real
变量不能是"Hello"
。
派生类型¶
正如前面介绍物理类型的例子一样,内置类型可以进行“特殊化”。这个特性主要是用于修改与属性相关的值,比如unit
。用于创建派生类型的语法是:
type NewTypeName = BaseTypeName(/* attributes to be modified */);
BaseTypeName
(基本类型名称)一般为内置类型(比如Real
(实数))。但是它也可以是另外一种派生类型。这意味着多层次的限定也是支持的。例如:
type Temperature = Real(unit="K"); // Could be a temperature difference
type AbsoluteTemperature = Temperature(min=0); // Must be positive
枚举类型¶
enumeration
(枚举)类型和Integer
类型非常类似。enumeration
类型通常用于定义一组有限的特定值。事实上,枚举类型在语言上不是必须的。enumeration
类型的值总是可以用整数替代。但是enumeration
类型却比Integer
类型更安全和合理。
在Modelica中有两种内置的枚举类型。第一种是AssertionLevel
(断言级别)。其定义如下:
type AssertionLevel = enumeration(warning, error);
这些值的用处将在接下来的assert这节中讨论。
另外一种内置枚举类型是StateSelect
(状态选择),其定义如下:
type StateSelect = enumeration(never, avoid, default, prefer, always);
属性¶
在本章中到目前为止,已经提到了属性(例如unit
(单位))。但是还没有详细讨论过,例如,一个既定的变量应该有何种属性?这主要依赖于变量的类型(以及它所基于的基于内置类型或派生类型)。下面的表格列举了所有可能的属性以及与其类型(例如属性可以赋什么类型的值)以及其可以关联的类型,最后表格则简短描述属性的作用。
Real
的属性¶
quantity
用以来描述这个变量所代表含义的文本。
Default:
""
类型:
String
start
start
(初值)这个属性有很多用途。start
属性的主要目的是(正如在初始化那节里广泛讨论过的)为状态变量提供“备用”的初始状态。(参见fixed
属性以获取进一步的细节)start
属性的也可以用于变量,是迭代变量时的初始假想值。最后,如果一个
parameter
没有明确指定的值,那么start
属性的值可以作为parameter
的默认值。默认值:
0.0
类型:
Real
fixed
fixed
(固定)属性改变了start
属性用于初始值的方式。正常来讲,start
属性被认为是“备用”的初始状态。这仅仅会在initial equation
中没有指定足够的初始状态时使用。然而,如果fixed
属性被设为true
,那么start
属性就被明确地用于initial equation
。(即属性不再作为备用,而是作为严格的初始条件)。此外,一种
fixed
属性的晦涩用法是用在“算出的参数”。在某些罕见的情况下,一个parameter
不能显式初始化。因此,参数的需要得到一个通用方程作为其initial equation
。如果parameter
一旦通过这种方式初始化,那么参数变量的fixed
属性必须设置为false
。默认:
false
(除了parameter
变量,这里的默认值为True
)类型:
Boolean
min
min
(最小)属性用来指定变量允许的最小值。这个属性可以通过各种方式被编辑器或者编译器使用,以通知使用者或者开发者关于潜在的无效输入或者解。默认值:-\(\infty\)
类型:
Real
max
max
(最大)属性用于指定变量允许的最大值。这个属性可以通过各种方式被编辑器或者编译器使用,去在出现可能是无效输入或者解时提醒使用者或者开发者。默认值:\(\infty\)
类型:
Real
unit
正如在本章中广泛谈到的那样,变量是可以拥有与其相关的物理单位。这些单位的表示有其规则。而最终结果是
unit
(单位)属性可以用于检查模型,确保方程的物理一致性。"1"
代表值没有物理单位。另一方面""
(默认没有给定值)表明物理单位不确定。"1"
和""
之间的区别在于前者明确指出量是无量纲(无单位)。而后者指出量可能是有物理单位的,只是没有明确指出。默认值:
""
(即没有指定物理单位)类型:
String
displayUnit
unit
属性描述了与变量相关值的物理单位。displayUnit
(显示单位)属性表达了当展示变量的值时偏向使用何种单位。例如,压力的国际单位是帕斯卡。标准大气压是101,325帕斯卡。当输入、显示或者绘制压力的时候,单位用巴更方便。displayUnit
属性不影响变量的值或者模拟模型的方程它仅仅影响把它们转换成更方便的单位显示的那些值的显示。Default:
""
类型:
String
nominal
nominal
(额定)属性用于指定变量的额定值。额定值一般用于在数字计算中执行各种类型的扩展,以避免四舍五入或者截断误差。默认值:
0.0
类型:
Real
stateSelect
stateSelect
(状态选择)属性用于为Modeliac编译器提供线索,去确定某个既定的变量是否应该被选为状态量(在需要选择的情况)。在上节枚举类型中我们讨论过,这个属性可能值是:never
(从不)、avoid
(避免)、default
(默认)、prefer
(偏向)、always
(总是)默认值:
default
类型:
StateSelect
(枚举类型,请参阅枚举类型)
Integer
的属性¶
quantity
用以来描述这个变量所代表含义的文本。
Default:
""
类型:
String
start
值得注意的是,
Integer
变量可以用来表示状态变量或者迭代变量。在这种情况下,编译器就可以应用start
属性。其用法和Real
变量的情况一样(见前面讨论的Real的属性)。对于
parameter
,start
属性(通常)会作为parameter
的默认值。默认值:
0.0
类型:
Integer
fixed
参见前节对Real的属性的讨论。
默认:
false
(除了parameter
变量,这里的默认值为True
)类型:
Boolean
min
min
(最小)属性用来指定变量允许的最小值。这个属性可以通过各种方式被编辑器或者编译器使用,以通知使用者或者开发者关于潜在的无效输入或者解。默认值:-\(\infty\)
类型:
Integer
max
max
(最大)属性用于指定变量允许的最大值。这个属性可以通过各种方式被编辑器或者编译器使用,去在出现可能是无效输入或者解时提醒使用者或者开发者。默认值:\(\infty\)
类型:
Integer
Boolean
的属性¶
String
的属性¶
quantity
用以来描述这个变量所代表含义的文本。
Default:
""
类型:
String
start
从技术上讲,一串
String
(字符串)可以作为一个状态变量(甚至迭代变量)。但事实上从没有这种情况。因此对于String
变量,start
属性的唯一实际应用是定义(恰好是String
类型的)parameter
的值。前提是参数没有给定明确的值。Default:
""
类型:
String
值得注意的是派生类型保留了其来源的内置类型的属性。例如,实数变量中的min
属性拥有Real
类型。但是必须明确指出,属性自己不能拥有属性。换句话说,start
属性不能拥有start
属性。
修改语句¶
目前为止,本书只介绍了有两种修改语句类型。第一种是用于修改属性值,例如:
Real x(start=10);
在这个例子中,创建了一个实数类型的变量x
。但是我们不打算直接使用这个变量。我们对x
加入修改语句。在这里,我们修改x
的start
属性。这仅仅只是进入x
的第一层做修改。在接下来的例子中,我们会在任意深度对x
做修改。
另一种修改是在避免重复那节中。此时修改语句是和扩展
条款连接在一起的。例如:
extends QuiescentModelWithInheritance(gamma=0.3, delta=0.01);
在这里,修改语句作用在继承自QuiescentModelWithInheritance
模型的部件上。和修改属性时一样,受修改的(模型)元件后带有括号。而所希望的修改则正正在括号中。
值得注意的是,修改语句可以任意嵌套。例如,我们可以修改来自于模型QuiescentModelWithInheritance
变量x
中的start
属性,在Modelica中,这种修改语句如下:
extends QuiescentModelWithInheritance(x(start=5));
在这里,首先“进入”模型QuiescentModelWithInheritance
修改(从x
中“继承”的)内容。然后,再“进入”x
修改start
属性的值。
Modelica的核心主题之一是支持重用而避免“复制和粘贴”代码。而修改语句就是Modeliaca中支持重用的基本特性。在后面的章节中将会学习其他支持重用的特性。