所以,我有一个压力损失的管道模型,其中未知的是质量流量。一般情况下,在该问题的大多数模型中,都采用守恒方程来计算质量流量,但这类模型存在大量的收敛问题(因为管端的阻塞流导致了末端的无限压力导数)。关于左边和右边问题的表示,见下图,这是显示无限压力导数的图。

正因为如此,我使用了一个更稳健的模型,虽然它输出的不是质量流量,而是管道长度,这是已知的。因此,需要一个迭代循环来确定质量流量。然后,我编写了一个函数length,给定管的几何形状、质量流量和边界条件,它输出计算出的管长,并使方程如下所示:
parameter Real L;
Real m_flow;
...
equation
L = length(geometry, boundary, m_flow)它模拟得很好,但需要很长时间.也不应该因为质量流量对管长不太敏感,例如,如果L=3,我可以说,如果长度的输出在L ± 0.1之内,m_flow已经收敛。另一方面,DASSL在Dymola中的默认收敛公差是0.0001,这对所有其他变量都很好,但对我的模型来说是一个很大的挫折。
话虽如此,我想知道是否有一种(讨厌的)方法来设置特定的容差L (来自annotations或其他地方)。我在网上或Dymola的用户手册中找不到任何解决方案.到目前为止,我通过创建第二个函数来解决这个问题,该函数使用牛顿-拉夫森方法来确定质量流量,类似于:
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,实际的方程很长,而且有大量的热力学,我认为这对我没有任何帮助,尽管如此,如果有必要的话,我可以提供真正的模型。
发布于 2018-07-11 09:50:45
长度函数光滑吗?对我来说,这是不顺利的,似乎是一个可能的原因,问题,由@菲尔的建议也可能是好主意。
但是,也应该可以按以下方式做您想做的事情:
Real m_flow(nominal=1e9);说明:方程通常在未知数中解到一定的容差,在本例中是m_flow。
每个变量的公差是一个相对的/绝对的公差,它包含了名义值,Dymola不允许您为不同的变量设置不同的公差。
因此,不太准确地计算m_flow的简单方法是为它设置一个高标称值,因为误差容限将是tol*(abs(m_flow)+abs(nominal(m_flow)))或类似的东西。
缺点是它可能太不准确,例如导致额外的事件,或者错误是如此的随机,以至于求解器仍然慢下来。
https://stackoverflow.com/questions/51268885
复制相似问题