# 引言
# Modelica 概述
Modelica 是一种用于网络物理系统建模的语言,支持由数学方程主导的组件间非因果连接,便于从基本原理出发进行建模。它提供面向对象的构造,有利于模型复用,可方便地用于对包含机械、电气、电子、磁、液压、热、控制、电力或面向过程子组件的复杂系统进行建模。
# 规范范围
Modelica 语言的语义通过一套规则来规定,这些规则用于将用 Modelica 语言描述的任意类转换为扁平的 Modelica 结构。语义规范应与 Modelica 语法一起理解。
旨在单独进行仿真的类(专用类 “model” 或 “block”)称为仿真模型。
扁平 Modelica 结构也针对仿真模型之外的其他情况定义,包括函数(可用于提供算法内容)、包(用作结构化机制)和部分模型(用作基础模型)。这样,在将这些类用于构建仿真模型之前,可对其正确性进行验证。
对于仿真模型,有特定的语义限制以确保模型完整;这些限制允许其扁平 Modelica 结构进一步转换为一组微分、代数和离散方程(即混合微分代数方程)。需要注意的是,满足语义限制并不能保证模型可根据初始条件完成初始化并进行仿真。
Modelica 的设计旨在便于模型的符号变换,特别是通过将基本的 Modelica 语言构造映射到扁平 Modelica 结构中的方程来实现。许多 Modelica 模型,尤其是相关的 Modelica 标准库中的模型,是高索引系统,仅当执行符号索引约简(即对方程求微分并选择合适的变量作为状态),使所得系统方程可转换为状态空间形式(至少局部数值上),即索引为零的混合微分代数方程时,才能合理仿真。为进行这种结构分析,若因调用外部函数或初始方程/参数无法在翻译(因参数不能设为 “fixed = false”)时求值,工具可能拒绝仿真模型。接受此类模型属于实现质量问题。Modelica 规范未定义如何仿真模型,但定义了一组方程,仿真结果应尽可能满足这些方程。
转换(或展平)的关键问题包括:
- 继承的基础类的扩展。
- 基础类、局部类和组件的参数化
- 从连接方程生成连接等式。
扁平混合微分代数方程(DAE)形式包括:
- 声明具有适当基本类型、前缀和属性的变量,如参数
Real v = 5。 - 方程部分的方程。
- 函数调用,其中一次调用被视为一组方程,涉及所有输入和所有结果变量(方程数量 = 基本结果变量数量)。
- 算法部分,每个部分被视为一组方程,涉及算法部分中出现的变量(方程数量 = 不同赋值变量的数量)。
- when 代码块,其中每个 when 子句被视为一组有条件计算的方程,涉及子句中出现的变量(方程数量 = 不同赋值变量的数量)。
- 声明具有适当基本类型、前缀和属性的变量,如参数
因此,扁平混合 DAE 被视为一组方程,其中部分方程仅在有条件时计算。模型的初始设置通过 start 属性和仅在初始化期间有效的方程指定。
Modelica 类还可包含注释,即形式化注释,用于指定类的图形表示(图标和图表 )、类的文档文本以及版本信息。
# 部分定义
许多术语的解释可通过 Modelica 1.0 中的文档索引查找。以下定义一些重要术语。
定义 1.1 组件(Component):由 Modelica 语法中“component - clause”生成式定义的元素(本质上是变量或类的实例)。
定义 1.2 元素(Element):在类中声明的类定义、extends子句或“component - clause”(本质上是类的一个特性或组件)。
定义 1.3 展平(Flattening):将用 Modelica 描述的模型转换为对应的混合 DAE 描述的模型(见附录 B Modelica 微分代数方程表示),涉及扩展继承的基础类、参数化基础类、局部类和组件,以及从连接方程生成连接等式。换言之,将模型的层次结构映射为一组微分、代数和离散方程,以及来自模型的相应变量声明和函数定义。
定义 1.4 初始化(Initialization):仿真从求解启动时的初始化问题开始,为展平结果中的所有变量确定初始值。
定义 1.5 瞬态分析(Transient Analysis):从初始化问题的结果出发,模型在时间上向前仿真。这使用数值方法处理混合 DAE,得到模型变量随时间变化的解轨迹,即变量值作为时间的函数。(在数值文献中,瞬态分析常被称为求解初值问题,但为避免与初始化问题混淆,此处不使用该术语。)
定义 1.6 仿真(Simulation):仿真是初始化后进行瞬态分析的过程。(模型还可用仿真之外的方式分析,如线性化和参数估计,但本规范不描述这些内容。)
定义 1.7 转换(Translation):转换是准备 Modelica 仿真模型以进行仿真的过程,包括展平,但不包括仿真本身。(通常,除展平外,转换还涉及对混合 DAE 进行符号操作,并将结果转换为可仿真模型的计算机代码。)
# 符号表示
本节部分将展示本文档中使用的表示示例。
Modelica 代码的语法高亮显示如下列代码清单所示。本说明中的代码包含定义代码结构的关键字,如equation;定义代码结构但不定义含义的关键字,如connect;以及规范中定义了含义的已识别标识符,如semilinear:
model Example "Example used to illustrate syntax highlighting"
/* The string above is a class description string, this is a comment. */
/* Invalid code is typically presented like this: */
String s = 1.0; // Error: No conversion from Real to String.
Real x;
equation
2 * x = semilinear(time - 0.5, 2, 3);
/* The annotation below has omitted details represented by an ellipsis: */
connect(resistor.n, conductor.p) annotation(...);
end Example;
如上面的方程所示,依赖整数字面量到实数的隐式转换很常见(注意文本中内联出现的 Modelica 代码)。
混合使用 Modelica 代码和数学符号表示法很常见。例如,average(x, y) 可定义为
内联代码片段有时会用引号包围,以清晰标记其开始和结束,或突出显示与周围文本的分隔。例如,用,分隔函数调用的参数。
- 定义 1.8 某物(Something):定义 “某物” 含义的文本。
除上述定义风格外,新术语也可在正文引入。例如,“dummy(虚拟体 )” 是指……(这是非规范性内容,提供一些解释、说明和/或其他相关内容。读者若仅关注 Modelica 语言的定义,可跳过此部分。它没有定义效力。)
示例(Example):这是一个示例,是一种特殊的非规范性内容。示例通常包含代码清单和解释性文本,这里也不例外:
String s = 1.0; // Error: No conversion from Real to String.
要修复上述类型不匹配问题,需将数字替换为字符串表达式,如 "1.0"。
文档中其他代码清单用于说明词法和语法结构,均使用词法约定定义的扩展 BNF 表示法。词法单元名称用全大写字母,以 = 开头:
SOME-TOKEN = NON-DIGIT ( DIGIT | NON-DIGIT ) ;
语法结构通过以小写字母命名并以::=开头的产生式规则识别(另注意 Modelica 关键字der的出现):
differentiated-expression :
der "(" SOME-TOKEN ")"
| "(" differentiated-expression "+" differentiated-expression ")"