如果条件发生变化,Modelica Simulation将中断

时间:2018-12-05 09:41:37

标签: modelica

我在if上尝试在Modelica上使用简单代码:

model thermostat1
  parameter Real T0=10;
  Real T(start=T0);
equation 
  if T<73 then
    der(T)=-T+80;  
  else
     der(T)=-T+50;
  end if;
end thermostat1;

模拟在T达到73时停止。

为什么模拟不能继续使用新方程(der(T)=-T + 50)?

我该如何解决?

谢谢。

1 个答案:

答案 0 :(得分:4)

模型中发生的事情称为震颤。这意味着发生了非常频繁的事件。

在特定情况下,这是由条件T <73与导数定义结合引起的。让我尝试解释一下您提供的模型会发生什么情况:

  1. 温度升高直到达到73
  2. 然后温度开始下降,因为if语句中的条件下降了
  3. 这会使if语句立即再次变为true,从而使温度升高
  4. 这会使if语句再次变为false,从而使温度下降
  5. 转到3。

这将导致条件T <73以非常高的频率变化,进而产生许多事件,这些事件必须由求解器处理。这样可以使时间进度非常小(您称之为“模拟停止”)。

有多种方法可以解决此问题。一种是向模型添加滞后。我在下面的代码中做到了。为了描述滞后部分,我使用了Modelica.Blocks.Logical.Hysteresis中的代码。仅当温度高于upperLimit而低于T<73时,布尔变量T_high(代替您的T_low)才会更改。我选择了这种解决方案,因为对于恒温器来说似乎很合理。

model thermostat1
  parameter Real T0=10;

  parameter Real T_High=74;
  parameter Real T_Low=72;

  Boolean upperLimit "Output of hysteresis block";
  Real T(start=T0);

equation 
  upperLimit =not pre(upperLimit) and T > T_High or pre(upperLimit) and T >= T_Low;

  if upperLimit then
    der(T)=-T+50;
  else
    der(T)=-T+80;
  end if;

end thermostat1;

模拟结果如下: Result from the above code, computed by Dymola

可以找到更多一般信息,例如在http://book.xogeny.com/behavior/discrete/decay/