OpenModelica中的可变采样频率
我指的是这个帖子: 我想测量一个RMS值或一个具有可变采样频率的平均值,我可以将其作为输入信号输入 建议的方法几乎符合我的需要,如下所示:OpenModelica中的可变采样频率,modelica,openmodelica,Modelica,Openmodelica,我指的是这个帖子: 我想测量一个RMS值或一个具有可变采样频率的平均值,我可以将其作为输入信号输入 建议的方法几乎符合我的需要,如下所示: model RMS constant Real f_max = 2*2*asin(1.0); constant Real f = 1+abs(2*asin(time)); Real signal = sin(time); Real rms = if time < f then (if time < 1e-10 then signa
model RMS
constant Real f_max = 2*2*asin(1.0);
constant Real f = 1+abs(2*asin(time));
Real signal = sin(time);
Real rms = if time < f then (if time < 1e-10 then signal else sqrt(i_sq / time)) else sqrt(i_sq_f / f);
Real i_sq(start=0, fixed=true);
Real i_sq_f = i_sq - delay(i_sq, f, f_max);
equation
der(i_sq) = signal^2;
end RMS;
这一个抛出了一个错误:可变性常数的分量f具有绑定1.0+abs2.0*作为更高可变性变量的时间
有没有办法解决这个问题并将频率作为实际输入值输入?代码的主要问题是,时间是一个变量,意味着它会随着时间的推移而改变其值。这对应于第3.8章中的连续时间表达式。变量只能分配给具有相同或更高可变性的变量。因此,不可能将从时间计算的某个值指定为常数,因为结果将不是常数。因此,去掉f定义中的常数将解决这个问题 将常量替换为f定义中的输入将使工具期望从外部提供f。或者,您可以使用Modelica.Blocks.Interfaces.RealInput 而且f_max听起来更像一个参数而不是常数
此外,如果时间大于1,则“asintime”将出现问题。但这是另一回事……代码的主要问题是,时间是一个变量,意味着它随时间而改变其值。这对应于第3.8章中的连续时间表达式。变量只能分配给具有相同或更高可变性的变量。因此,不可能将从时间计算的某个值指定为常数,因为结果将不是常数。因此,去掉f定义中的常数将解决这个问题 将常量替换为f定义中的输入将使工具期望从外部提供f。或者,您可以使用Modelica.Blocks.Interfaces.RealInput 而且f_max听起来更像一个参数而不是常数 此外,如果时间大于1,则“asintime”将出现问题。但这是另一回事……f的表达式是时变的,但f被声明为常数 简单地替换常量实f=。。。输入实数f=。。。。然后,如果愿意,可以从模型外部指定f。f的表达式是时变的,但f声明为常量
简单地替换常量实f=。。。输入实数f=。。。。然后,如果愿意,可以从模型外部指定f。找到了解决方案,上面的示例中出现了一些问题。一个具有常数实f,一个具有常数实f_max,在需要时间差的位置,使用频率代替 下面是一个工作块
model RMS
constant Real f_max = 10000;
Modelica.Blocks.Interfaces.RealInput f annotation(
Placement(visible = true, transformation(origin = {0, 106}, extent = {{-20, -20}, {20, 20}}, rotation = -90), iconTransformation(origin = {0, 106}, extent = {{-20, -20}, {20, 20}}, rotation = -90)));
Modelica.Blocks.Interfaces.RealInput signal annotation(
Placement(visible = true, transformation(origin = {-108, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-108, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
Real dt = 1/f;
Real rms = if time < dt then (if time < 1e-10 then signal else sqrt(i_sq / time)) else sqrt(i_sq_f / dt);
Real i_sq(start=0, fixed=true);
Real testi = delay(i_sq, dt, f_max);
Real i_sq_f = i_sq - delay(i_sq, dt, f_max);
Modelica.Blocks.Interfaces.RealOutput y annotation(
Placement(visible = true, transformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
der(i_sq) = signal^2;
y = rms;
end RMS;
编辑:模拟步长必须大于第一个if条件下的时间。否则,此程序仍可能抛出错误除以0。找到解决方案后,上面的示例中出现了一些问题。一个具有常数实f,一个具有常数实f_max,在需要时间差的位置,使用频率代替 下面是一个工作块
model RMS
constant Real f_max = 10000;
Modelica.Blocks.Interfaces.RealInput f annotation(
Placement(visible = true, transformation(origin = {0, 106}, extent = {{-20, -20}, {20, 20}}, rotation = -90), iconTransformation(origin = {0, 106}, extent = {{-20, -20}, {20, 20}}, rotation = -90)));
Modelica.Blocks.Interfaces.RealInput signal annotation(
Placement(visible = true, transformation(origin = {-108, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0), iconTransformation(origin = {-108, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
Real dt = 1/f;
Real rms = if time < dt then (if time < 1e-10 then signal else sqrt(i_sq / time)) else sqrt(i_sq_f / dt);
Real i_sq(start=0, fixed=true);
Real testi = delay(i_sq, dt, f_max);
Real i_sq_f = i_sq - delay(i_sq, dt, f_max);
Modelica.Blocks.Interfaces.RealOutput y annotation(
Placement(visible = true, transformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0), iconTransformation(origin = {110, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
der(i_sq) = signal^2;
y = rms;
end RMS;
编辑:模拟步长必须大于第一个if条件下的时间。否则,此程序仍可能抛出错误除以0