首页 文章

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

提问于
浏览
4

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

With the current settings of the model runs successfully for given simulation time (7200 Secs). 但它在日志文件中生成以下提示(在整个运行时间间歇):

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绘制了方向(为了查看是否存在不连续性和局部最小值) . 再次,如果我发现这些不规则性,它应该根据我应该对我的模型(方程式)做出的改变来规定什么?

我知道提供的细节可能不足以回答,但是在整个运行时间内存在大量日志,同时重复失败 . 因此,如果有人对此有所了解,请同时建议我可以添加有关我的模型或模拟的相关细节,以便回答可能很容易 .

1 回答

  • 3

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

    enter image description here

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

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

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

相关问题