4

我是 OpenModelica 的新手,我对与软件一起作为示例代码分发的“BouncingBall.mo”的代码有几个问题。

1) 'when''if'和有什么不一样?

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

3)在第(15)行 - “当 {h <= 0.0 and v <= 0.0,impact}”时, 'when'的表达式不应该足够“{h <= 0.0 and 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;
4

1 回答 1

8

好的,这是相当多的问题。让我试着回答他们:

  1. when和有什么区别if

    子句中的问题仅在子句中使用的条件表达式变为活动when时才“活动” 。when相反,if只要条件表达式为真,语句中的等式就为真。

  2. 的目的是foo什么?

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

  3. 为什么在子句中impact列出。when

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

  4. 子句中的,做什么。when

    考虑以下几点:when {a, b} then. 问题是,如果您想在or 或为 truewhen时触发子句,您可能会认为您会将其编写为. 但这不正确,因为这只会在一个变为真时触发。为了更好地了解这一点,请考虑以下代码:abwhen a or b then

    a = 时间>1.0;
    b = 时间>2.0;
    当 {a, b} 那么
      // 方程组 1
    什么时候结束;
    当 a 或 b 然后
      // 方程组 2
    什么时候结束;

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

这些是关于when. 希望这些解释有所帮助。

于 2013-11-16T22:50:31.463 回答