2

我想知道如何在 Modelica 中实现以下功能:

suppose variables a,b
Timetable object c

    equation
    if a>c.y then
      b = f(a) // with f a mathematical function
    else
      b = g(a) // with g a mathematical function
    end if;

    der(a) = h(a,b) //with h a mathematical function

Modelica 如何确定 if 语句的哪种情况为真?如果没有“b”的值,它就无法计算“a”的值,这是在 if 语句中确定的。

4

1 回答 1

4

首先,请注意a状态(至少基于您显示的方程式)。这意味着在当前时间a将是已知的。根据您的描述,c也是已知的(显然,它是时间的函数)。因此,在任何时间点,我们都知道if将采用语句的哪个分支。

所以对于任何给定的时间,我们都可以计算b,因此der(a)。真正的问题是语句中的条件在什么时候if发生变化。

答案是(由 Modelica 编译器)建立了一个“监视器”函数,当该监视器函数越过零时,Modelica 运行时将通过在该点停止集成然后重新启动集成(使用另一个分支)来做出反应。这是因为语句中的条件表达式if隐式生成事件。

另一种思考方式是,有一个“隐藏的”布尔变量指示我们是采用分支还是其他。起初,这听起来很疯狂,因为您假设 Modelica 运行时将根据是否采用分支,a>c.y但实际上并非如此。它所做的是根据模拟开始时的值确定布尔值的初始值,a>c.y然后尝试找出它何时实际发生变化。它并不是a>c.y一直都在评估。这会导致一个分支被执行的奇怪情况,即使它不应该执行。这将在 Modelica 中发生,并且与Modelica 运行时试图确定事件发生的位置时生成的候选解决方案有关。

我知道这听起来令人困惑,但如果你接受这个“隐藏的布尔变量”概念并理解它不会改变,直到 Modelica 运行时可以明确地确定应该发生变化的点(基于一些候选解决方案轨迹),它一切都说得通。

我希望这会有所帮助。

于 2014-01-18T22:11:19.933 回答