【问题标题】:How to set a convergence tolerance to an specific variable using Dymola?如何使用 Dymola 为特定变量设置收敛容差?
【发布时间】: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

标签: solver modelica


【解决方案1】:

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

但是,您也应该可以按照以下方式进行操作:

Real m_flow(nominal=1e9);

说明:方程通常在 unknowns 中求解到一定的容差 - 在本例中为 m_flow。

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

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

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

【讨论】:

  • 嗯似乎是我要找的。虽然质量流量不是具有宽松公差的变量,但长度是。您会看到,我使用长度函数变化 m_flow 来计算管长度,以便它在宽松的公差范围内与参数 L 匹配。事实是,例如,从 2.9 到 3.1 的计算长度,质量流量变化几乎可以忽略不计,这就是(据称)使该模型快速的原因......
  • 好吧,它成功了...我使用了m_flow(nominal=1e9)CPUtime 下降了 77%,这太棒了!虽然我很困惑:结果保持不变!与公差更严格的结果没有任何偏差......因为我更改了未知m_flow 的公差,但检查的方程是长度L,我希望误差公差为L not for m_flow... By you expression there setting nominal=1e9`L 的容差将是 1e5 的容差,这应该会使结果变得疯狂!怎么了?? o.O
  • 方程 L=length(...) 被视为一般方程,不会改变 L 的值;如果写成“0=L-length(...)”也是一样的。如果您想查看 m_flow-errors 的影响,您可以添加“Real myLength=length(...);”然后将其与 L 进行比较。但是,与 L 的差异可能非常小。
  • 我明白这一点。让我大吃一惊的是我如何从使用默认的nominal value,模拟并获得结果A。然后我使用m_flow(nominal=1e3)(小步骤),模拟并且结果没有变化(质量流量与A中的相同,真的,没有偏差),但是CPU时间更小......第二次练习我使用@ 987654335@,模拟和......结果仍然没有变化,CPU时间更小!!对我来说似乎很神奇......我希望从模拟中得到不同的结果,因为m_flow 的错误应该会上升......你想让我分享这个包吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 2021-12-19
  • 1970-01-01
  • 2017-09-11
  • 2013-06-21
  • 1970-01-01
相关资源
最近更新 更多