我试图建立一个模型,将有基于是否某些组件不存在(在我的情况下,流体端口)略有不同的方程。
像下图的代码将无法正常工作:
parameter Boolean use_component=false;
Component component if use_component;
equation
if use_component then
component.x = 0;
end if;
我怎样才能解决此问题?
我试图建立一个模型,将有基于是否某些组件不存在(在我的情况下,流体端口)略有不同的方程。
像下图的代码将无法正常工作:
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
或者两者同时存在或都不存在。 那是因为你让他们连接到相同的布尔变量。 但是,如果你有没有这样的:
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
,即
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
),你得出的结论,他们没有将工作。 如果是这样的话,那么我会谦卑地建议你与你是如何设计的组件中的问题。 这些限制产生的原因涉及到需要自己的正确性检查的部件。 这就要求该部件是完整的(在本说明书中的术语“平衡”)。
如果你不能用的方法解决这个问题我上面提到的,那么我怀疑你真的有一个平衡的问题,你可能需要以某种方式重新定义组件的边界。 如果是这样的话,我建议你在这里打开另一个问题与你正在尝试做的细节。
我想,为什么这是行不通的原因是,解析器将寻找变量“component.x”,如果组件不活跃,不存在的声明。 它如果您在注释中插入“评估=真正的”甚至不工作。 在我看来,干净的解决方案是在一级方程式在同一块工作,使不同组方程。 您可以创建正确的连接器和paramenters的包装模型,然后如果是例如因果模型,你可以使用可更换类,以参数化模型作为功能,否则,在非因果模型的情况下,把公式里面if语句。 另一种可能的解决方法是将一个块内两个不同的模式,这样你就可以用自己的变量进入方程部分,然后建立条件的连接,使与已选定的行为块的使用情况。 换句话说,你可以建立一个“包模式”里面有两大块,然后将连接方程来里面的if语句包裹型号的连接器。 记住建立起来的模型,这样会有quations的一贯制甚至对未使用的块。 但是,这不是最好的解决办法,因为如果块大,你将不得不等待更长的时间进行编译,因为一切都将被编译。
我希望这个能帮上忙,
马尔科
您也可以哑分量,是不是在图形层可见:
connector DummyHeatPort
"Dummy heatport to facilitate optional heatport. Use this with a conditional heatport by connecting it to the heatport. Then use the -DummyHeatPort.Q_flow in the thermal energy balance."
Modelica.SIunits.Temperature T "Port temperature";
flow Modelica.SIunits.HeatFlowRate Q_flow
"Heat flow rate (positive if flowing from outside into the component)";
end DummyHeatPort;
然后,当这两个端口模型被使用
Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatport if use_heat_port;
DummyHeatPort dummy_heatport;
...
equation
flowport_a.H_flow + flowport_b.H_flow - dummy_heatport.Q_flow = storage
"thermal energy balance";
connect(dummy_heatport, heatport);
这样,如果目前heatport被使用,但不以其他方式导致错误。