如果在等式部分中使用了案例

时间:2014-01-18 18:51:10

标签: modelica dymola openmodelica

我想知道如何在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语句中确定的。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

我希望有所帮助。