modelica - 处理方程部分的 if 情况

标签 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”的值,“b”的值是在 if 语句中确定的。

最佳答案

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

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

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

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

我知道这听起来很令人困惑,但如果您接受这个“隐藏 bool 变量”概念并理解它不会改变,直到 Modelica 运行时可以明确识别应该发生更改的点(基于某些候选解决方案轨迹) ),这一切都是有道理的。

希望对您有所帮助。

关于modelica - 处理方程部分的 if 情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21208423/

相关文章:

modelica - Dymola:为什么选择哪种集成方法

plot - 如何在 OMEdit 中模拟后自动绘制一组特定值?

arrays - Modelica mos 脚本中数组大小的预分配

modelica - 将模型实例化为参数时的固定属性

modelica - 如何消除 Dymola/Modelica 中的死代码

multithreading - Dymola 中的多线程使用会降低求解速度

python - 如何使用 OMPython 在 Python 中调用 OpenModelica 模型?

modelica - 将 ClaRaLib 与 OMEdit 一起使用

physics - Modelica 中的七体机构

fluid - ValveLinear 模型 Modelica 标准库 - 工作原理