我是OpenModelica的新手,我对'BouncingBall.mo这是与软件作为示例代码分发的。

1)有什么区别 '何时''如果'?

2)变量的目的是什么 'foo' 在密码里?

3)在线(15) - "当{h <=0.0和v <=0.0,影响}",,不应该表达为 '何时' 够了 "{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;
有帮助吗?

解决方案

好吧,这是很多问题。让我试着回答这些问题:

  1. 之间有什么区别 whenif.

    A里面的问题 when 子句仅在条件表达式在 when 子句变为活动状态。相比之下,方程内 if 只要条件表达式保持为true,语句就为true。

  2. 的目的是什么 foo?

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

  3. 为什么是 impact 列于 when 条款。

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

  4. 什么是 ,when 条款。

    考虑以下几点: when {a, b} then.问题是,如果你想拥有一个 when 子句触发器 ab 变得真实,你可能会认为你会把它写成 when a or b then.但这是不正确的,因为这只会在 第一个 一个成为现实。为了更好地看到这一点,请考虑以下代码:

    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 变得真实。但是方程集2只会被执行 一次 何时 a 变得真实。那是因为整个表达 a or b 只有在一个瞬间变得真实。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top