OpenModelica中如何在输出达到特定值时终止仿真?
OpenModelica中实现变量阈值触发即时终止仿真的方案
你的问题核心是让仿真在变量达到阈值时立即终止,而非运行到预设时长,原代码的问题在于用break跳出循环后,通过when语句触发terminate的时机不对,导致仿真没有即时停止。下面是正确的实现方式:
问题根源
原代码里,顶层algorithm块的代码仅在初始化阶段执行一次:当prod[i]≥12时,break跳出循环并设置test_case=true,但when语句要等初始化阶段结束后才处理事件,此时仿真器已经开始后续的仿真步,所以会继续运行到设定的5秒,未赋值的prod元素也会默认填充为0。
正确实现方案
直接在判断条件满足时调用terminate()函数,无需额外的布尔变量和when语句。terminate()是Modelica的内置函数,调用后会立即终止仿真,不会执行后续代码。
修改后的代码
model ForLoopExample Real A[5] = {1,2,3,4,5}; Real B[5] = {2,3,4,5,6}; // 给prod设置初始值为NaN,未计算的元素会保持无效值,绘图时不会显示 Real prod[5](start=NaN); algorithm for i in 1:size(A,1) loop prod[i] := A[i]*B[i]; // 满足阈值时直接终止仿真 if prod[i] >= 12 then terminate("product above 12"); end if; end for; end ForLoopExample;
效果说明
- 当计算到
i=3时,prod[3]=3*4=12,触发terminate(),仿真会立即停止,不会继续执行循环的后续迭代,也不会运行到预设的5秒时长。 - 未被计算的
prod[4]、prod[5]会保持初始值NaN,绘图工具通常会自动忽略NaN值,不会显示这些无效点。
如果需要逐次计算(而非一次性完成循环),也可以用事件驱动的方式分步执行,比如用索引变量跟踪计算进度,每次事件触发计算一个元素并检查阈值,实现逻辑类似,但上述方案更直接简洁,适合你的需求。
内容的提问来源于stack exchange,提问作者kunal
相关产品推荐
相关产品推荐

