Modelica - 将传输变量的最小值(最大值)设置为一行中的多个组件

时间:2012-08-18 19:54:08

标签: 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;

    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(= min ...)的分配似乎对所有组件都是强制性的,不能一个接一个地计算。

知道如何解决这个问题吗?感谢。

1 个答案:

答案 0 :(得分:1)

我不完全理解这个模型的意图。我不清楚您是否希望找到所有u值随时间变化的最小值或仅up的当前值?如果是前者,那么那不是什么分钟。如果是后者,那么你就在正确的轨道上......

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

如果你的模型中有algorithm部分,那么

。这是因为algorithm部分具有赋值语义(这是大多数编程语言中的"命令式和#34;语义)。

但你有一个方程式部分。关于方程式部分的事情是你写的语句是方程式。方程式的重要之处在于它们始终适用。所以在你的模型中你已经说过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。那是你想要的吗?

或者,您可以使用algorithm部分编写模型并获得以下内容:

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;

注意行为应该是相同的(虽然我承认我没有测试任何一种模型)。

我希望有所帮助。