Modelica语法详解
版本 unknown · 22 节
第 1 页
第 2 页
第 3 页
弹跳小球:Modelica 离散事件与混合建模入门
本教程通过一个经典的“弹跳小球”示例,介绍如何在 MWORKS 中使用 Modelica 语言对具有离散事件(如碰撞)的混合系统进行建模。该模型将展示连续物理行为(重力作用下的运动)与离散状态变化(与地面碰撞时速度反向)的结合。
1. 模型物理原理
弹跳小球模型描述了一个在重力场中运动的质点,当其位移(高度)降至零时,与地面发生完全弹性碰撞,速度立即反向。其连续动态由常微分方程描述,而碰撞事件则触发状态的瞬时重置。
核心概念:
when语句用于定义仅在特定条件(事件)发生时执行的代码,是实现离散行为的关键。
2. 在 MWORKS 中构建模型
-
新建 Modelica 模型:在 MWORKS 的建模视图中,创建一个新的 Modelica 包或模型文件,命名为
BouncingBall。 -
声明变量和参数:在
model和end BouncingBall;之间,首先定义模型的变量和物理参数。model BouncingBall parameter Real g = 9.81 "重力加速度 (m/s^2)"; parameter Real e = 0.7 "恢复系数 (0-1)"; Real h(start = 10) "小球高度 (m)"; Real v(start = 0) "小球速度 (m/s)";parameter关键字定义模型运行时不变量,如重力加速度g和恢复系数e。Real声明连续变量h(高度)和v(速度),并通过start属性设置初始值。
-
编写方程部分:在
equation部分描述系统的动态行为和事件。equation der(h) = v; der(v) = -g; when h <= 0.0 then reinit(v, -e * pre(v)); end when; end BouncingBall;der(h) = v和der(v) = -g定义了小球在空中的连续运动规律。when h <= 0.0 then定义了一个事件:当高度h下降到小于等于 0 时触发。reinit(v, -e * pre(v))是事件触发时的核心操作。reinit用于在事件瞬间重置连续变量的值。这里将速度v重置为-e * pre(v),其中pre(v)表示事件发生前一瞬间的速度值,e是恢复系数。
3. 模型仿真与结果
- 仿真设置:在 MWORKS 中编译并运行该模型。设置仿真时长为 10 秒,并选择一个合适的求解器(如 DASSL)。
- 查看结果:仿真完成后,在结果视图中绘制
h和v的曲线。您将观察到:- 高度
h呈现一系列逐渐降低的抛物线,每次触底后反弹高度降低(若 e<1)。 - 速度
v在触底瞬间发生突变,从负值(向下)跳变为正值(向上),幅值按恢复系数缩小。
- 高度
MWORKS
通过这个简单示例,您已掌握了将连续动态与离散事件相结合的混合建模方法。这是 Modelica 在机电系统、电力电子等众多领域应用的基础。
第 5 页
第 6 页
第 7 页
第 8 页
第 9 页
第 10 页
第 11 页
第 12 页
2. Modelica语法概览
Modelica语言的核心在于其非因果建模(acausal modeling)范式——开发者只需描述物理系统的方程与结构,而不必预先指定输入与输出。这种声明式语法使得组件复用和系统集成变得极为高效。
基本语法单元
Modelica程序由类(class)构成,类是描述组件、模型、函数或连接器的基本容器。一个最简单的模型定义如下:
class HelloWorld
Real x(start = 1);
equation
der(x) = -x;
end HelloWorld;
Real声明连续实数变量,start指定初始猜测值。equation段书写物理方程,der(x)表示对时间的导数。- 类以
end关键字闭合。
方程与赋值
Modelica 中 = 在 equation 段内代表方程关系,而非赋值操作。例如:
equation
R*i = v;
表示电阻两端的电压 v 与电流 i 满足欧姆定律,系统求解器会同时解出两者。若在 algorithm 段内,则 := 表示顺序赋值。
连接机制
组件间的物理交互通过 connect 语句实现:
connect(pin1, pin2);
连接器(connector)通常包含 flow 与 potential 变量,例如 Pin 包含 v(电势)和 i(电流,标记为 flow)。连接时,电势相等,电流代数和为零。
继承与修改
Modelica 支持通过 extends 实现继承,并通过 modification 修改父类参数:
model Resistor
extends TwoPin;
parameter Real R = 1;
equation
v = R*i;
end Resistor;
实例化时可直接修改参数:
Resistor R1(R = 100);
关键语法特性总结
声明式:方程顺序无关,求解器自动处理因果。
强类型:Real、Integer、Boolean、String为基本类型,支持数组与记录。
可复用的组件化:通过model、block、function、record等关键词组织层次结构。
开放接口:connector定义物理端口,flow与potential对自动满足守恒律。
示例:简单 RC 电路
model RC_Circuit
Resistor R(R = 10);
Capacitor C(C = 0.001);
VoltageSource V(V = 12);
Ground G;
equation
connect(V.p, R.p);
connect(R.n, C.p);
connect(C.n, V.n);
connect(V.n, G.p);
end RC_Circuit;
该模型无需指定求解顺序——编译器通过分析连接与方程自动生成微分代数方程组(DAE)。这正是 Modelica 语法设计的核心优势:模型即方程,结构即拓扑。