如果条件发生变化,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 结合导数的定义引起的。让我试着解释一下您提供的模型会发生什么:
- 温度升到73
- 然后温度开始下降,因为if语句中的条件变成fall
- 这会导致 if 语句立即再次变为真,从而使温度升高
- 这会导致 if 语句再次变为假,使温度下降
- 转到 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/
我使用 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 结合导数的定义引起的。让我试着解释一下您提供的模型会发生什么:
- 温度升到73
- 然后温度开始下降,因为if语句中的条件变成fall
- 这会导致 if 语句立即再次变为真,从而使温度升高
- 这会导致 if 语句再次变为假,使温度下降
- 转到 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/