首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Dymola设置特定变量的收敛容限?

如何使用Dymola设置特定变量的收敛容限?
EN

Stack Overflow用户
提问于 2018-07-10 15:17:27
回答 1查看 281关注 0票数 2

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

正因为如此,我使用了一个更稳健的模型,虽然它输出的不是质量流量,而是管道长度,这是已知的。因此,需要一个迭代循环来确定质量流量。然后,我编写了一个函数length,给定管的几何形状、质量流量和边界条件,它输出计算出的管长,并使方程如下所示:

代码语言:javascript
复制
    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的用户手册中找不到任何解决方案.到目前为止,我通过创建第二个函数来解决这个问题,该函数使用牛顿-拉夫森方法来确定质量流量,类似于:

代码语言:javascript
复制
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;

然后我把它用在方程式部分:

代码语言:javascript
复制
    parameter Real L;
    Real m_flow;
...
equation
    m_flow = massflowrate(geometry, boundary, delay(m_flow,10), tolerance)

然而,这个解并不是没有问题的,实际方程是非常非线性的,并且依赖于边界条件,求解者达到了一个永无止境的循环。=/

PS:很抱歉,我的帖子很长,而且缺少MWE,实际的方程很长,而且有大量的热力学,我认为这对我没有任何帮助,尽管如此,如果有必要的话,我可以提供真正的模型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-11 09:50:45

长度函数光滑吗?对我来说,这是不顺利的,似乎是一个可能的原因,问题,由@菲尔的建议也可能是好主意。

但是,也应该可以按以下方式做您想做的事情:

代码语言:javascript
复制
Real m_flow(nominal=1e9);

说明:方程通常在未知数中解到一定的容差,在本例中是m_flow。

每个变量的公差是一个相对的/绝对的公差,它包含了名义值,Dymola不允许您为不同的变量设置不同的公差。

因此,不太准确地计算m_flow的简单方法是为它设置一个高标称值,因为误差容限将是tol*(abs(m_flow)+abs(nominal(m_flow)))或类似的东西。

缺点是它可能太不准确,例如导致额外的事件,或者错误是如此的随机,以至于求解器仍然慢下来。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51268885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档