modelica - 如何在Modelica的when子句中避免离散导数的逻辑?
问题描述
我正在制定计算内燃机的 p(压力)的逻辑。方程由 when 子句中称为“期间”的几种情况组成。
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)
该方程通常被求解为der(p)
基于计算p
,但我不确定这是否是这里的目标。
补充:您的评论似乎表明您希望等式在 Period 获得新值时有效,而不仅仅是在实例中有效。在 Modelicawhen
中,用于仅在条件为真时才有效一次的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;
但不确定它是否会起作用,因为我还没有看到整个模型。
推荐阅读
- discord.js - 在 dicord.js 中为 Rock、Paper、Scissors 应用程序捕获用户输入
- pyinstaller - pyinstaller 无法获取所需的模块
- node.js - 如何在服务器 Node.js 上安装 Cloudflare Origin CA 证书
- laravel - laravel 望远镜没有什么可迁移的
- html - 如何使用 Socket.io 修复这个 CORS?
- java - 使用 Java 只有一个对象可用时将 XML 转换为 JSON 数组
- django - 允许用户删除但保留对他们的引用
- linux - Ubuntu 上的 Docker 无法连接到 localhost 但可以连接到它的 ip
- c# - 你调用的对象是空的?(异常错误~ASP.NET MVC)
- javascript - 代码在本地主机上运行良好,但在托管主机提供商上运行良好 - 在互联网上搜索了 3 天,到目前为止许多尝试都是徒劳的