OpenModelica中的'when'和'if'之间的区别?
-
21-12-2019 - |
题
我是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;
解决方案
好吧,这是很多问题。让我试着回答这些问题:
之间有什么区别
when
和if
.A里面的问题
when
子句仅在条件表达式在when
子句变为活动状态。相比之下,方程内if
只要条件表达式保持为true,语句就为true。的目的是什么
foo
?可能是为了可视化。它对我可以看到的模型没有明显的影响。
为什么是
impact
列于when
条款。你所谓的问题之一 像这样的芝诺系统 是它将继续以越来越小的间隔无限期地反弹。我怀疑
impact
这里的标志是用来指示系统何时停止弹跳.这通常是通过检查以确保条件表达式来完成的h<=0.0
实际上变成了 错误 在某个时候。因为事件检测包括数值公差,在某些时候,反弹的高度永远不会超出公差范围,你需要检测到这一点,否则球永远不会再反弹,只是继续下降。(如果没有实际运行模拟并看到效果,很难解释)。什么是
,
在when
条款。考虑以下几点:
when {a, b} then
.问题是,如果你想拥有一个when
子句触发器a
或b
变得真实,你可能会认为你会把它写成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
.希望这些解释有所帮助。