您好,我希望能够进行以下修改:
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
答案 0 :(得分:1)
有两种可能的解决方案,它们可能足以满足您的目的。如您的问题的语法所述,有一个包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}
与朋友交谈,获得了另一种方法的启发。
第二种方法是尝试避开语言限制,即类型数组具有相同的长度(至少在尝试内联定义时)。为此,请使用0
或其他有意义的值填充矩阵的矩阵。在模型内部,您可以使用一个内部(_int
)参数来帮助阐明您使用的是什么。但这不是必须的,只要您确保将任何循环等设为从1:nSURFS开始的键即可(即永远不会使用0值。
如果需要,方法1中有关nZone的注释仍然适用。
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的简化版本。请注意,在以ZONE
类型使用nMONOL时,请确保在nSURFS上循环,或创建一个内部变量以免使用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;