主要内容

当求解器失败时

太多的迭代或函数计算

解算器已停止,因为在将目标最小化到请求的公差之前,它已达到迭代次数或函数求值的限制。若要继续,请尝试以下一个或多个操作。

1.使迭代显示
2.放宽公差
3.从不同的点开始求解
4.检查目标和约束函数定义
5.集中和调整你的问题
6.提供梯度或雅可比矩阵
7.提供粗麻布

1.使迭代显示

设置展示选项“国际热核实验堆”。此设置显示解算器迭代的结果。

在MATLAB中实现迭代显示®命令行,输入

选项=最佳选项('solvername","显示","iter",;

使用选项结构。

有关迭代显示的示例,请参见解释结果

在迭代展示中应该寻找什么

  • 看看目标函数(Fvalf(x)重新规范)减少。减少显示进展。

  • 检查约束违背(马克斯约束)以确保它向0.减少表示进步。

  • 看看一阶最优性是否向0.减少表示进步。

  • 看看信赖域半径减小到一个小值。这一数字的下降表明目标可能不会一帆风顺。

怎么办

  • 如果解算器似乎正在进行:

    1. 设置最大迭代次数和/或最大函数求值更改为大于默认值的值。您可以在求解器函数参考页的Options表中看到默认值。

    2. 从最后一个计算点开始求解。

  • 如果求解器没有进展,请尝试其他列出的建议。

2.放宽公差

如果阶跃公差最佳耐受性,例如,太小,求解器可能无法识别何时已达到最小值;它可以无休止地进行无意义的迭代。

要在命令行更改容忍度,请使用最佳选择中描述的设置和更改选项

这个FiniteDifferenceStepSize选择权(或DiffMaxChangeDiffMinChange选项)可以影响求解器的进程。这些选项控制微分估计的有限差分步长。

3.从不同的点开始求解

看见改变起始点

4.检查目标和约束函数定义

例如,检查目标约束函数和非线性约束函数在某些点返回的值是否正确。请参阅检查目标和约束函数.检查不可行点不会在函数中引起错误;看到迭代会违反约束

5.集中和调整你的问题

当每个坐标对目标函数和约束函数的影响大致相同时,求解器运行更可靠。将坐标方向与适当的标量相乘以使每个坐标的效果相等。将适当的值添加到特定的坐标以使其大小相等。

例如:定心和缩放。考虑最小化1e6*x(1)^2+1e-6*x(2)^2:

f=@(x)10^6*x(1)^2+10^-6*x(2)^2;

减少F使用fminunc“拟牛顿”算法:

opts=optimoptions('fminunc','Display','none','Algorithm','quasi-newton');x=fminunc(f[0.5;0.5],opts)x=0.5000

结果不正确;不良的缩放影响了获得良好的解决方案。

调整问题的规模。设置

D=diag([1e-3,1e3]);fr=@(y)f(D*y);y=fminunc(fr[0.5;0.5],opts)y=0%正确答案

同样,对中不当也会影响解决方案。

fc = @ (z) fr ([z z (1) 1 e6; (2) + 1 e6));%差定心z = fminunc(fc,[。5 . z = 1.0e+005 * 10.0000 -10.0000 %看起来不错,但是…% checking Z is how close to 1e6 ans = -0.0071 0.0078%揭示距离FCC = @(w)fc([w(1)+1e6;w(2)-1e6]);% center w = fminunc(fcc,[.])5 .5],选项w = 0 %正确答案

6.提供梯度或雅可比矩阵

如果不提供梯度或雅可比矩阵,求解器将通过有限差分估计梯度和雅可比矩阵。因此,提供这些导数可以节省计算时间,并可以提高精度。基于问题的方法可以自动提供梯度;看到优化工具箱中的自动微分

对于有约束的问题,提供梯度还有另一个好处。一个解算器可以到达一个点x以致x是可行的,但周围的差异是有限的x总是导致一个不可行的点。在这种情况下,求解器可能会失败或提前停止。提供梯度允许求解器继续进行。

在目标函数和非线性约束函数的文件中提供梯度或雅可比矩阵。有关语法的详细信息,请参见标量目标函数的编写,写向量和矩阵目标函数,非线性约束

为了检验梯度函数或雅可比函数是否正确,请使用检查梯度选项,如中所述检查梯度或雅可比矩阵的有效性

如果您有Symbolic Math Toolbox™许可证,您可以通过编程方式计算梯度和Hessians。例如,请参见使用符号数学工具箱计算渐变和黑森值™

关于使用梯度和雅可比矩阵的例子,请参见梯度和Hessian最小化,带有梯度的非线性约束,使用符号数学工具箱计算渐变和黑森值™,求解不含和含雅可比矩阵的非线性系统,具有雅可比矩阵的大型稀疏非线性方程组。有关基于问题的方法中的自动区分,请参阅自动微分在基于问题优化中的作用

7.提供粗麻布

当你提供Hessian时,求解器通常运行更可靠,迭代次数更少。

以下求解器和算法接受Hessians:

如果您拥有符号数学工具箱许可证,则可以通过编程方式计算渐变和黑森值。例如,请参阅使用符号数学工具箱计算渐变和黑森值™.要在基于问题的方法中提供一个Hessian,请参见基于问题的工作流中的供应衍生品

收敛到不可行点

通常,之所以会得到此结果,是因为解算器无法找到满足所有约束的点约束耐受性宽容。然而,求解器可能已经定位或开始于一个可行点,并收敛到一个不可行点。如果求解器失去了可行性,请参见解算器失去可行性.如果quadprog返回此结果,参见收敛于不可行点

若要在解算器没有找到可行点时继续,请尝试下列一个或多个方法。

1.检查线性约束
2.检查非线性约束

1.检查线性约束

试着通过求解线性规划问题找到一个满足边界和线性约束的点。

  1. 定义一个目标函数始终为零的线性规划问题:

    f = 0(大小(x0));%假设x0是起始点
  2. 解线性规划问题,看看是否存在可行点:

    xnew = linprog (f, A、b Aeq,说真的,磅,乌兰巴托);
  3. 如果有一个可行的点xnew,使用xnew作为初始点,重新运行原始问题。

  4. 如果没有可行点,则说明问题没有得到很好的解决。请检查边界和线性约束的定义。有关检查线性约束的详细信息,请参阅研究线性不可行性

2.检查非线性约束

在确保你的边界和线性约束是可行的(包含一个满足所有约束的点)之后,检查你的非线性约束。

  • 将你的目标函数设为零:

    @ (x) 0

    在所有约束条件和零目标的情况下运行优化。如果你找到一个可行点xnew设置x0 = xnew然后重新运行原来的问题。

  • 如果你不能用零目标函数找到可行点,那就用带有几个初始点的零目标函数。

    • 如果你找到一个可行点xnew设置x0 = xnew然后重新运行原来的问题。

    • 如果你找不到一个可行的点,试着放松约束,下面讨论。

尝试放松你的非线性不等式约束,然后收紧它们。

  1. 改变非线性约束函数C归来c-Δ,其中Δ为正数。此更改使非线性约束更容易满足。

  2. 为新约束函数寻找一个可行点,使用原始目标函数或零目标函数。

    1. 如果你找到一个可行点,

      1. 减少Δ

      2. 为新的约束函数寻找一个可行点,从先前找到的点开始。

    2. 如果找不到可行点,尝试增加Δ并再次查看。

如果您没有找到可行点,您的问题可能确实不可行,这意味着不存在解决方案。请再次检查所有约束定义。

解算器失去可行性

如果求解器从一个可行点开始,但收敛到一个不可行点,请尝试以下技术。

  • 尝试一种不同的算法。这个铁铬镍铁合金“sqp”“内点”算法通常是最健壮的,所以先尝试一种或两种算法。

  • 收紧界限,给最高的分数最低的乌兰巴托向量。这可以帮助求解器保持可行性。这个铁铬镍铁合金“sqp”“内点”算法在每次迭代时都服从边界,因此严格的边界有助于整个优化过程。

quadprog收敛到不可行点

通常,由于线性约束不一致或近乎奇异,您会收到此消息。若要检查是否存在可行点,请创建具有相同约束且目标函数向量为零的线性规划问题F.解决使用linprog对偶单纯形的算法:

选择= optimoptions (“linprog”,“算法”,对偶单纯形的);x = linprog (f, A、b Aeq,说真的,磅,乌兰巴托,选项)

如果linprog没有发现可行点,那么你的问题是真正不可行的。

如果linprog找到一个可行点,然后尝试另一个quadprog算法。或者,改变一些公差,如阶跃公差约束耐受性再解决一次问题。

无界问题

解算器到达目标函数小于目标极限公差的点。

  • 你的问题可能真的是无界的。换句话说,有一系列的点x

    F(x) = -∞。

    这样所有的x满足问题约束条件。

  • 检查你的问题是否表述正确。求解器试图最小化目标函数;如果你想要一个最大值,将你的目标函数改为负的。例如,请参见最大化客观

  • 尝试缩放或调整问题中心。请参阅集中和调整你的问题

  • 放宽客观极限公差最佳选择以降低其价值ObjectiveLimit宽容。

解不出方程

fsolve由于各种原因,可能无法求解方程式。以下是一些如何继续的建议:

  1. 试一试改变初始点fsolve依赖于一个初始点。通过给它不同的初始点,你增加了成功的机会。

  2. 检查方程式的定义,确保其平滑。fsolve对于具有不连续梯度(如绝对值)的方程可能无法收敛。fsolve对于具有不连续性的函数,可能无法收敛。

  3. 检查方程是否为“正方形”,这意味着输入和输出的维数相同(未知数的数量与方程的值相同)。

  4. 改变公差,特别是最佳耐受性阶跃公差. 如果试图通过将公差设置为非常小的值来获得高精度,fsolve不能收敛。如果你设置的公差太高,fsolve可能无法准确地解出方程式。

  5. 检查问题定义。有些问题没有真正的解决方案,例如X ^2 + 1 = 0

相关的话题