求解器停止了,因为在将目标最小化到要求的公差之前,它达到了迭代或函数计算的数量的限制。要继续,请尝试下面的一个或多个。
1.启用迭代显示 |
2.放松容忍度 |
3.从不同点开始求解器 |
4.检查目标和约束函数定义 |
5.中心并缩放您的问题 |
6.提供梯度或雅可比 |
7.提供黑森 |
设置显示
选择“通路”
。此设置显示求解器迭代的结果。
在MATLAB启用迭代显示®命令行输入
选择= optimoptions ('solvername.”、“显示”、“iter”);
调用求解器选项
结构。
有关迭代显示的示例,请参见解释结果。
在迭代显示中寻找什么
看看目标函数(fval.
或者f (x)
或者Resnorm
)减少。减少显示进展。
检查约束违规(最大限制
)确保它减少到0
。减少显示进展。
看看一阶的最优性是否降低0
。减少显示进展。
看看是否信任区域半径
减少到一个小值。这减少表明目标可能不顺利。
要做什么
如果解决者似乎在进步:
集MaxIterations
和/或MaxFunctionEvaluations
值大于默认值。您可以在Solver函数参考页中看到选项表中的默认值。
从最后一个计算点开始求解器。
如果求解器未进展,请尝试其他列出的建议。
如果StepTolerance
或者OptimalityTolerance
例如,太小,求解器可能无法识别它何时达到最小值;它可以无限期地制造徒劳的迭代。
要在命令行更改公差,请使用optimoptions
如上所述设置和更改选项。
的finitedifferencestepsize.
选择(或diffmaxchange.
和差异
选项)可能会影响求解器的进度。这些选项控制有限差异的步长,以实现衍生估计。
看到改变初始点。
例如,检查您的目标和非线性约束函数在某些点返回的值是否正确。看到检查您的客观和约束函数。检查一个不可行的点不会在功能中引起错误;看迭代可以违反限制。
当每个坐标对目标和约束函数的效果大致相同的效果时,求解器更可靠地运行。使用适当的标量乘以坐标方向来均衡每个坐标的效果。将适当的值添加到某些坐标以均衡其大小。
示例:居中和缩放。考虑最小化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%正确答案
如果您不提供渐变或雅克比亚人,则通过有限差异提供索引估计梯度和雅典人。因此,提供这些衍生品可以节省计算时间,并且可以提高准确性。基于问题的方法可以自动提供渐变;看优化工具箱中的自动区分。
对于受限制的问题,提供梯度具有另一个优点。求解器可以达到一个点x
这样x
是可行的,但有限的差异x
总是导致一个不可行的点。在这种情况下,求解器可以过早地失败或停止。提供梯度允许求解器进行。
在文件中为目标函数和非线性约束函数提供梯度或雅可比矩阵。详细的语法请参见写标量目标函数,写矢量和矩阵目标功能, 和非线性约束。
要检查渐变或雅各比函数是否正确,请使用CheckGradients
选项,如检验梯度或雅可比矩阵的有效性。
如果您有符号数学工具箱™许可证,则可以以编程方式计算渐变和Hessians。例如,请参见计算梯度和黑森使用符号数学工具箱™。
例如,使用渐变和雅可比人,看看用梯度和黑森州的最小化,具有梯度的非线性约束,计算梯度和黑森使用符号数学工具箱™,解决非线性系统,没有和包括雅可比, 和具有雅可比矩阵的大型稀疏非线性方程组。有关基于问题的方法中的自动区分,请参见自动微分在问题优化中的作用。
求解器经常在供应黑森州时更可靠地运行并且较少的迭代。
以下求解器和算法接受Hessians:
fmincon
内部点
。将黑森州作为单独的功能写作。例如,请参见与分析幽灵的粉刺内部点算法。
fmincon
信任区域反光
。让Hessian作为目标函数的第三产量。例如,请参见用稠密结构黑森,线性等式最小化。
fminunc
信任地区
。让Hessian作为目标函数的第三产量。例如,请参见用梯度和黑森州的最小化。
如果您有一个符号数学工具箱许可,您可以以编程的方式计算梯度和Hessians。例如,请参见计算梯度和黑森使用符号数学工具箱™。在基于问题的方法中提供Hessian,见基于问题的工作流程的供应衍生品。
通常,你会得到这个结果,因为求解器无法找到一个点,满足所有的约束ConstraintTolerance
宽容。然而,求解器可能已经在可行的点处找到或开始,并融合到不可行的点。如果求解器损失可行性,请参阅解决了可行性。如果Quadprog.
返回此结果,请参阅Quadprog收敛到一个不可行的点
要在求解器发现不可行的点时,请尝试以下一项或多项。
1.检查线性约束 |
2.检查非线性约束 |
尝试通过解决线性规划问题找到满足界限和线性约束的点。
使用始终为零的目标函数定义线性编程问题:
f =零(尺寸(x0));%假设X0是初始点
求解线性规划问题,看是否存在可行点:
Xnew = Linprog(F,A,B,AEQ,BEQ,LB,UB);
如果有可行的点xnew
, 用xnew
作为初始点,重新运行原来的问题。
如果没有可行点,那你的问题就没有很好的表述。检查界限和线性约束的定义。关于检查线性约束的详细信息请参见调查线性浸渍。
在确保您的界限和线性约束是可行的(包含满足所有约束的点)后,请检查非线性约束。
将您的目标函数设置为零:
@(x)0
使用所有约束和零目标运行优化。如果你发现一个可行的点xnew
,设置x0 = xnew.
并重新运行你的原始问题。
如果使用零目标函数没有找到可行的点,请使用具有几个初始点的零目标函数。
如果你发现一个可行的点xnew
,设置x0 = xnew.
并重新运行你的原始问题。
如果您没有找到可行的点,请尝试放松约束,接下来讨论。
尝试放松您的非线性不等式约束,然后收紧它们。
更改非线性约束函数c
返回c -
Δ,其中δ是正数。这种变化使得您的非线性约束更容易满足。
使用原始目标函数或零目标函数寻找新约束函数的可行点。
如果你发现一个可行的点,
减少δ.
寻找新的约束函数的可行点,从先前找到的点开始。
如果你没有找到一个可行的点,试着增加Δ,然后再找。
如果你发现没有可行点,你的问题可能是真正不可行的,这意味着不存在解决方案。再次检查所有约束定义。
如果求解器开始在可行的点,但融合到不可行点,则尝试以下技术。
尝试不同的算法。的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
并再次解决问题。
求解器达到一个目标函数小于目标极限公差的点。
FSOLVE.
可能会因为各种原因无法解出一个方程。以下是如何进行的一些建议:
尝试改变初始点。FSOLVE.
依赖于初始点。通过给予不同的初始点,您可以增加成功的机会。
检查方程的定义以确保它是光滑的。FSOLVE.
可能无法为具有不连续梯度的方程式收敛,例如绝对值。FSOLVE.
对于不连续的函数不能收敛。
检查等式是“方形”,这意味着输入和输出的等于尺寸(具有与等式的值相同的未知数)。
尤其是易换公差OptimalityTolerance
和StepTolerance
。如果你试图通过将公差设置为非常小的值来获得高精度,FSOLVE.
不能收敛。如果您设置过高的公差,FSOLVE.
不能准确地解出方程。
检查问题定义。有些问题没有真正的解决方案,例如x ^ 2 + 1 = 0
。