我在做计算内燃机p(压力)的逻辑。方程由几个在时间从句中称为“周期”的情况组成。
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)部分只在第二个子句中。
我怎样才能解决这个问题?
发布于 2020-03-03 16:05:29
你能解释一下你想要什么行为吗?
第一个方程式,
when Period==1 then
p = pre(p) * ( T / pre(T)) ^( Gamma/(Gamma-1));它本身起作用,但上面关于p的第二个方程只有在周期变为0,2或3时才是有效的,这只是时间上的一个点,所以我无法理解右边的der(p)应该是什么。
另外,如果一个方程同时涉及到p和der(p),那么这个方程通常会被求解成基于p计算der(p),但我不确定这是否就是这里的目标。
补充:您的评论似乎表明,您希望在句点获得新值时,而不仅仅是在实例中,方程是有效的。在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;但不确定它是否会起作用,因为我还没有看到整个模型。
https://stackoverflow.com/questions/60499726
复制相似问题