在模型中初始化未知大小的数组

initialising array with unknown size in modelica

我需要一些关于在 openmodelica 中初始化数组的帮助。我创建了一个 modelica class,它应该生成一个可变大小的数组。 size是要设置的参数,类型是integer。下面是我想做的一个例子。我不断收到错误消息,很乐意收到任何提示!谢谢

parameter Integer f_min;
parameter Integer f_max;
Integer Freq_steigerung;
Integer array_size;
Integer Freq[:];

equation
array_size = ceil((f_max-f_min)/Freq_steigerung);
Freq[array_size] = f_min: Freq_steigerung: f_max;

在 Modelica 中运行时不能有可变大小的数组。 所有数组大小都需要在编译时知道,因此大小需要是参数或常量。

您可以拥有包含数组大小未知的组件的函数(或记录),但它们需要在调用时绑定(因此在编译期间仍然已知)。

像这样的东西会起作用:

model T
  parameter Integer f_min;
  parameter Integer f_max;
  parameter Integer Freq_steigerung;
  parameter Integer array_size = integer(ceil((f_max-f_min)/Freq_steigerung));
  Integer Freq[array_size];
equation
  Freq = f_min: Freq_steigerung: f_max;
end T;

下面是关于未知数组大小的相关答案,适用于使用 functions

当原始数组的大小未知但变量需要该信息才能实例化时,可以使用size命令。这种用法如下所示。

function test
    input Real[:] x1;
    input Real[size(x1,1)] x2;

    output Real[size(x1,1)] y;
algorithm
    y = x1.*x2;
end test;

也可以只在 function 的算法部分确定数组的大小。在这里你甚至不必明确给出数组的大小。

见下面的用法。

function T
  input Integer f_min;
  input Integer f_max;
  input Integer Freq_steigerung;
  output Integer Freq[:];

algorithm 
  Freq := f_min:Freq_steigerung:f_max;
end T;

如果在模型中使用它,您将必须创建一个函数来计算输出的大小并将其作为 T 函数的输入(或者至少在使用 Dymola 时):

参见:

package TestT
  function T
  input Integer f_min;
  input Integer f_max;
  input Integer Freq_steigerung;
  input Integer n;
  output Integer Frew[n];
  algorithm 
  Frew := f_min:Freq_steigerung:f_max;
  end T;

  function Tc
  input Integer f_min;
  input Integer f_max;
  input Integer Freq_steigerung;
  output Integer n;
  algorithm 
    n :=size(f_min:Freq_steigerung:f_max, 1);
  end Tc;

  model Test
    parameter Integer n = TestT.Tc(1,3,1);
    Real a[n] = TestT.T(1,3,1,n);
  end Test;
end TestT;

在很多情况下,你可以让它变得更简单:

model T
  parameter Integer f_min;
  parameter Integer f_max;
  parameter Integer Freq_steigerung;
  Integer Freq[:]= f_min: Freq_steigerung: f_max;
end T;