Modelica 中时间变量的平均值
Mean of a time variable in Modelica
我有一个简单的模型如下,我打算计算 x 导数 wrt time(der(x)) 的平均值。
model Average
Real x;
initial equation
x = 2.0;
equation
der(x) = x + 5;
annotation (experiment(StopTime=10, __Dymola_Algorithm="Dassl"));
end Average;
关键是它是原始代码的简化代码,其中“x”由 CombiTimeTable 给出。我需要执行几个模拟(通过几个文本文件作为 CombiTimeTable 的输入)它们没有相同的行数(不同的持续时间)。换句话说,StopTime 因情况而异,例如对于这种特定情况,此处的 StopTime 为 10s。
有什么方法可以使用一般方程来计算 der(x) 的平均值。如果有人能提供帮助,我将不胜感激。
如果您想要 der(X) 的平均值,您不能将平均值计算为 (x2-x1)/(time2-time1) 吗?
如果您想要数值解而不是解析解,请使用 Modelica.Blocks.Math.Mean。请注意,它对信号进行采样,因此会出现一些数字错误。为了提高精度,您需要减少采样周期,但这样做会增加模拟系统所需的时间。
如果您不需要在模拟过程中使用均值,也可以使用结果文件的 post 处理。
根据 的回答,我创建了一个模型,通过两种方法计算 der(x)
的平均值:
- 使用 MSL 中的块
Modelica.Blocks.Math.ContinuousMean
(而不是 Mean,因为它不采样)
- 在模拟终止时用
(x2-x1)/(time2-time1)
计算平均值
model Average
import Modelica.Constants.pi;
import Modelica.Utilities.Streams.print;
Real x;
Real time1, time2, x1, x2;
Modelica.Blocks.Math.ContinuousMean continuousMean;
equation
der(x) = sqrt(1+cos(2*pi*2*time))+sin(time)^2;
// Method 1: Continuous mean from MSL
continuousMean.u = der(x);
when terminal() then
print("Continuous mean: "+String( continuousMean.y));
end when;
// Method 2: Mean at end time
when initial() then
x1 = x;
time1 = time;
end when;
when terminal() then
x2 = x;
time2 = time;
print("Computed mean: "+String( (x2-x1)/(time2-time1)));
end when;
annotation (experiment(StopTime=1.0, __Dymola_Algorithm="Dassl"));
end Average;
两个值都在模拟结束时打印出来。它们给出的值与平均值 post 处理命令相似,您可以在 Dymola 中对绘制的信号应用该命令:
另一种可能性是在模拟结束后调用 Dymola 中的均值信号运算符(可能在运行模拟的脚本中):
DymolaCommands.Plot.signalOperatorValue("der(x)", SignalOperator.ArithmeticMean, 0, 1);
我有一个简单的模型如下,我打算计算 x 导数 wrt time(der(x)) 的平均值。
model Average
Real x;
initial equation
x = 2.0;
equation
der(x) = x + 5;
annotation (experiment(StopTime=10, __Dymola_Algorithm="Dassl"));
end Average;
关键是它是原始代码的简化代码,其中“x”由 CombiTimeTable 给出。我需要执行几个模拟(通过几个文本文件作为 CombiTimeTable 的输入)它们没有相同的行数(不同的持续时间)。换句话说,StopTime 因情况而异,例如对于这种特定情况,此处的 StopTime 为 10s。 有什么方法可以使用一般方程来计算 der(x) 的平均值。如果有人能提供帮助,我将不胜感激。
如果您想要 der(X) 的平均值,您不能将平均值计算为 (x2-x1)/(time2-time1) 吗?
如果您想要数值解而不是解析解,请使用 Modelica.Blocks.Math.Mean。请注意,它对信号进行采样,因此会出现一些数字错误。为了提高精度,您需要减少采样周期,但这样做会增加模拟系统所需的时间。 如果您不需要在模拟过程中使用均值,也可以使用结果文件的 post 处理。
根据 der(x)
的平均值:
- 使用 MSL 中的块
Modelica.Blocks.Math.ContinuousMean
(而不是 Mean,因为它不采样) - 在模拟终止时用
(x2-x1)/(time2-time1)
计算平均值
model Average
import Modelica.Constants.pi;
import Modelica.Utilities.Streams.print;
Real x;
Real time1, time2, x1, x2;
Modelica.Blocks.Math.ContinuousMean continuousMean;
equation
der(x) = sqrt(1+cos(2*pi*2*time))+sin(time)^2;
// Method 1: Continuous mean from MSL
continuousMean.u = der(x);
when terminal() then
print("Continuous mean: "+String( continuousMean.y));
end when;
// Method 2: Mean at end time
when initial() then
x1 = x;
time1 = time;
end when;
when terminal() then
x2 = x;
time2 = time;
print("Computed mean: "+String( (x2-x1)/(time2-time1)));
end when;
annotation (experiment(StopTime=1.0, __Dymola_Algorithm="Dassl"));
end Average;
两个值都在模拟结束时打印出来。它们给出的值与平均值 post 处理命令相似,您可以在 Dymola 中对绘制的信号应用该命令:
另一种可能性是在模拟结束后调用 Dymola 中的均值信号运算符(可能在运行模拟的脚本中):
DymolaCommands.Plot.signalOperatorValue("der(x)", SignalOperator.ArithmeticMean, 0, 1);