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 の目的ではありません。後者の場合、あなたは正しい軌道に乗っています...

後者を仮定すると、あなたの主な誤解は方程式のセマンティクスに関するものと思われます。の 1 つの値から開始すると想定しているように見えますu。次に、その値を に「再割り当て」しますmin(u,p)。次に、最後に、yこの「再割り当てされた」値 に割り当てますu

モデルにセクションがあれば、それで問題ありません。algorithmこれは、algorithmセクションに代入セマンティクスがあるためです (これは、ほとんどのプログラミング言語での「命令型」セマンティクスです)。

しかし、方程式セクションがあります。方程式セクションについてのことは、あなたが書いたステートメントが方程式であるということです。方程式の重要な点は、それらが常に適用されるということです。したがって、あなたのモデルでは、それを述べていu=min(u,p)ます。これは の値を「上書き」するのではなくu、追加の数学的制約を示しています。方程式を解こうとするのと少し似ていますx=x*x。この方程式をモデルに入れると、方程式を満たすことができるx=0唯一の値であるため、と言うのと同じです。x

myBlockモデルを見ると、1 つの入力と 1 つの出力があるため、方程式が多すぎるというエラーが発生します。つまり、計算する「未知数」が 1 つしかないため、必要な式は 1 つだけです。2 つの方程式を指定しました (1 つが多すぎます)。

あなたが望むのは次のとおりだと思います:

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 に答える