Modelica语法详解vunknown

Modelica语法详解

版本 unknown · 22 节

第 1 页


第 2 页


第 3 页


弹跳小球:Modelica 离散事件与混合建模入门

本教程通过一个经典的“弹跳小球”示例,介绍如何在 MWORKS 中使用 Modelica 语言对具有离散事件(如碰撞)的混合系统进行建模。该模型将展示连续物理行为(重力作用下的运动)与离散状态变化(与地面碰撞时速度反向)的结合。

1. 模型物理原理

弹跳小球模型描述了一个在重力场中运动的质点,当其位移(高度)降至零时,与地面发生完全弹性碰撞,速度立即反向。其连续动态由常微分方程描述,而碰撞事件则触发状态的瞬时重置。

核心概念when 语句用于定义仅在特定条件(事件)发生时执行的代码,是实现离散行为的关键。

2. 在 MWORKS 中构建模型

  1. 新建 Modelica 模型:在 MWORKS 的建模视图中,创建一个新的 Modelica 包或模型文件,命名为 BouncingBall

  2. 声明变量和参数:在 modelend 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 属性设置初始值。
  3. 编写方程部分:在 equation 部分描述系统的动态行为和事件。

    equation
      der(h) = v;
      der(v) = -g;
    
      when h <= 0.0 then
        reinit(v, -e * pre(v));
      end when;
    
    end BouncingBall;
    
    • der(h) = vder(v) = -g 定义了小球在空中的连续运动规律。
    • when h <= 0.0 then 定义了一个事件:当高度 h 下降到小于等于 0 时触发。
    • reinit(v, -e * pre(v)) 是事件触发时的核心操作。reinit 用于在事件瞬间重置连续变量的值。这里将速度 v 重置为 -e * pre(v),其中 pre(v) 表示事件发生前一瞬间的速度值,e 是恢复系数。

3. 模型仿真与结果

  1. 仿真设置:在 MWORKS 中编译并运行该模型。设置仿真时长为 10 秒,并选择一个合适的求解器(如 DASSL)。
  2. 查看结果:仿真完成后,在结果视图中绘制 hv 的曲线。您将观察到:
    • 高度 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)通常包含 flowpotential 变量,例如 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);

关键语法特性总结

声明式:方程顺序无关,求解器自动处理因果。
强类型RealIntegerBooleanString 为基本类型,支持数组与记录。
可复用的组件化:通过 modelblockfunctionrecord 等关键词组织层次结构。
开放接口connector 定义物理端口,flowpotential 对自动满足守恒律。

示例:简单 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 语法设计的核心优势:模型即方程,结构即拓扑


第 14 页


第 15 页


第 16 页


第 17 页


第 18 页


第 19 页


第 20 页


第 21 页


第 22 页