2017-04-05 19 views
1

数ヶ月からModelicaを使用しても、私は継承や置換などの高度な機能を初めて習得しました。Modelica - モデルバリエーション(標準の1つ以上の複雑なもの)

私は標準モデル(すなわちプール)とより複雑なバリアント(すなわち、蒸発計算を含む)を持っています:2つのモデルは、私が "再利用"したい多くの共通部分を持っていますが、複雑なモデルにはより多くのパラメータ、変数、方程式(すなわち、空気や蒸気の性質や法則)が含まれています。私はそれを行うにはModelicaでいくつかの可能性を持っていると思う

  1. は(だけで同期していない素敵なコピー&ペーストテキスト機能を使用して)は、2つの独立したモデルを書き留めて - 私がいないことを好みます。
  2. 継承(1)を使用して、共通定義を持つ部分モデルと特定の部分を持つ2つの継承モデルを記述します。
  3. 異なる組の方程式(およびその他の特定の定義)を含む2つの部分モデルを作成し、共通定義を含む3つのモデルを作成し、2つの部分モデルの1つを継承する(ブールパラメータ)。実際には私はそれができるとは分かりません。部分モデルには、未定義の変数/パラメータ(継承モデルで定義されている)を持つ方程式が含まれています。
  4. 標準モデルを書き、新しい方程式を置き換え、追加の定義を追加します。

(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'キーワードを使用する必要なく、適切なドロップダウンメニューを許可します。誰かが私が間違っていることを知っていますか?

+0

最新の回答で新しい質問に対処したと思います。 'choices(choice = stuff) 'ではなく' choices(choice()) 'をかっこを使って解決するようです。注意。私はこれが、 'choice = stuff'がまだ他の場合にも適切であるため、TillerがModelica By Exampleのその部分を更新してからおそらく変更された'再宣言 'のニュアンスだと思います。確かに。 –

+0

この追加のお返事ありがとうございます。 'choices(choice = stuff)'ソリューションは、少なくとも「コンポーネントの置き換え」のために適切に動作します。 'タイプ'置換の場合、適切なドロップダウンメニューが表示されますが、選択肢はツール(Dymola)によって保存されず、最後に標準オプションが常に使用されます。 – Songio

+0

私はあなたの例を調べてみましたが、この解決方法はタイプするのではなく、「コンポーネント」置換にのみ適用することがわかりました。だから私は間違った構文を使用しました。有効なものは '注釈( 選択(再宣言モデルVarType = Test_ModelicaComplexity.Replacement_SO.Example_1.Variant_2" NEW ")、 選択(再宣言モデルVarType = Variant_1" STD "))); – Songio

答えて

1

ifステートメントではなくモデル間で変更する場合は、replaceable modelを使用します。以下は、あなたの例に基づいた緩やかな例です。交換可能な機能を正しく使用するために、問題を適切に策定する方法を考え直すことをお任せします。それが役に立てば幸い。 https://trac.openmodelica.org/OpenModelica/ticket/2079:まだ対処されているいくつかの長期的な課題となっているように思われるようOMEditが正しくreplaceable使用を処理する場合Dymolaは2017 FD01でテスト

...

わかりません。

package Example 

    model Test 
    // Simple test of the component "Final" 

    Final Final1(
     redeclare model VarType = Variant_1, 
     redeclare Variant_2 varType2, 
     redeclare Example.Variant_3 varType3 "Test") 
     annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); 
    end Test; 

    model Final 
    // Model demonstrating difference ways to use "replaceable" 

    extends ReplaceableModels.PartialModel; 

    replaceable model VarType = ReplaceableModels.Variant_1 constrainedby 
     ReplaceableModels.PartialVariants 
           annotation(choicesAllMatching=true); 

    VarType varType1; 

    replaceable ReplaceableModels.Variant_1 varType2 constrainedby 
     ReplaceableModels.PartialVariants annotation (choicesAllMatching=true); 

    replaceable ReplaceableModels.Variant_1 varType3 constrainedby 
     ReplaceableModels.PartialVariants annotation (choices(
     choice(redeclare Example.Variant_1 varType3 "OLD"), 
     choice(redeclare Example.Variant_2 varType3 "NEW"), 
     choice(redeclare Example.Variant_3 varType3 "Test"))); 

    equation 
     result1 = varType1.extra; 
     result2 = varType2.extra; 
     result3 = varType3.extra; 

    end Final; 

    model Variant_1 

     extends ReplaceableModels.PartialVariants; 

     parameter Real extra0=0; 

    equation 
    extra = extra0; 

    end Variant_1; 

    model Variant_2 

     extends ReplaceableModels.PartialVariants; 

     parameter Real a=1; 
     Real b; 
     Real c; 
     parameter Real e=0.5; 
     parameter Real d = 0.1; 

    equation 

     c+d = b; 
     c+extra = time*a; 
     extra = d*e; 

    end Variant_2; 

    model Variant_3 

     Real extra; 

     parameter Real a=1; 
     Real b; 
     Real c; 
     parameter Real e=0.5; 
     parameter Real d = 0.1; 

    equation 

     c+d = b; 
     c+extra = time*a; 
     extra = d*e; 

    end Variant_3; 

    partial model PartialModel 

    Real result1; 
    Real result2; 
    Real result3; 

    end PartialModel; 

    partial model PartialVariants 

    Real extra; 

    end PartialVariants; 
end Example; 

UPDATE:GUIから、モデル選択のためのドロップダウン矢印を持つように

追加注釈。

UPDATE 2:

私は、ポスターの追加の質問に基づいて交換可能に使用して、いくつかの異なる方法を示しています拡大の例で、元のコードを交換しました。このコードには、作成されたモデルのTestFinal)が含まれており、Variant_3は部分クラスから拡張されていないため、choicesアノテーションで余分なモデルを含めることができます。

0

スコットGのソリューションに代わるものは、(基礎として彼のコードを使用して)の代わりに交換可能なコンポーネントを使用することである。

package ReplaceableComponentTest 
    model Test2 "Showing how to change it" 
    extends Final(redeclare Example.Variant_2 varType); 
    end Test2; 

    model Final 
    extends Example.PartialModel; 
    replaceable Example.Variant_1 varType constrainedby 
     Example.PartialVariants annotation(choices(
      choice(redeclare Example.Variant_2 test "NEW"), 
      choice(redeclare Example.Variant_1 test "OLD"))); 
    equation 
     result = varType.extra; 
    end Final; 
end ReplaceableComponentTest; 

package Example 

    model Variant_1 
     extends Example.PartialVariants; 
     parameter Real extra0=0; 
    equation 
    extra = extra0; 
    end Variant_1; 

    model Variant_2 
     extends Example.PartialVariants; 

     parameter Real a=1; 
     Real b; 
     Real c; 
     parameter Real e=0.5; 
     parameter Real d = 0.1; 

    equation 
     c+d = b; 
     c+extra = time*a; 
     extra = d*e; 
    end Variant_2; 

    partial model PartialModel 

    Real result; 

    end PartialModel; 

    partial model PartialVariants 

    Real extra; 

    end PartialVariants; 
end Example; 

この場合の両方の仕事。私は選択肢 - アノテーションも追加しました。クラスのフルネームを安全に使用するには(たとえうまくいければ)。

モデルの複数のコンポーネントを使用する場合は、交換可能なモデルを使用する必要があります。それ以外の場合は、スタイルの問題です。

関連する問題