在模型中初始化未知大小的数组
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;
我需要一些关于在 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;