Modelica 模型鲁棒性问题:无法评估 ODE-Jacobian 模型

Modelica Model robustness issue: Failed to evaluate model for ODE-Jacobian

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

使用模型的当前设置 运行s 在给定的模拟时间(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 的方向(以查看是否存在不连续性和局部最小值)。同样,如果我确实发现这些违规行为,它应该根据我应该对我的模型(方程式)进行的更改来规定什么?

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

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

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

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

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