3. 仿真模型基础

在 SysML 与仿真模型协同工程中,模型能否被正确“执行”,取决于它采用哪种仿真范式。仿真范式不是软件菜单里的一个选项,而是对系统时间行为、状态更新方式和求解机制的约定。选错范式,模型可能能编译、能运行,却给出物理上无意义的结果。本节从连续时间、离散事件、混合系统三类范式出发,说明它们各自的状态演化规律,并落到 Modelica、Simulink、FMI 三种常见技术的分工与协同方式上。

一、三类仿真范式的本质区别

连续时间仿真假设系统状态随时间连续变化,用微分方程或微分代数方程描述。典型对象是电路、机械传动、热传导、流体回路。其核心是求解器对状态变量积分:给定状态初值 x(t0) 和导数 dx/dt = f(x, u, t),求解器按步长推进。步长可以是固定的,也可以由误差控制自适应变化。连续仿真的关键参数是求解器类型(如显式/隐式)、相对容差、绝对容差和初始步长。容差过松会掩盖快速动态,过紧则显著增加计算量。

离散事件仿真假设系统状态只在离散时刻发生跳变,事件之间状态保持不变。典型对象是排队系统、生产调度、通信协议、任务状态机。其核心是事件调度:维护一个按时间排序的事件队列,每次取出最早事件,推进仿真时钟到该时刻,执行事件处理并可能产生新事件。离散事件仿真不关心事件之间的“连续过程”,而关心事件发生的顺序、时刻和条件。关键参数是事件优先级、同时事件的确定性处理规则,以及随机分布的种子。

混合系统仿真同时包含连续动态和离散跳变,是工程系统最常见的形态。例如一个温控系统:加热器功率连续变化,但恒温器在温度越过阈值时触发开关跳变。混合仿真的难点在于事件检测与状态重置:求解器必须识别连续变量何时穿越阈值(零交叉检测),在穿越点暂停积分、执行离散动作、重置状态,再继续积分。若事件检测不准确,会出现“错过跳变”或“反复穿越”的数值抖动。

三类仿真范式的状态演化与求解机制 连续时间仿真 dx/dt = f(x, u, t) 状态连续变化,求解器积分推进 关键:容差、步长、刚性选择 离散事件仿真 事件队列驱动,状态跳变 关键:事件优先级、同时事件规则 混合系统仿真 连续积分 + 离散跳变 关键:零交叉检测、状态重置 常见技术对范式的支持与协同路径 Modelica 方程级建模,非因果 天然支持连续 + 混合 事件用 when/if 表达 工具:OpenModelica / Dymola Simulink 框图级建模,因果信号流 连续/离散/混合均可 Stateflow 表达离散逻辑 求解器:ode45 / ode15s 等 FMI / FMU 模型交换与协同仿真接口 ME:暴露方程,主求解 CS:自带求解器,步进 跨工具集成的事实标准 导出 封装

二、Modelica:方程级、非因果的混合建模

Modelica 的核心特征是“方程建模、非因果”。建模者写的是 v = R*i、m*der(v) = F 这样的等式,而不是赋值语句。工具在编译期通过符号处理决定哪些变量是状态、哪些是代数变量,并完成方程排序。这使同一个电阻模型既能用于计算电流,也能用于反推电压,复用性远高于因果框图。

Modelica 对混合系统的支持体现在事件机制上。例如一个理想开关可以用 if 表达式描述:

model Thermostat
  Real T(start = 20);
  Boolean heating;
equation
  heating = T < 22;
  der(T) = if heating then 0.5 else -0.2;
  when T > 24 then
    reinit(T, 24);
  end when;
end Thermostat;

这里 heating 是离散布尔量,der(T) 根据它切换。当温度越过 24 时,when 触发 reinit 重置状态。仿真时工具会自动检测 T > 24 的零交叉点,在穿越处暂停并执行重置。需要注意的是,when 条件只在事件瞬间为真时执行一次,不会持续触发,这与 if 的连续判断有本质区别。

三、Simulink:因果框图与求解器配置

Simulink 采用因果信号流建模,模块有明确的输入输出方向。连续部分用积分器模块表达,离散部分用单位延迟、零阶保持器表达,离散逻辑可用 Stateflow 状态机描述。Simulink 的求解器选择直接影响混合仿真的正确性:

  • ode45:显式变步长,适合非刚性连续系统,遇到频繁事件时效率下降。
  • ode15s:隐式变步长,适合刚性系统,如包含快慢时间尺度的热-电耦合模型。
  • ode1/ode4:定步长,适合需要与离散控制器严格同步的实时或代码生成场景。

混合仿真中还需设置“过零检测”选项。若关闭过零检测,求解器可能直接跨过阈值,导致开关动作丢失。一个实用的检查方法是:把阈值附近的连续变量记录下来,确认仿真轨迹在阈值处确实发生了方向改变,而不是平滑穿过。

四、FMI:跨工具协同的接口标准

FMI(Functional Mock-up Interface)解决的是“不同工具建的模型如何一起仿真”。它定义了两类接口:

类型含义求解器归属典型用途
FMI for Model Exchange (ME)导出方程,不带走求解器导入方主求解器需要统一求解、紧耦合的系统
FMI for Co-Simulation (CS)导出模型 + 自带求解器导出方自带工具封装、松耦合协同

CS 模式下,主仿真器在每个通信步长调用 FMU 的 doStep,FMU 内部用自己的求解器推进到该步长末尾,再交换输入输出。通信步长是协同仿真的关键参数:步长过大,耦合变量在步内被冻结,可能引入能量不守恒或数值不稳定;步长过小,则调用开销上升。工程上常从系统最快时间常数的 1/10 到 1/20 起步,再通过步长减半对比结果是否收敛来确定。

判断协同仿真是否可信的一个实用方法:把通信步长减半再跑一次,若关键输出曲线的最大偏差小于设定阈值(例如 1%),可认为步长已足够小;若偏差明显,说明耦合过强或步长过大,需要改用 ME 模式或减小步长。

五、范式选择与协同建模的落地建议

面对一个具体系统,可以按以下顺序判断:先看状态是否连续变化,若是则用连续范式;再看是否存在只在特定时刻发生的逻辑跳变,若有则升级为混合;若系统本质是排队、调度、协议交互,状态在事件间不变,则用离散事件。SysML 侧的状态机图、活动图适合描述离散逻辑和事件顺序,而参数图、约束块适合描述连续方程,两者通过 FMI 或工具原生接口对接。

实际协同中,建议把连续物理模型封装为 FMU,把离散控制逻辑保留在 SysML 状态机或 Simulink Stateflow 中,由主仿真器统一调度。这样既保留了各工具的专业能力,又通过标准接口控制了集成复杂度。需要强调的是,无论采用哪种范式,都应先明确时间基准、单位制和事件优先级约定,否则跨工具协同极易出现“时间对不齐、单位不一致、事件顺序不确定”三类问题。