整个模拟的最小值

时间:2016-05-24 09:20:26

标签: modeling modelica dymola

在连续模型中,如何在模拟过程中保存变量的最小值?

模拟完成后,我想显示一个带有图形注释的变量T_min,该图形注释显示模拟过程中温度T的最低值。

例如,如果模拟温度T是正弦函数,则T_min值的所需结果为:

enter image description here

在离散代码中,这看起来像这样:

T_min := Modelica.Constants.inf "Start value";
if T < T_min then
    T_min := T;
else
    T_min := T_min;
end if;

...但我希望不断实施以避免抽样,大量事件等。

提前致谢。

Rene Just Nielsen

2 个答案:

答案 0 :(得分:1)

我不确定Renes解决方案是否最佳。该解决方案生成由两个if条件生成的许多状态事件。嵌入以下模型:

model globalMinimum2 
 Real T, T_min;
 Boolean is_true;
initial equation 
 T_min = T;
equation 
 T =time/10*sin(time);
 // if statement ensures that 'T_min' doesn't integrate downwards...
 // ... whenever der(T) is negative;
 if T < T_min then
  der(T_min) = min(0, der(T));
  is_true=true; 
 else
  der(T_min) = 0;
  is_true=false;
 end if;
end globalMinimum2;

模拟日志如下:

Integration started at T = 0 using integration method DASSL
(DAE multi-step solver (dassl/dasslrt of Petzold modified by Dynasim))
Integration terminated successfully at T = 50
  WARNING: You have many state events. It might be due to chattering.
  Enable logging of event in Simulation/Setup/Debug/Events during simulation
   CPU-time for integration      : 0.077 seconds
   CPU-time for one GRID interval: 0.154 milli-seconds
   Number of result points       : 3801
   Number of GRID   points       : 501
   Number of (successful) steps  : 2519
   Number of F-evaluations       : 4799
   Number of H-evaluations       : 18822
   Number of Jacobian-evaluations: 2121
   Number of (model) time events : 0
   Number of (U) time events     : 0
   Number of state    events     : 1650
   Number of step     events     : 0
   Minimum integration stepsize  : 1.44e-005
   Maximum integration stepsize  : 5.61
   Maximum integration order     : 3

或许最好检测以下示例中给出的两个事件:

model unnamed_2 
  Real T;
  Real hold;
  Real T_min;
  Boolean take_signal;

initial equation 
  hold=T;
equation 
  T = time/10*sin(time);

  when (T < pre(hold)) then
    take_signal = true;
    hold = T; 
  elsewhen (der(T) >=0) then
    take_signal = false;
    hold = T; 
  end when;

  if (take_signal) then
    T_min = T; 
  else
    T_min = hold;
  end if;

end unnamed_2;

模拟日志显示此解决方案更有效:

Log-file of program ./dymosim
(generated: Tue May 24 14:13:38 2016)

dymosim started
... "dsin.txt" loading (dymosim input file)
... "unnamed_2.mat" creating (simulation result file)

Integration started at T = 0 using integration method DASSL
(DAE multi-step solver (dassl/dasslrt of Petzold modified by Dynasim))
Integration terminated successfully at T = 50
   CPU-time for integration      : 0.011 seconds
   CPU-time for one GRID interval: 0.022 milli-seconds
   Number of result points       : 549
   Number of GRID   points       : 501
   Number of (successful) steps  : 398
   Number of F-evaluations       : 771
   Number of H-evaluations       : 1238
   Number of Jacobian-evaluations: 373
   Number of (model) time events : 0
   Number of (U) time events     : 0
   Number of state    events     : 32
   Number of step     events     : 0
   Minimum integration stepsize  : 4.65e-006
   Maximum integration stepsize  : 3.14
   Maximum integration order     : 1
Calling terminal section
... "dsfinal.txt" creating (final states)

答案 1 :(得分:0)

看来我只能通过查看上图

来找到自己问题的答案

代码非常简单:

model globalMinimum
  Modelica.SIunits.Temperature T, T_min;
initial equation 
  T_min = T;
equation 
  // if statement ensures that 'T_min' doesn't integrate downwards...
  // ... whenever der(T) is negative;
  der(T_min) = if T < T_min then min(0, der(T)) else 0;
end globalMinimum;