在Modelica中使用未知大小初始化数组

6

我需要在OpenModelica中初始化数组方面的一些帮助。我创建了一个Modelica类,它应该生成一个可变大小的数组。大小是作为参数设置的,类型为整数。以下是我想要做的示例。我不断收到错误消息,非常希望得到任何提示!谢谢。

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;
5个回答

8

在 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;

1
它有效。实际上,将方程初始化也是有效的。 - Gladson

4

在很多情况下,你甚至可以让它更加简单:

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

3
以下是有关使用函数时适用于未知数组大小的相关答案。
当原始数组的大小未知但变量需要该信息才能被实例化时,可以使用“size”命令。下面展示了此用法。
function test
    input Real[:] x1;
    input Real[size(x1,1)] x2;

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

1

在函数的算法部分仅确定数组的大小也是可能的。这里甚至不必显式给出数组的大小。

请参见以下用法。

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;

1
你的代码有错误,"Freq" 应该是 "Frew"。 - user2024223
抱歉,之前有一个打字错误...我已经修复了。 - MMeissner

1
如果这个被用在模型中,你需要创建一个函数来计算输出的大小,并将其作为 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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接