0

以下构造会生成一个错误,指出方程太多。

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...) 的赋值似乎对所有组件都是强制性的,并且不能一个接一个地计算。

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

4

1 回答 1

1

我不完全理解这个模型的意图。我不清楚您是否希望u随着时间的推移找到所有值的最小值,或者只是找到uvs.的当前值p?如果是前者,那么这不是 min 的用途。如果是后者,那么你就在正确的轨道上......

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

如果您的模型中有一个algorithm部分,那一切都会好起来的。这是因为一个algorithm部分具有赋值语义(这是大多数编程语言中的“命令式”语义)。

但是你有一个方程部分。关于方程式部分的事情是您编写的语句是方程式。方程式的重要之处在于它们始终适用。因此,在您的模型中,您已声明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;

请注意行为应该是相同的(尽管我承认我没有测试任何一个模型)。

我希望这会有所帮助。

于 2012-08-19T09:16:54.500 回答