Modelica-设置一条线路中多个组件上传输变量的最小值(最大值)

Modelica-设置一条线路中多个组件上传输变量的最小值(最大值),modelica,Modelica,下面的构造生成一个错误,表示方程太多 model Model1 model myBlock input Modelica.Blocks.Interfaces.RealInput u(start=1e99); output Modelica.Blocks.Interfaces.RealOutput y; parameter Real p=1 "Parameter"; equation u=min(u,p); u=y; end myBlock;

下面的构造生成一个错误,表示方程太多

model Model1

model myBlock
input Modelica.Blocks.Interfaces.RealInput u(start=1e99);
output Modelica.Blocks.Interfaces.RealOutput y;
parameter Real p=1 "Parameter";
equation
            u=min(u,p);
            u=y;
end myBlock;

    myBlock b1; 
    myBlock b2 (p=0.5);
    myBlock b3;
    input Modelica.Blocks.Interfaces.RealInput u;
    output Modelica.Blocks.Interfaces.RealOutput y;
equation
    connect(y,b1.u);
    connect(b1.y,b2.u);
    connect(b2.y,b3.u);
    connect(b3.y,u);
end Model1;
其思想是在所有“myBlock”组件中为u和y获得相同的最小值。 然而,u(=最小…)的赋值似乎对所有组件都必须有效,并且不能逐个计算


你知道我怎样才能解决这个问题吗?谢谢。

我不完全理解这个模型的意图。我不清楚您是否希望在一段时间内找到所有
u
值的最小值,还是只找到
u
p
的当前值?如果是前者,那么这不是min的目的。如果是后者,那么你是在正确的轨道上

假设是后者,那么你的主要误解似乎是关于方程的语义。在我看来,您似乎假设从一个值
u
开始。然后将该值“重新指定”为
min(u,p)
。然后,最后,将
y
分配给
u
的这个“重新分配”值

如果您的模型中有一个
算法
部分,所有这些都可以。这是因为
算法
部分具有赋值语义(这是大多数编程语言中的“命令式”语义)

但是你有一个等式部分。关于等式部分,你写的语句是等式。关于方程,最重要的是它们总是适用的。因此,在您的模型中,您已经声明
u=min(u,p)
。这不是“覆盖”u的值,而是说明了一个额外的数学约束。这有点像试图解方程
x=x*x
。如果你把这个方程放在你的模型中,它相当于说
x=0
,因为这是
x
中唯一能满足方程的值

因此,关于太多方程的错误来了,因为如果你看一下你的
myBlock
模型,它有一个输入和一个输出。这意味着它只有一个“未知”要计算,因此只需要一个方程。你已经给出了两个等式(一个太多了)

我想你想要的是:

model myBlock
  input Modelica.Blocks.Interfaces.RealInput u;
  output Modelica.Blocks.Interfaces.RealOutput y;
  parameter Real p;
equation
  y = min(u,p);
end myBlock;
这将“限制”输出
y
,使其不小于
p
。这就是你想要的吗

或者,您可以使用
算法
部分编写模型,并得到如下结果:

model myBlock
  input Modelica.Blocks.Interfaces.RealInput u;
  output Modelica.Blocks.Interfaces.RealOutput y;
  parameter Real p;
algorithm
  u := min(u,p) "This is assignment";
  y := u;
end myBlock;
注意,行为应该是相同的(尽管我承认我没有测试任何一个模型)


我希望这会有帮助。

谢谢你,Michael,使用算法部分而不是等式一有助于消除错误。然而,这并没有解决我的问题。我试图做的是根据入口和出口之间的压差计算管道(阀门、配件等)每个部件中可能的最大流量。总体流量将是所有单个最大流量中最小的。您可能会说这不是Modelica的工作方式,但我现在挣扎了几个星期,试图理解经典解决方案,但没有结果。回到最初的问题,一个好的解决方案是这样的陈述:嗯……这有帮助吗:假设你已经计算了5个潜在流量:u1、u2、u3、u4和u5。您希望实际流量u是所有这些流量中的最小值。你可以说
u=min({u1,u2,u3,u4,u5})
。这有用吗?我还是不确定我是否理解你的目标。我建议你更新你的问题(或者用你更广泛的问题开始一个新问题),而不是评论我的解决方案。