主要内容

在解算器失败时

太多的迭代或功能评估

解算器停止,因为它达到了限制的迭代次数或函数评估之前,最小化的目标要求公差。继续,试试以下的一个或多个。

1。使迭代显示
2。放宽公差
3所示。从不同的点开始解决
4所示。检查目标和约束函数定义
5。你的问题中心和规模
6。提供梯度或雅可比矩阵
7所示。提供黑森

1。使迭代显示

设置显示选项“通路”。这个设置显示了迭代求解的结果。

使迭代在MATLAB®命令行输入

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

解算器使用选项结构。

迭代显示的一个例子,看到解释结果

寻找在迭代显示

  • 看看目标函数(Fvalf (x)Resnorm)减少。减少显示进展。

  • 检查约束违反(马克斯约束),以确保它降低0。减少显示进展。

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

  • 看看信赖域半径降低到一个很小的值。这种减少表明客观可能不会一帆风顺。

要做什么

  • 如果解决似乎进展:

    1. MaxIterations和/或MaxFunctionEvaluations比默认值较大。你可以看到选项表中的默认值解算器的函数引用页面。

    2. 从去年开始解决计算点。

  • 如果解决不进步,尝试列出的其他建议。

2。放宽公差

如果StepToleranceOptimalityTolerance例如,太小,解算器可能不承认当它达到一个最低;它可以使徒劳的迭代下去。

改变公差在命令行中,使用optimoptions中描述的设置和改变优化选项

FiniteDifferenceStepSize选择(或DiffMaxChangeDiffMinChange选项)会影响解算器的进展。这些选项控制步长有限差分微分估计。

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“拟牛顿”算法:

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

结果是不正确的;可怜的扩展干扰获得一个好的解决方案。

问题的严重程度。集

D =诊断接头([1 e - 3, 1 e3]);fr = @ (y) f (D * y);y = fminunc (fr,[0.5, 0.5],选择)y = 0 0%正确的答案

类似地,可怜的定心可以干扰解决方案。

fc = @ (z) fr ([z z (1) 1 e6; (2) + 1 e6));%不定心z = fminunc (fc,。5。5),选择)z = 1.0 e + 005 * 10.0000 - -10.0000%看起来不错,但是……z - [1 e6 e6] %检查距离z是1 e6 ans = -0.0071 - 0.0078%显示距离fcc = @ (w) fc ([w (1) + 1 e6; w (2) 1 e6]);%集中w = fminunc (fcc,。5。5],选择)w = 0 0%正确的答案

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

如果你不提供梯度或雅克比,解决估计梯度和雅克比有限的差异。因此,提供这些衍生品可以节省计算时间,可能导致增加准确性。具体问题具体分析的方法可以提供自动渐变;看到自动微分优化工具箱

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

提供梯度或雅克比的文件为你的目标函数和非线性约束函数。语法的详细信息,请参阅写作标量目标函数,写作目标函数向量和矩阵,非线性约束

检查你的梯度或雅可比矩阵函数是正确的,使用CheckGradients选项,如检查梯度或雅克比时的有效性

如果你有一个符号数学工具箱™的许可证,您可以通过编程方式计算梯度和麻布。例如,看到的计算梯度和麻布使用符号数学工具箱

对于使用梯度和雅克比示例,请参阅最小化梯度和黑森,非线性约束和梯度,计算梯度和麻布使用符号数学工具箱,解决非线性系统不包括雅可比矩阵,大型稀疏系统非线性方程的雅可比矩阵。自动分化的具体问题具体分析的方法,明白了自动微分运用优化的效果

7所示。提供黑森

解决者往往更可靠和更少的迭代运行时提供一个麻绳。

下面的解决方案和算法接受麻布:

如果你有一个符号数学工具箱的许可证,您可以通过编程方式计算梯度和麻布。例如,看到的计算梯度和麻布使用符号数学工具箱。提供一个黑森的具体问题具体分析的方法,明白了提供衍生品运用工作流

聚集到一个不可行点

通常,你得到这个结果,因为解算器无法找到满足所有约束的ConstraintTolerance宽容。然而,解算器可能位于或开始一个可行的时候,和聚合到一个不可行点。如果解决者失去了可行性,明白了解决了可行性。如果quadprog返回这个结果,明白了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最初的问题并重新运行。

    • 如果你不能找到一个可行的时候,试着用fminconEnableFeasibilityMode选项设置为真正的SubproblemAlgorithm选项设置为“重心”,如获得解决方案使用的可行性模式。试着多个初始点这些选项。

    • 如果你还没有找到一个可行点,试着放松限制,讨论下。

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

  1. 变化的非线性约束函数c返回c -Δ,Δ是一个正数。这种变化使你的非线性约束条件容易满足。

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

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

      1. 减少Δ

      2. 寻找一个可行的新的约束函数,从先前发现的点。

    2. 如果你不能找到一个可行的观点,尝试增加Δ再看。

如果你觉得不可行点,你的问题可能是真正的不可行,也就是说,不存在解决方案。再次检查你所有的约束定义。

解决了可行性

如果可行点解算器开始,但聚合到一个不可行点,尝试以下技术。

  • 尝试不同的算法。的fmincon“sqp”“内点”算法通常是最健壮的,所以先试着其中的一个或两个。

  • 收紧。给最高的和最低乌兰巴托向量,可以。这可以帮助保持可行性的解决者。的fmincon“sqp”“内点”在每次迭代算法服从界限,所以严格界限帮助整个优化。

quadprog收敛于一个不可行点

通常,你得到这消息,因为线性约束是不一致的,或几乎是单数。检查是否存在可行点,建立一个线性规划问题与相同的约束和目标函数为零向量f。解决使用linprog对偶单纯形的算法:

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

如果linprog发现不可行点,那么你的问题确实是不可行的。

如果linprog找到一个可行的点,然后尝试不同的quadprog算法。另外,改变等公差StepToleranceConstraintTolerance再解决这个问题。

问题的

目标函数的解算器达到一个点还不到客观限制宽容。

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

    limf(x)= -∞。

    等所有的x约束满足问题。

  • 检查你的问题是制定正确。解决最小化目标函数;如果你想要一个最大,改变你的目标函数负。例如,看到的最大化客观

  • 尝试扩展或中心你的问题。看到你的问题中心和规模

  • 放松的客观限制宽容通过使用optimoptions减少的价值ObjectiveLimit宽容。

fsolve无法解决的方程

fsolve可以为各种原因未能解决一个方程。这里有一些建议如何进行:

  1. 试一试改变初始点fsolve依赖于初始点。用不同的初始点,增加成功的机会。

  2. 检查方程的定义,以确保它是光滑的。fsolve可能无法收敛与不连续梯度方程,如绝对值。fsolve可以失败与不连续函数的收敛。

  3. 检查方程是“广场”,含义相同尺寸的输入和输出(有相同数量的未知数的值方程)。

  4. 改变公差,特别是OptimalityToleranceStepTolerance。如果你试图得到高精度通过设置公差很小的值,fsolve能不能收敛。如果你设置公差过高,fsolve能不能解决一个方程准确。

  5. 检查这个问题的定义。一些问题没有真正解决,如x ^ 2 + 1 = 0。如果您可以接受一个复杂的解决方案,尽量设置初始点复杂的价值。fsolve不会尝试找到一个复杂的解决方案时,初始点是真实的。

相关的话题