OpenModelica中'when'和'if'之间的区别?

时间:2013-11-16 08:05:26

标签: if-statement modeling modelica openmodelica

我是OpenModelica的新手,我对“BouncingBall.mo”的代码提出了一些问题,该代码随软件一起发布,作为示例代码。

1)'时'与之间的有什么区别?

2)代码中变量'foo'的目的是什么?

3)在第(15)行 - “当{h <= 0.0且v <= 0.0,冲击}”时,不应该是'表达式时' 足够“{h&lt; = 0.0和v&lt; = 0.0}”因为当影响发生时会变为 TRUE 的目的是什么>影响(对我来说这是多余的)以及影响之前的逗号()是什么意思?

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;

1 个答案:

答案 0 :(得分:5)

好的,那是很多问题。让我试着回答一下:

  1. whenif之间有什么区别。

    when条款中的问题仅为&#34;有效&#34;在when子句中使用的条件表达式变为活动状态的瞬间。相反,只要条件表达式保持为真,if语句中的方程式就为真。

  2. foo的目的是什么?

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

  3. 为什么impact条款中列出了when

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

  4. ,条款中when做了什么。

    请考虑以下事项:when {a, b} then。问题是,如果您希望在whena成为真时触发b子句,您可能会认为您将其写为when a or b then。但这不正确,因为只有当第一个变为真时才会触发。要更好地了解这一点,请考虑以下代码:

  5.     a = time>1.0;
        b = time>2.0;
        when {a, b} then
          // Equation set 1
        end when;
        when a or b then
          // Equation set 2
        end when;
    

    因此,方程组1将在此处执行两次,因为它将在a变为真时执行,然后在b变为真时再次执行。但是当a变为真时,方程组2才会执行一次。这是因为整个表达式a or b只在一瞬间变为真。

    这些是关于when的常见混淆点。希望这些解释有所帮助。