【发布时间】:2018-07-10 15:17:27
【问题描述】:
所以,我有一个带有压力损失的管子模型,其中未知的是质量流量。通常,在这个问题的大多数模型上,守恒方程用于计算质量流量,但这些模型有很多收敛问题(因为管末端的阻塞流动会导致无限的压力导数)结束)。见下图,左图表示问题,右图显示无限压力导数。
因此,我使用了一个更稳健的模型,尽管它输出的不是质量流量而是已知的管长度。因此需要一个迭代循环来确定质量流量。好吧,我编写了一个函数length,给定管子几何形状、质量流量和边界条件,它会输出计算出的管子长度,并生成如下等式:
parameter Real L;
Real m_flow;
...
equation
L = length(geometry, boundary, m_flow)
它模拟得很好,但它需要很长时间......而且它不应该因为质量流量对管长度相当不敏感,例如如果L=3 如果长度的输出在L ± 0.1 之内,我可以说m_flow 已经收敛。另一方面,Dymola 中 DASSL 的默认收敛容差是 0.0001,这对于所有其他变量都很好,但对我的模型来说是一个重大挫折......
话虽如此,我想知道是否有(hacky)方法来设置特定的容差L(来自annotations 或其他东西)。我无法在线或在 Dymola 的用户手册中找到任何解决方案......到目前为止,我通过创建第二个函数来解决问题,该函数使用 Newton-Raphson 方法来确定质量流量,例如:
function massflowrate
input geometry, boundary, m_flow_start, tolerance;
output m_flow;
protected
Real error, L, dL, dLdm_flow, Delta_m_flow;
algorithm
error = geometry.L;
m_flow = m_flow_start;
while error>tolerance loop
L = length(geometry, boundary, m_flow);
error = abs(boundary.L - L);
dL = length(geometry, boundary, m_flow*1.001);
dLdm_flow = dL/(0.001*m_flow);
Delta_m_flow = (geometry.L - L)/dLdm_flow;
m_flow = m_flow + Delta_m_flow;
end while;
end massflowrate;
然后我在方程式部分使用它:
parameter Real L;
Real m_flow;
...
equation
m_flow = massflowrate(geometry, boundary, delay(m_flow,10), tolerance)
尽管如此,这个解决方案并非没有问题,真正的方程是非常非线性的,并且根据边界条件,求解器会达到一个永无止境的循环... =/
PS:我很抱歉这篇文章很长而且没有 MWE,真正的方程很长,并且有大量的热力学,我认为这没有任何帮助,如果有必要的话,我可以提供真实的模型。
【问题讨论】:
-
我知道的管道使用 darcy Weisbach 方程根据入口和出口之间的压力差计算质量流量。你为什么不在这里使用这个?
-
那是因为我没有直截了当,这不是一个“正常”的管道。它是冰箱中用作膨胀装置的毛细管,其中发生了几种现象(压降、热交换、相变和阻塞流动)。 =D