Sal*_*mat 3 modeling if-statement modelica openmodelica
我是OpenModelica的新手,并且对与软件一起作为示例代码分发的'BouncingBall.mo'的代码有一些疑问。
1)“何时”和“如果”之间有什么区别?
2)代码中的变量“ foo”的目的是什么?
3)在第(15)行中- “当{h <= 0.0且v <= 0.0,impact}时”,“ when”的表达式不应为“ {h <= 0.0且v <= 0.0}” “因为这个变得真当碰撞发生时,有什么目的的影响(对我来说它的冗余这里)的,什么是逗号(,)之前影响的手段?
model BouncingBall
parameter Real e = 0.7 "coefficient of restitution";
parameter Real g = 9.81 "gravity acceleration";
Real h(start = 1) "height of ball";
Real v "velocity of ball";
Boolean flying(start = true) "true, if ball is flying";
Boolean impact;
Real v_new;
Integer foo;
equation
impact = h <= 0.0;
foo = if impact then 1 else 2;
der(v) = if flying then -g else 0;
der(h) = v;
when {h <= 0.0 and v <= 0.0,impact} then
v_new = if edge(impact) then -e * pre(v) else 0;
flying = v_new > 0;
reinit(v, v_new);
end when;
end BouncingBall;
Run Code Online (Sandbox Code Playgroud)
好,那是很多问题。让我尝试回答他们:
when和之间有什么区别if。
when子句中的问题仅在该when子句中使用的条件表达式变为活动状态时才是“活动的” 。相反,if只要条件表达式为真,则语句内的方程式为真。
目的是foo什么?
可能是可视化的。它对我可以看到的模型没有明显的影响。
为什么impact在when子句中列出。
这样的所谓Zeno系统的问题之一是,它会以越来越小的间隔无限期地继续弹跳。我怀疑impact这里的标志是用来指示系统何时停止反弹。通常通过检查以确保条件表达式在某些时候h<=0.0实际上变为假来完成此操作。因为事件检测包括数值公差,所以在某些时候反弹的高度永远不会超出公差范围,因此您需要检测到这一点,否则球就不会再反弹并且只会继续下降。(如果不实际运行模拟并看到效果,很难解释)。
,该when子句中的功能是什么。
请考虑以下内容:when {a, b} then。事实是,如果您想让一个when子句在a或b变为true 时触发,您可能会认为您会将其写为when a or b then。但这是不正确的,因为这只会在第一个变为真时才触发。为了更好地了解这一点,请考虑以下代码:
a =时间> 1.0;
b =时间> 2.0;
当{a,b}然后
//方程组1
何时结束
当a或b时
//方程组2
何时结束
因此,这里的方程组1将执行两次,因为它将在a变为true 时执行,然后在b变为true 时再次执行。但是等式集2 在变为真时将只执行一次a。这是因为整个表达式a or b只在瞬间生效。
这些是关于的常见混淆点when。希望这些解释有所帮助。