Yig*_*gal 7 conditional declaration modelica
我正在尝试建立一个模型,根据某些组件是否存在(在我的情况下,流体端口),这些模型的方程略有不同.
像下面这样的代码不起作用:
parameter Boolean use_component=false;
Component component if use_component;
equation
if use_component then
component.x = 0;
end if;
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
Mic*_*ler 10
如果要使用条件组件,则需要注意一些限制.Modelica 3.3规范的4.4.5节很好地总结了它.它说"如果条件为假,则组件,其修改器以及涉及组件的任何连接方程式都将被删除".我将在几秒钟内向您展示如何使用它来解决您的问题,但首先我要解释为什么您的解决方案不起作用.
问题与检查模型有关.在您的情况下,显然方程component.x和组件component既存在也不存在.那是因为你已将它们绑定到相同的布尔变量.但如果你不这样做怎么办:
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;
Run Code Online (Sandbox Code Playgroud)
我们可以看到这在逻辑上与您的情况完全相同.缺席component.x时没有机会component存在.但是,我们可以证明这样的事情,一般?没有.
因此,当引入条件组件时,实现了保守语义,这可以始终平凡地确保所涉及的变量和方程组永远不会"不同步".
让我们回到规范所说的内容:"如果条件为假,则删除组件,其修改器以及涉及组件的任何连接方程式"
对于您的情况,解决方案可能非常简单.根据您声明"x"的方式,您可以添加修改component,即
parameter Boolean use_component=false;
Component component(x=0) if use_component;
Run Code Online (Sandbox Code Playgroud)
其优雅之处在于修改仅适用于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);
Run Code Online (Sandbox Code Playgroud)
现在,我可以想象,在考虑了所有三种情况(修改,内化方程和使用connect)之后,你得出的结论是它们都不会起作用.如果是这种情况,那么我会谦虚地建议您在如何设计组件时遇到问题.出现这些限制的原因与必须自行检查组件的正确性有关.这要求组件完整(在规范的术语中"平衡").
如果你不能用我上面提到的方法解决问题,那么我怀疑你真的有一个平衡问题,你可能需要以某种方式重新定义组件的边界.如果是这种情况,我建议你在这里打开另一个问题,详细说明你要做什么.