Modelica的when子句中如何避免离散导数的逻辑?
How can make the logic avoiding discrete derivative in the when clause in Modelica?
我正在编写计算内燃机 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 变为 0、2 或 3 时有效。这只是一个时间点,所以我不明白右手边的 der(p) 应该是什么。
此外,如果一个方程同时涉及 p
和 der(p)
,则通常求解方程以根据 p
计算 der(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;
但不确定是否有效,因为我还没有看到整个模型。
我正在编写计算内燃机 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 变为 0、2 或 3 时有效。这只是一个时间点,所以我不明白右手边的 der(p) 应该是什么。
此外,如果一个方程同时涉及 p
和 der(p)
,则通常求解方程以根据 p
计算 der(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;
但不确定是否有效,因为我还没有看到整个模型。