在 if 语句中分配变量

时间:2021-05-25 16:59:55

标签: if-statement variable-assignment modelica

当我尝试在 if 语句的主体内分配变量 x 时,如果该变量也出现在 if 语句的条件中,我会得到意想不到的结果。

例如代码

model algorithmTest_25p05p2021


Real x(start=0);
Real y(start=0);

algorithm 

y := sin(time);
x := sin(time); 

if x < 0 then // replace with y < 0 --> x is correctly truncated
  x := 0;
end if;


end algorithmTest_25p05p2021;

导致 enter image description here

我在 OpenModelica 1.17.0 中使用 OMEdit,仿真时间 120 秒,最大步进时间 1 秒。 我无法理解这里发生的事情。

在我的理解中,算法部分意味着x被初始化为其起始值0。初始化后,我认为算法部分中的语句是按顺序执行的。因此,在 if 语句之前,x 被设置为 x=sin(time) 的值。 之后,我预计 if 语句会在 sin(time) < 0 时设置 x=0,如果 sin(time)>=0,则将 x 设为 x=sin(time)。

你会看到发生了什么:在条件第一次触发后,x 保持为零。

更让我困惑的是,用“y<0”条件替换“x<0”条件可以解决问题。

我在这里错过了什么?任何指向 Modelica 规范的指针?

编辑(27.05.2021): 由于这种行为似乎是 OpenModelica 1.17.0 中的一个错误,我将其发布在他们的 Github 上,请参阅 https://github.com/OpenModelica/OpenModelica/issues/7484

1 个答案:

答案 0 :(得分:2)

这一定是一个错误。

显然 x<0 应该有一个事件,但事件逻辑仅在 x 接近于零时才重要,因此应该对图形的影响最小。

我能找到的规范的相关部分是: