arrays – modelica:修改组件数组中的数组参数

您好我希望能够进行以下修改:

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}

但上面的修改不起作用.有没有办法让它发挥作用?
亲切的问候
ķ

最佳答案 以下是两种可能足以满足您需求的解决方案.正如您的问题的语法所描述的那样,包含一个包含模型ZONE的包.然后,示例模型就是您的问题中提供的内容.

方法#1

几个笔记

> fixed = false允许在初始算法/等式部分中定义nMONOL
> sum(nSURFS [1:i-1])对于指定的nSURFS数是通用的.
>而不是指定nZones,你可以依赖于nSURFS.取决于您的代码实际发生的事情,如果这是有道理的.

即,参数整数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}

方法#3

方法#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;
点赞