我在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)?
我该如何解决?
谢谢。
答案 0 :(得分:4)
模型中发生的事情称为震颤。这意味着发生了非常频繁的事件。
在特定情况下,这是由条件T <73与导数定义结合引起的。让我尝试解释一下您提供的模型会发生什么情况:
这将导致条件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;
可以找到更多一般信息,例如在http://book.xogeny.com/behavior/discrete/decay/