条件组件声明和以下 if 等式

标签 conditional declaration modelica

我正在尝试建立一个模型,该模型将根据是否存在某些组件(在我的情况下为流体端口)具有略微不同的方程。

如下代码将不起作用:

parameter Boolean use_component=false;
Component component if use_component;
equation
if use_component then
  component.x = 0;
end if;

我该如何解决这个问题?

最佳答案

如果要使用条件组件,则需要注意一些限制。 Modelica 3.3 规范的第 4.4.5 节很好地总结了它。它说“如果条件为假,则组件、其修饰符和任何连接方程
涉及组件,被删除”。我将在几秒钟内向您展示如何使用它来解决您的问题,但首先我想解释一下为什么您的解决方案不起作用。

这个问题与检查模型有关。在您的情况下,很明显等式 component.x和组件 component要么都存在,要么都不存在。那是因为您已将它们绑定(bind)到同一个 bool 变量。但是如果你没有这个怎么办:

parameter Real some_number;
Component component if some_number*some_number>4.0;
equation
if some_number>=-2 and some_number<=2 then
  component.x = 0;
end if;

我们可以看到这在逻辑上与您的情况相同。 component.x没有机会component 时存在缺席。但是我们能证明这样的事情吗一般 ?不。

因此,当引入条件组件时,实现了保守语义,它总是可以轻松确保所涉及的变量和方程组永远不会“不同步”。

让我们回到规范中所说的:“如果条件为假,则组件、其修饰符和任何连接方程
涉及组件,被删除”

对于您的情况,解决方案可能非常简单。根据您声明“x”的方式,您可以添加对 component 的修改。 , IE。
parameter Boolean use_component=false;
Component component(x=0) if use_component;

优雅之处在于修改仅适用于 component如果 component不存在,修改(方程式)也不存在。所以变量 x及其相关的方程式是“同步的”。但这并不适用于所有情况(IIRC,x 必须有一个 input 限定符才能工作......也许在你的情况下是可能的?)。

还有两个选择。首先,把方程 component.x里面 component .二是在component上介绍一个连接器如果已连接,它将生成您想要的方程式。与修改案例(这不是巧合)一样,您可以将 x 关联起来。使用某种输入连接器,然后执行以下操作:
parameter Boolean use_component;
Component component if use_component;
Constant zero(k=0);
equation
connect(k.y, component.x);

现在,我可以想象,在考虑了所有三种情况(修改、内化方程和使用 connect )之后,您得出的结论是它们都不起作用。如果是这种情况,那么我会谦虚地建议您对如何设计组件有疑问。出现这些限制的原因与必须自行检查组件的正确性有关。这要求组件是完整的(规范术语中的“平衡”)。

如果您无法使用我上面提到的方法解决问题,那么我怀疑您确实存在平衡问题,并且您可能需要以某种方式重新定义组件的边界。如果是这种情况,我建议您在此处打开另一个问题,详细说明您正在尝试做什么。

关于条件组件声明和以下 if 等式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14668468/

相关文章:

javascript - 对象/类内的函数声明

algorithm - Modelica 中简单随机数生成的分配问题

python - 在 if 中定义变量

fortran - 在 Fortran 90 中,是否不可能在新变量的声明语句中引用先前声明的变量?

c - 什么时候在将数组声明为指向数组的指针时分配内存

modelica - 在 Dymola/Modelica 中访问经过验证的函数库(例如贝塞尔函数)

modelica - 为什么 Modelica.Fluid-pipes 无法与我的介质配合使用?

python - 条件格式 xlwt

java - 在java中有条件地使用getType测试子类

powershell - Win10 Powershell - 简单的 If/Elseif 取决于条件顺序?