变量

正如我们在前一节中所提到的,模型定义的特征之一就是包含变量声明。变量声明的基本语法就是在变量的“类型”(将在内建类型章节中简短讨论)之后紧随变量的名称,

Real x;

相同类型的变量可以组合在一起使用下面的语法:

Real x, y;

变量声明也可以跟随在描述的后面。

Real alpha "angular acceleration";

可变性

参数

模型中的变量声明默认假定为连续变量(连续型变量的解通常是连续的,但是也可能包含间断点)。然而,正如在引入物理那节中提到的,能够在变量声明前加入parameter(参数)限定词,以表明该变量是先验已知的。我们可以认为这个参数作为模型的“输入数据”,是不随时间变化的常数。

常数

parameter(参数)限定符关系密切的是constant(常数)限定词。当被置于变量声明前,constant(常数)限定符意味着变量的值是先验已知的常数,且不随时间变化。这两者之间的区别在于一旦模型被编译,parameter限定词的值是可以随着模拟改变而改变的,但是constant限定词的值是不会改变的。对于模型开发者来说,constant限定词的应用是保证终端用户者不能更改该constantconstant限定词经常被用于代表物理常数。比如像数学中的pi或者重力加速度这样在大多数工程仿真中被假定为常数的量。

离散变量

另外一种可以放在变量声明前的限定词是discrete(离散)限定词。目前还没有相关的例子可以演示discrete限定词的作用。但为了完整起见,它作为最后一个可变性限定词也列举在这里。

内建类型

目前为止,很多例子声明变量的时候引用Real(实数)类型。顾名思义,Real用于代表实数变量(实数变量在Modelica编译器中通常被编译为浮点数)。然而,Real仅仅是Modelica语言的四大内置类型之一。

另外一种内置类型是Integer(整数)类型。这种类型用于代表整数值。Integer变量有许多用途,包括代表数组的大小(这种用途的例子将在向量与数组这节中讨论)。

其他内置类型是Boolean(布尔值)(用于代表值的true(真)或false(假))和String(用于代表字符串)。

每一个内置类型都限定了变量值的可能值。显然,Integer变量不能是2.5Boolean或者String(字符)不能是7Real变量不能是"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的属性)。

对于parameterstart属性(通常)会作为parameter的默认值。

默认值0.0

类型Integer

fixed

参见前节对Real的属性的讨论

默认false(除了parameter变量,这里的默认值为True

类型Boolean

min

min(最小)属性用来指定变量允许的最小值。这个属性可以通过各种方式被编辑器或者编译器使用,以通知使用者或者开发者关于潜在的无效输入或者解。

默认值:-\(\infty\)

类型Integer

max

max(最大)属性用于指定变量允许的最大值。这个属性可以通过各种方式被编辑器或者编译器使用,去在出现可能是无效输入或者解时提醒使用者或者开发者。

默认值\(\infty\)

类型Integer

Boolean的属性

quantity

用以来描述这个变量所代表含义的文本。

Default: ""

类型String

start

值得注意的是,Boolean变量可以用来表示状态变量或者迭代变量。在这种情况下,start属性就可以被编译器使用,就如它在Real变量中的应用一样(见前面讨论Real的属性)。

对于parameterstart属性(通常)会作为parameter的默认值。

默认值0.0

类型Boolean

fixed

参见前节对Real的属性的讨论

默认false(除了parameter变量,这里的默认值为True

类型Boolean

String的属性

quantity

用以来描述这个变量所代表含义的文本。

Default: ""

类型String

start

从技术上讲,一串String(字符串)可以作为一个状态变量(甚至迭代变量)。但事实上从没有这种情况。因此对于String变量,start属性的唯一实际应用是定义(恰好是String类型的)parameter的值。前提是参数没有给定明确的值。

Default: ""

类型String

值得注意的是派生类型保留了其来源的内置类型的属性。例如,实数变量中的min属性拥有Real类型。但是必须明确指出,属性自己不能拥有属性。换句话说,start属性不能拥有start属性。

修改语句

目前为止,本书只介绍了有两种修改语句类型。第一种是用于修改属性值,例如:

Real x(start=10);

在这个例子中,创建了一个实数类型的变量x。但是我们不打算直接使用这个变量。我们对x加入修改语句。在这里,我们修改xstart属性。这仅仅只是进入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中支持重用的基本特性。在后面的章节中将会学习其他支持重用的特性。