【问题标题】:Modelica Model robustness issue: Failed to evaluate model for ODE-JacobianModelica 模型稳健性问题:无法评估 ODE-Jacobian 的模型
【发布时间】:2016-04-11 03:50:09
【问题描述】:

我正在 Dymola(基于 modelica 的商业软件)中运行系统模型。模型是关于强制对流下多孔物质的传热传质。我提出这个问题的问题是关于模型模拟过程中产生的错误。

在给定的模拟时间(7200 秒)内,模型的当前设置成功运行。但它会在日志文件中生成以下提示(在整个运行时间内间歇性地):

 ERROR: Failed to solve non-linear system using Newton solver.
To get more information: Turn on Simulation/Setup/Debug/Nonlinear solver diagnostics/Details
Solution to systems of equations not found at time = 882.457
   Nonlinear system of equations number = 4
   Infinity-norm of residue = 154.849
   Iteration is not making good progress.
   Accumulated number of residue calculations: 25279
   Last values of solution vector:
drum.T_e = 306.346
drum.X_e = 0.0413446
   Last values of residual vector:
{ -0.000157014, 154.849 }

我想我最重要的问题是,当我看到这个时,我一般应该对我的模型有什么了解。这是否意味着我定义方程或事件系统的方式存在特定错误?当我通过在一定范围内更改一些关键参数对模型进行稳健性研究时,这个问题变得很明显。由于此错误,模型在结束时间之前失败,参数值的随机组合。正如错误消息中所建议的那样,我确实在检查了诊断详细信息的情况下运行了模型,它提供了大型 Amat 数组,并带有以下说明:

Failed to evaluate model for ODE-Jacobian
Too many slow iterations with no progress
Line search: DX-norm scaled-residua-norm residual (unscaled)
Search direction{ -0.000634251, 6.52346E-006 }
To investigate the properties of the function, you can plot the 
function in the search direction by pasting the following 
commands in the Dymola command window:
  Amat={<...>};
  plotArray(Amat[:,1],Amat[:,2],-1);
If the graph has discontinuities, local minima above zero,
 and/or knees this explains the problem.

如您所见,它为绘制 Amat 提供了方向(以查看是否存在不连续性和局部最小值)。再次,如果我确实发现了这些违规行为,那么我应该对我的模型(方程式)进行哪些更改?

我知道提供的详细信息可能不足以回答,但是在整个运行期间有大量日志重复出现相同的故障。因此,如果有人对此有所了解,还请建议我可以添加关于我的模型或模拟的相关细节,以便回答可能很容易。

【问题讨论】:

    标签: iteration modelica dymola


    【解决方案1】:

    错误消息表明求解器无法找到模型中非线性方程组的解。这可能意味着系统没有解决方案,或者只是求解器无法找到它。如果有解但求解器找不到它,可能是由于开始条件,即非线性求解器的开始条件,而不是 ODE 求解器。显然,对于非线性系统,解可能对初始条件非常敏感,尤其是当存在多个解时。有时您会发现通过降低求解器容差(例如将其从 1e-4 更改为 1e-6)实际上可以提高稳健性,因为软件找到的数值解将更接近真实解。另一种可能性是当时没有解决方案。这就是 Dymola 在您的第二个 sn-p 中使用“Amat”数组报告的内容。如果您运行这些命令,您可能会发现有一个局部最小值不超过零,如下图所示。

    “x”代表求解器尝试的点。在这种情况下,求解器试图通过改变 x 的值并检查 f(x) 的值来找到方程 0 = f(x) 的解。它试图找到它与零交叉的地方。它尝试过的点之间仍然可能存在交叉点,但这通常意味着没有解决方案。

    现在问题变成了如果发生这种情况该怎么办。可能是系统正在接近一个不存在解决方案的点,因此您可能能够防范该区域(就像您可能防范除以零或负数的平方根一样)。显然,这取决于您的具体情况。最好的选择是完全避免非线性系统。这也将取决于您的模型和情况。根据用于创建模型的库,您可以通过从仿真设置的 Translation 选项卡生成扁平化的 Modelica 代码文件 (.mof) 来研究系统结构。然后,您可以研究生成的非线性系统,这可能会为您提供一些关于如何重新制定模型以避免非线性系统的线索。

    您可以做的另一件事是从仿真设置的“调试”选项卡中为非线性系统解决方案启用更多调试信息。在这里,您可以获得有关求解器找到的解决方案的更多详细信息(例如,找到的解决方案和每个步骤的残差值)。我不确定它是否会在您的情况下为您提供比上图更多的信息,因为没有找到解决方案,但在其他情况下它可能有用。

    【讨论】:

    • 您好,感谢您花时间回答。我将尝试为我的模型生成 .mof 并检查存在哪些非线性(以及它们是否给出了关于它可能导致失败的原因的任何指示)。当我问这个问题时,我正在寻找这种观点。 (我暂时让它保持开放状态,如果我几天没有得到更多答案/提示,我会接受这个答案)。
    • 嗨,我发现模型的变化始终如一。平面 modelica 代码 *.mof 将我引导到有问题的非线性方程组。 (它有 5 个系统,其中系统 1 有问题)。在完成各种更改后,我发现其中一个梯度变量会在给定的初始化下变为负数。解决方案是将现有的组件模型从简单的流动组件转换为体积组件。
    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2020-03-06
    • 2017-04-24
    • 1970-01-01
    相关资源
    最近更新 更多