我正在通过逻辑计算内燃机的p(压力)。方程由when子句中称为“ Period”的几种情况组成。
when Period==1 then
p = pre(p) * ( T / pre(T)) ^( Gamma/(Gamma-1));
elsewhen Period==0 or Period==2 or Period==3 then
p = ( m*R_gas*der(T)+m*T*der(R_gas)+R_gas*T*der(m)-V*der(p) ) / der(V);
end when;
代码中唯一未知的变量是p,我得到如下错误消息
在消息中说等式p是离散的并且无法微分。
但是,我认为这不是离散方程。尽管它是离散方程,但我不希望出现此错误,因为der(p)部分仅在第二子句中。
我该如何解决此问题?
你能解释你想要什么行为吗?
第一等式,
when Period==1 then
p = pre(p) * ( T / pre(T)) ^( Gamma/(Gamma-1));
可以独立工作,但是上面的p的第二个等式仅在Period becomes 0、2或3时才有效。这只是一个时间点,所以我无法理解der(p)是什么。应该在右侧。
[另外,如果一个方程式同时涉及p
和der(p)
,则通常可以求解该方程式,以基于der(p)
来计算p
,但我不确定这是否是这里的目标。
添加:您的注释似乎表明您希望等式在Period获得新值时有效,而不仅仅是在实例时有效。在Modelica中,when
对于仅在条件为真时才有效的方程式,if
对于在条件为真时才有效的方程式。
这将导致类似:
if Period==1 then
...
else
p = ( m*R_gas*der(T)+m*T*der(R_gas)+R_gas*T*der(m)-V*der(p) ) / der(V);
end if;
但是,在这种情况下,第一个方程是有问题的。我想您希望x=T^(Gamma/(Gamma-1))/p
在那部分保持不变,并且不幸的是,直接编写该文字会导致更改索引,而Modelica当前不支持该更改。
但是,另一种说法是它的导数为零,这将给出类似的内容:
x=T^(Gamma/(Gamma-1))/p;
if Period==1 then
der(x)=0;
else
p = ( m*R_gas*der(T)+m*T*der(R_gas)+R_gas*T*der(m)-V*der(p) ) / der(V);
end if;
但是由于我还没有看到整个模型,所以不确定它是否会起作用。