solver - 如何使用 Dymola 设置特定变量的收敛容差?

标签 solver modelica

因此,我有一个具有压力损失的管模型,其中未知的是质量流量。通常,在该问题的大多数模型中,守恒方程用于计算质量流量,但此类模型存在很多收敛问题(因为管末端的流动受阻,导致在结束)。请参见下图,左侧是问题的表示,右侧是显示无限压力导数的图表。

Problem representation

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

    parameter Real L;
    Real m_flow;
...
equation
    L = length(geometry, boundary, m_flow)

它模拟得很好,但需要很长时间......而且它不应该,因为质量流量对管长度相当不敏感,例如if L=3 如果 length 的输出在 L ± 0.1 范围内,我可以说 m_flow 已经收敛。另一方面,Dymola 中 DASSL 的默认收敛容差是 0.0001,这对于所有其他变量来说都很好,但对我的模型来说是一个重大挫折......

话虽这么说,我想知道是否有一种(hacky)方法来设置特定的容差L(来自注释或其他东西)。我无法在网上或 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,真正的方程很长,而且有大量的热力学,我相信这没有任何帮助,但如果有必要的话,我可以提供真实的模型。

最佳答案

长度函数是否平滑?对我来说,不平滑似乎是导致问题的一个可能原因,@Phil 的建议也可能是个好主意。

但是,也应该可以执行您想要的操作,如下所示:

Real m_flow(nominal=1e9);

说明:方程通常在未知数的一定容差范围内求解 - 在本例中为 m_flow。

每个变量的容差是考虑到标称值的相对/绝对容差,Dymola 不允许您为不同的变量设置不同的容差。

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

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

关于solver - 如何使用 Dymola 设置特定变量的收敛容差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51268885/

相关文章:

modelica - 从平面 Modelica 代码中提取类型/类名

modelica - 无法表示 openmodelica 上的变量

r - 在 R 中求解方程类似于 Excel 求解器参数函数

r - R中的glm()与Excel中逻辑回归的手动实现之间的结果不一致

python - 是否可以在 python 中求解带有单位的符号?

modelica - 查找在 Modelica 模型中导致非线性误差的变量

modelica - 如何检索 Modelica 中实际值的时间步长?

vba - 求解器在我第二次运行时不起作用

java - 寻找一个好的 Java ODE 求解器

migration - 当参数为 String 时,Dymola 中的类有条件迁移