主要内容

当求职者失败时

太多的迭代或函数评估

求解器停止了,因为在将目标最小化到要求的公差之前,它达到了迭代或函数计算的数量的限制。要继续,请尝试下面的一个或多个。

1.启用迭代显示
2.放松容忍度
3.从不同点开始求解器
4.检查目标和约束函数定义
5.中心并缩放您的问题
6.提供梯度或雅可比
7.提供黑森

1.启用迭代显示

设置显示选择“通路”。此设置显示求解器迭代的结果。

在MATLAB启用迭代显示®命令行输入

选择= optimoptions ('solvername.”、“显示”、“iter”);

调用求解器选项结构。

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

在迭代显示中寻找什么

  • 看看目标函数(fval.或者f (x)或者Resnorm)减少。减少显示进展。

  • 检查约束违规(最大限制)确保它减少到0。减少显示进展。

  • 看看一阶的最优性是否降低0。减少显示进展。

  • 看看是否信任区域半径减少到一个小值。这减少表明目标可能不顺利。

要做什么

  • 如果解决者似乎在进步:

    1. MaxIterations和/或MaxFunctionEvaluations值大于默认值。您可以在Solver函数参考页中看到选项表中的默认值。

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

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

2.放松容忍度

如果StepTolerance或者OptimalityTolerance例如,太小,求解器可能无法识别它何时达到最小值;它可以无限期地制造徒劳的迭代。

要在命令行更改公差,请使用optimoptions如上所述设置和更改选项

finitedifferencestepsize.选择(或diffmaxchange.差异选项)可能会影响求解器的进度。这些选项控制有限差异的步长,以实现衍生估计。

3.从不同点开始求解器

看到改变初始点

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

例如,检查您的目标和非线性约束函数在某些点返回的值是否正确。看到检查您的客观和约束函数。检查一个不可行的点不会在功能中引起错误;看迭代可以违反限制

5.中心并缩放您的问题

当每个坐标对目标和约束函数的效果大致相同的效果时,求解器更可靠地运行。使用适当的标量乘以坐标方向来均衡每个坐标的效果。将适当的值添加到某些坐标以均衡其大小。

示例:居中和缩放。考虑最小化1 e6 * x (1) ^ 2 + 1 e-6 * x (2) ^ 2:

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

最小化f使用fminunc'quasi-newton'算法:

选择= optimoptions(“fminunc”,“显示”,“没有”,“算法”,“拟牛顿”);X = fminunc(f,[0.5;0.5],opts) X = 0 0.5000

结果不正确;结垢不佳妨碍得到良好的溶液。

问题的严重程度。集

D =诊断接头([1 e - 3, 1 e3]);fr = @(y) f(D*y);Y = fminunc(fr, [0.5;0.5], opts

同样,定心不好也会影响解决方案。

Fc = @(z)fr([z(1)-1e6; z(2)+ 1e6]);百分比差z = fminunc(fc,[。5 .5],opts)z = 1.0e + 005 * 10.0000 -10.0000%看起来很好,但... z  -  [1e6 -1e6]%检查如何关闭z1E6 ANS = -0.0071 0.0078%显示距离FCC = @(w)Fc([W(1)+ 1e6; w(2)-1e6]);%居中w = fminunc(fcc,[。5 .5],opts)w = 0 0%正确答案

6.提供梯度或雅可比

如果您不提供渐变或雅克比亚人,则通过有限差异提供索引估计梯度和雅典人。因此,提供这些衍生品可以节省计算时间,并且可以提高准确性。基于问题的方法可以自动提供渐变;看优化工具箱中的自动区分

对于受限制的问题,提供梯度具有另一个优点。求解器可以达到一个点x这样x是可行的,但有限的差异x总是导致一个不可行的点。在这种情况下,求解器可以过早地失败或停止。提供梯度允许求解器进行。

在文件中为目标函数和非线性约束函数提供梯度或雅可比矩阵。详细的语法请参见写标量目标函数,写矢量和矩阵目标功能, 和非线性约束

要检查渐变或雅各比函数是否正确,请使用CheckGradients选项,如检验梯度或雅可比矩阵的有效性

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

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

7.提供黑森

求解器经常在供应黑森州时更可靠地运行并且较少的迭代。

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

如果您有一个符号数学工具箱许可,您可以以编程的方式计算梯度和Hessians。例如,请参见计算梯度和黑森使用符号数学工具箱™。在基于问题的方法中提供Hessian,见基于问题的工作流程的供应衍生品

融合到一个不可行的点

通常,你会得到这个结果,因为求解器无法找到一个点,满足所有的约束ConstraintTolerance宽容。然而,求解器可能已经在可行的点处找到或开始,并融合到不可行的点。如果求解器损失可行性,请参阅解决了可行性。如果Quadprog.返回此结果,请参阅Quadprog收敛到一个不可行的点

要在求解器发现不可行的点时,请尝试以下一项或多项。

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

1.检查线性约束

尝试通过解决线性规划问题找到满足界限和线性约束的点。

  1. 使用始终为零的目标函数定义线性编程问题:

    f =零(尺寸(x0));%假设X0是初始点
  2. 求解线性规划问题,看是否存在可行点:

    Xnew = Linprog(F,A,B,AEQ,BEQ,LB,UB);
  3. 如果有可行的点xnew, 用xnew作为初始点,重新运行原来的问题。

  4. 如果没有可行点,那你的问题就没有很好的表述。检查界限和线性约束的定义。关于检查线性约束的详细信息请参见调查线性浸渍

2.检查非线性约束

在确保您的界限和线性约束是可行的(包含满足所有约束的点)后,请检查非线性约束。

  • 将您的目标函数设置为零:

    @(x)0

    使用所有约束和零目标运行优化。如果你发现一个可行的点xnew,设置x0 = xnew.并重新运行你的原始问题。

  • 如果使用零目标函数没有找到可行的点,请使用具有几个初始点的零目标函数。

    • 如果你发现一个可行的点xnew,设置x0 = xnew.并重新运行你的原始问题。

    • 如果您没有找到可行的点,请尝试放松约束,接下来讨论。

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

  1. 更改非线性约束函数c返回c -Δ,其中δ是正数。这种变化使得您的非线性约束更容易满足。

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

    1. 如果你发现一个可行的点,

      1. 减少δ.

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

    2. 如果你没有找到一个可行的点,试着增加Δ,然后再找。

如果你发现没有可行点,你的问题可能是真正不可行的,这意味着不存在解决方案。再次检查所有约束定义。

解决了可行性

如果求解器开始在可行的点,但融合到不可行点,则尝试以下技术。

  • 尝试不同的算法。的fmincon'SQP''内点'算法通常是最强大的,所以首先尝试一个或两个。

  • 收紧。给最高的和最低乌兰巴托你可以的向量。这可以帮助求解器保持可行性。的fmincon'SQP''内点'算法在每次迭代时都遵守界限,因此严格的界限有助于整个优化过程。

Quadprog.收敛到一个不可行的点

通常,你得到这个消息是因为线性约束是不一致的,或者几乎是奇异的。为了检验可行点是否存在,创建一个具有相同约束和零目标函数向量的线性规划问题f。解决使用linprog.'双重simplex'算法:

选项= Optimoptions(“linprog”,'算法','双重simplex');X = Linprog(F,A,B,AEQ,BEQ,LB,UB,选项)

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

如果linprog.找到一个可行的点,然后尝试不同Quadprog.算法。或者,改变一些容差,例如StepTolerance或者ConstraintTolerance并再次解决问题。

问题的

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

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

    limf(x)=-‖。

    而且所有的x满足问题限制。

  • 检查您的问题是否正确制定了正确。求解器尽量减少目标功能;如果您想要最大限度,请将客观函数更改为负面。例如,请参见最大化目标

  • 试着调整你的问题。看到中心并缩放您的问题

  • 通过使用放松目标限制容忍度optimoptions减少价值Objectivelimit.宽容。

FSOLVE无法解决等式

FSOLVE.可能会因为各种原因无法解出一个方程。以下是如何进行的一些建议:

  1. 尝试改变初始点FSOLVE.依赖于初始点。通过给予不同的初始点,您可以增加成功的机会。

  2. 检查方程的定义以确保它是光滑的。FSOLVE.可能无法为具有不连续梯度的方程式收敛,例如绝对值。FSOLVE.对于不连续的函数不能收敛。

  3. 检查等式是“方形”,这意味着输入和输出的等于尺寸(具有与等式的值相同的未知数)。

  4. 尤其是易换公差OptimalityToleranceStepTolerance。如果你试图通过将公差设置为非常小的值来获得高精度,FSOLVE.不能收敛。如果您设置过高的公差,FSOLVE.不能准确地解出方程。

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

相关话题