OpenModelica中“ when”和“ if”之间的区别?

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)

Mic*_*ler 6

好,那是很多问题。让我尝试回答他们:

  1. when和之间有什么区别if

    when子句中的问题仅在该when子句中使用的条件表达式变为活动状态时才是“活动的” 。相反,if只要条件表达式为真,则语句内的方程式为真。

  2. 目的是foo什么?

    可能是可视化的。它对我可以看到的模型没有明显的影响。

  3. 为什么impactwhen子句中列出。

    这样的所谓Zeno系统的问题之一是,它会以越来越小的间隔无限期地继续弹跳。我怀疑impact这里的标志是用来指示系统何时停止反弹。通常通过检查以确保条件表达式在某些时候h<=0.0实际上变为来完成此操作。因为事件检测包括数值公差,所以在某些时候反弹的高度永远不会超出公差范围,因此您需要检测到这一点,否则球就不会再反弹并且只会继续下降。(如果不实际运行模拟并看到效果,很难解释)。

  4. ,when子句中的功能是什么。

    请考虑以下内容:when {a, b} then。事实是,如果您想让一个when子句在ab变为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。希望这些解释有所帮助。