Modelica中含sample函数的if分支方程未执行原因咨询
Modelica代码问题分析及解决
根本原因
你代码里的问题出在用if语句直接在equation段处理离散事件,这不符合Modelica的语义规范:
sample(0, 2)仅在时间点0、2、4…这些离散时刻返回true,其余时刻均为false。- Modelica的equation段中,
if语句是用于选择连续方程分支的,不是处理离散事件触发的赋值。仿真器在连续仿真过程中,不会主动识别sample触发的离散时刻来切换方程分支,导致绝大多数时间里not sample(...)为true,a = 1的方程持续生效,采样时刻的a = 3从未被执行。
修正方案
要实现离散事件触发的变量切换,应该用Modelica的when语句,它专门用于响应离散事件(比如sample触发的时刻):
model Model134 Real a(start = 0); discrete Boolean toggle(start = false); // 记录切换状态 equation // 每2秒触发一次状态切换 when sample(0, 2) then toggle = not toggle; end when; // 根据状态变量设置a的值 a = if toggle then 3 else 1; end Model134;
这段代码会在0、2、4…时刻切换toggle的布尔值,进而让a在1和3之间交替变化,符合你预期的每2秒切换的效果。
内容的提问来源于stack exchange,提问作者josh jia
相关产品推荐
相关产品推荐

