我想知道如何在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语句中确定的。
答案 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运行时能够明确地确定应该发生变化的点(基于一些候选解决方案轨迹) ),这一切都有道理。
我希望有所帮助。