数ヶ月からModelicaを使用しても、私は継承や置換などの高度な機能を初めて習得しました。Modelica - モデルバリエーション(標準の1つ以上の複雑なもの)
私は標準モデル(すなわちプール)とより複雑なバリアント(すなわち、蒸発計算を含む)を持っています:2つのモデルは、私が "再利用"したい多くの共通部分を持っていますが、複雑なモデルにはより多くのパラメータ、変数、方程式(すなわち、空気や蒸気の性質や法則)が含まれています。私はそれを行うにはModelicaでいくつかの可能性を持っていると思う
:
- は(だけで同期していない素敵なコピー&ペーストテキスト機能を使用して)は、2つの独立したモデルを書き留めて - 私がいないことを好みます。
- 継承(1)を使用して、共通定義を持つ部分モデルと特定の部分を持つ2つの継承モデルを記述します。
- 異なる組の方程式(およびその他の特定の定義)を含む2つの部分モデルを作成し、共通定義を含む3つのモデルを作成し、2つの部分モデルの1つを継承する(ブールパラメータ)。実際には私はそれができるとは分かりません。部分モデルには、未定義の変数/パラメータ(継承モデルで定義されている)を持つ方程式が含まれています。
- 標準モデルを書き、新しい方程式を置き換え、追加の定義を追加します。
(2)で達成しました。以下の例1を参照してください。しかし、私は置換メカニズムの使い方を理解していません(例2の失敗した試みを見てください)。どこが間違っていますか?
以下の例は、私がそれを行う方法を理解しようと書いた簡略化されたモデルです。
例1
package Inherited_base
partial model Base
parameter Real a=1;
parameter Real b=2;
Real c;
Real d;
equation
c+d = b;
end Base;
model Variant_1
extends Base;
equation
c = time*a;
end Variant_1;
model Variant_2
extends Base;
parameter Real e=0.5;
Real d;
equation
c+d*e = time*a;
end Variant_2;
end Inherited_base;
例2
model Base
parameter Real a=1;
parameter Real b=2;
class Eqs
Real c;
Real d;
equation
c = time*a;
end Eqs;
equation
replaceble Eqs bouclage;
bouclage.c+bouclage.d = b;
end Base;
編集:私は弾丸3で私の質問に答えることを試みた:部分モデルの変数を/定義しながら、私はエラーメッセージを得ました方程式で使用されるパラメータはクラス内で定義されていません。私は私の考えを若干変更して問題を解決しました:私は両方のケースで同じ方程式を使用しましたが、ケースに応じて異なる変数/パラメータを考慮する用語(例では「余分」)がありました。ただし、展開するモデルをインタラクティブに選択することは不可能であるように見えます。ここでの例は誤っています(「if」はなく、「extend」は1つだけです)。
スコットGとハンス・オルソンの答え(あなたの両方に感謝!)の後に実施例3
package Inherited_variants
model Final
parameter Real a=1;
parameter Real b=2;
Real c;
Real d;
parameter Boolean complexmodel = false;
if complexmodel then
extends Variant_2;
else
extends Variant_1;
end if;
equation
c+d = b;
c+extra = time*a;
end Final;
partial model Variant_1
parameter Real extra=0;
end Variant_1;
partial model Variant_2
parameter Real e=0.5;
Real d;
Real extra;
equation
extra = d*e;
end Variant_2;
end Inherited_variants;
編集。 例は面白かったですが、私はまだあなたの例で "extends"を広く使用していると混乱していました。だから私はあなたのコードを簡素化しようとしたまたhereから何かを学んだ。
はスコットの例では、並び替え:
package Example
partial model FinalTerm
end FinalTerm;
model Final
model Variant_1
extends FinalTerm;
parameter Real extra=0;
end Variant_1;
parameter Real a=1;
parameter Real b=2;
Real c;
Real d;
replaceable model VarType = Variant_1 constrainedby FinalTerm annotation(choicesAllMatching=true);
//replaceable model VarType = Variant_1 constrainedby FinalTerm annotation(choices(choice=redeclare Variant_2 VarType,
// choice=redeclare Variant_1 VarType));
VarType varType;
equation
c+d = b;
c+varType.extra*d = time*a;
end Final;
model Variant_2
extends FinalTerm;
parameter Real e=0.5;
Real extra;
equation
extra = e;
end Variant_2;
end Example;
ハンスの例では、並び替え:私は理解何
package Example_2
partial model FinalTerm
end FinalTerm;
model Final
model Variant_1
extends FinalTerm;
parameter Real extra=0;
end Variant_1;
parameter Real a=1;
parameter Real b=2;
Real c;
Real d;
replaceable Variant_1 test constrainedby FinalTerm annotation(choicesAllMatching=true);
//replaceable Variant_1 test constrainedby FinalTerm annotation(choices(choice=redeclare Variant_2 test "NEW",
// choice=redeclare Variant_1 test "OLD"));
equation
c+d = b;
c+test.extra*d = time*a;
end Final;
model Variant_2
extends FinalTerm;
parameter Real e=0.5;
Real extra;
equation
extra = e;
end Variant_2;
end Example_2;
が(あるいは、少なくとも私は思う):
- 二つの例との違い/近づく。私が意図した使用のために、私は個人的にHansのアプローチ(コンポーネント交換)を好みます。しかし、一度にいくつかのコンポーネントの交換を行うには、スコットのものがより充当されます。
- 'extends'の使用は必須ではありません。私が見つけた唯一の使い方は、〜の母親クラス〜を参照しなければならない「制約付き」の使用を許可することです(私の不適切な言い回しには申し訳ありません)。スコットが提供する「アノテーション」と組み合わせることで、無駄ではないパラメータにドロップダウンメニューを表示することができます(また、Hansのテクニックでも使用できます)。
一つの小さな疑問が開いたまま:the previous webpageによると、手で「注釈(選択肢())」リストを定義することが可能ですが、私は成功しませんでした(前の例でコメント行を参照してください)。これは、 'common-mother-class'と 'constrainedby'キーワードを使用する必要なく、適切なドロップダウンメニューを許可します。誰かが私が間違っていることを知っていますか?
最新の回答で新しい質問に対処したと思います。 'choices(choice = stuff) 'ではなく' choices(choice()) 'をかっこを使って解決するようです。注意。私はこれが、 'choice = stuff'がまだ他の場合にも適切であるため、TillerがModelica By Exampleのその部分を更新してからおそらく変更された'再宣言 'のニュアンスだと思います。確かに。 –
この追加のお返事ありがとうございます。 'choices(choice = stuff)'ソリューションは、少なくとも「コンポーネントの置き換え」のために適切に動作します。 'タイプ'置換の場合、適切なドロップダウンメニューが表示されますが、選択肢はツール(Dymola)によって保存されず、最後に標準オプションが常に使用されます。 – Songio
私はあなたの例を調べてみましたが、この解決方法はタイプするのではなく、「コンポーネント」置換にのみ適用することがわかりました。だから私は間違った構文を使用しました。有効なものは '注釈( 選択(再宣言モデルVarType = Test_ModelicaComplexity.Replacement_SO.Example_1.Variant_2" NEW ")、 選択(再宣言モデルVarType = Variant_1" STD "))); – Songio