以下构造生成错误,表示方程式太多。
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 ...)的分配似乎对所有组件都是强制性的,不能一个接一个地计算。
知道如何解决这个问题吗?感谢。
答案 0 :(得分:1)
我不完全理解这个模型的意图。我不清楚您是否希望找到所有u
值随时间变化的最小值或仅u
与p
的当前值?如果是前者,那么那不是什么分钟。如果是后者,那么你就在正确的轨道上......
假设后者,那么你的主要误解似乎是关于方程的语义。在我看来,你假设你从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;
注意行为应该是相同的(虽然我承认我没有测试任何一种模型)。
我希望有所帮助。