我是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;
答案 0 :(得分:5)
好的,那是很多问题。让我试着回答一下:
when
和if
之间有什么区别。
when
条款中的问题仅为&#34;有效&#34;在when
子句中使用的条件表达式变为活动状态的瞬间。相反,只要条件表达式保持为真,if
语句中的方程式就为真。
foo
的目的是什么?
可能用于可视化。它对我能看到的模型没有明显的影响。
为什么impact
条款中列出了when
。
你所谓的Zeno systems like this所遇到的一个问题是,它会以越来越小的间隔无限期地反弹。我怀疑这里的impact
标志是为了表明系统何时停止弹跳。这通常通过检查以确保条件表达式h<=0.0
在某个时刻实际上变为 false 来完成。因为事件检测包括数值公差,所以在某些时候弹跳的高度永远不会超出公差范围,你需要检测到这一点,否则球永远不会反弹而只是继续下降。 (如果没有实际运行模拟并看到效果,很难解释。)
,
条款中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
变为真时再次执行。但是当a
变为真时,方程组2才会执行一次。这是因为整个表达式a or b
只在一瞬间变为真。
这些是关于when
的常见混淆点。希望这些解释有所帮助。