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

Modelica Simulation breaks when if condition changes

我使用 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 ) 继续模拟?

我该如何解决?

谢谢。

你的模型中发生的事情被称为喋喋不休。这意味着,有非常频繁的事件发生。

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

  1. 温度升到73
  2. 然后温度开始下降,因为if语句中的条件变成fall
  3. 这会导致 if 语句立即再次变为真,从而使温度升高
  4. 这会导致 if 语句再次变为假,使温度下降
  5. 转到 3.

这导致条件 T<73 以非常高的频率变化,进而产生许多事件,这些事件必须由求解器处理。这使得时间进度非常小(你所说的"the simulation stops")。

有多种方法可以解决这个问题。一种是在模型中添加滞后。我在下面的代码中这样做了。为了描述滞后部分,我使用了 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;

模拟结果如下:

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