1

我试图理解离散信号的 Modelica 语义。给定一个在 t = 0.5 处以无限斜率瞬时从 0.0 过渡到 1.0 的阶跃信号。然后假设您还有一个 when 语句,如下面的代码所示:

model test_discrete
  Modelica.Blocks.Interfaces.RealOutput q(start = -1.0);
  Modelica.Blocks.Sources.Step step(
    height=1,
    offset=0,
    startTime=0.5)

algorithm 
  when time >= 0.5 and time <= 0.5 then
    q := step.y;
  end when;
equation 
end test_discrete;

我的问题是 q 是 0.0 还是 1.0?让我们假设 q 被初始化为 -1。当我实现代码时,它会转换为 1.0,但我的困惑是 0.0 也会满足等式。所以我只是想知道是否有任何规则可以防止非决定性行为。如果有人可以帮助或指出我的任何文献,那将不胜感激!谢谢你的时间。

4

2 回答 2

1

好吧,一些评论。首先,您的代码是不确定的。对于没有通过共同的“原因”以某种方式相互联系的事件的顺序,没有任何保证。Modelica 3.3 中有一些功能可以使您的系统同步(消除歧义)。但是您必须为此阅读规范。

但我还想指出您的代码中本质上是什么错误。你说:

when time >= 0.5 and time <= 0.5 then
  q := step.y;
end when;

我的猜测是,您正在尝试将值设置为设置q的相同“即时” step.y(然后进一步想知道哪个首先得到解决)。但这不是when声明的工作方式。我怀疑您正在尝试step.y将设置为的“即时”表示为time >= 0.5 and time <= 0.5. 但这是不正确的。它被设置的那一刻是time >= 0.5孤独的。这里的关键点when是不一样if

更正式地说,当与子句关联的条件为真when,when 子句中的等式变为活动状态。这确实超出了您的问题范围,但是您应该熟悉 和 之间的区别whenif因为这是非常重要的语义。

于 2013-08-05T00:57:54.343 回答
0

我的直觉告诉我,你可能需要一个 pre() 来满足条件,但这只是我的猜测。

于 2013-08-02T20:59:19.750 回答