こんにちは私は次の変更を加えることができるようにしたいと思います:
Zone.ZONE[nZones] MultiZone(
nMONOL={{nMONOL[i] for i in (1:nSURFS[j])} for j in 1:nZones});
nZones = 2の場合
nSURFS = {2,4}の場合
nMONOL = {5,4,6,7,8,9}の場合
。
結果は次のようになります。
MultiZone [1] .nMONOL [2] = {5,4}
MultiZone [2] .nMONOL [3] = {6,7,8,9}
ただし、上記の変更は機能しません。それを機能させる方法はありますか?よろしくK
ここにあなたの目的に十分かもしれない2つの可能な解決策があります。質問の構文で説明されているようZone
に、モデルを含むパッケージがありますZONE
。example
モデルは、あなたの質問に提示されたもの、その後です。
いくつかのメモ
fixed=false
初期アルゴリズム/方程式セクションでnMONOLを定義できます
sum(nSURFS[1:i-1])
nSURFS
指定された数の総称です。
nZoneを指定する代わりに、に依存させることができますnSURFS
。それが理にかなっている場合でも、コードで実際に何が起こっているかによって異なります。
すなわち、 parameter Integer nZones = size(nSURFS,1)
コードは次のとおりです。
package Zone
model ZONE
parameter Integer nSURFS = 2;
parameter Integer nMONOL[nSURFS](fixed=false); // Notice the modification
end ZONE;
model example
parameter Integer nZones=2;
parameter Integer nSURFS[nZones]={2,4};
parameter Integer nMONOL[sum(nSURFS)]={5,4,6,7,8,9};
Zone.ZONE[nZones] MultiZone(nSURFS=nSURFS);
initial algorithm // or initial equation
for i in 1:nZones loop
for j in 1:nSURFS[i] loop
MultiZone[i].nMONOL[j] := nMONOL[j + sum(nSURFS[1:i-1])];
end for;
end for;
end example;
end Zone;
望ましい結果を生み出す:
MultiZone [1] .nMONOL [2] = {5,4}
MultiZone [2] .nMONOL [4] = {6,7,8,9}
別のアプローチのインスピレーションを得るために友人と話しました。
この2番目のアプローチは、型配列の長さが同じであるという言語制限を回避する試みです(少なくとも、インラインで定義しようとしている場合)。これを行うには、マトリックスに依存します。ここで、0
または意味のある他の値がマトリックスを埋めます。モデルの内部で_int
は、使用しているものを明確にするために内部()パラメーターを設定できます。ただし、ループなどが1:nSURFSから移動するようにキー設定されていることを確認する限り、これは必要ありません(つまり、0の値は使用されません。
また、必要に応じて、アプローチ#1のnZonesに関する注意事項も適用されます。
package Zone
model ZONE
parameter Integer nSURFS = integer(if Modelica.Math.Vectors.find(0,nMONOL) == 0 then size(nMONOL,1) else Modelica.Math.Vectors.find(0,nMONOL)-1);
parameter Integer nMONOL[:];
final parameter Integer nMONOL_int[nSURFS] = {nMONOL[i] for i in 1:nSURFS};
end ZONE;
model example
parameter Integer nZones=2;
parameter Integer nMONOL[nZones,:]={{5,4,0,0},{6,7,8,9}};
Zone.ZONE[nZones] MultiZone(nMONOL = nMONOL);
end example;
end Zone;
望ましい結果を生み出す:
MultiZone [1] .nMONOL [4] = {5,4,0,0}
MultiZone [1] .nMONOL_int [2] = {5,4}
MultiZone [2] .nMONOL [4] = {6,7,8,9}
MultiZone [2] .nMONOL_int [4] = {6,7,8,9}
アプローチ#2の少し単純なバージョン。nSURFSZONE
をループする型でnMONOLを使用する場合、または0
値を使用しないように内部変数を作成する場合は注意してください。
package Zone
model ZONE
parameter Integer nSURFS;
parameter Integer nMONOL[:];
end ZONE;
model example
parameter Integer nZones=2;
parameter Integer nSURFS[:] = {2, 4};
parameter Integer nMONOL[nZones,max(nSURFS)]={{5,4,0,0},{6,7,8,9}};
Zone.ZONE[nZones] MultiZone(nSURFS = nSURFS, nMONOL = nMONOL);
end example;
end Zone;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加