解算器已停止,因为在将目标最小化到请求的公差之前,它已达到迭代次数或函数求值的限制。若要继续,请尝试以下一个或多个操作。
1.使迭代显示 |
2.放宽公差 |
3.从不同的点开始求解 |
4.检查目标和约束函数定义 |
5.集中和调整你的问题 |
6.提供梯度或雅可比矩阵 |
7.提供粗麻布 |
设置展示
选项“国际热核实验堆”
。此设置显示解算器迭代的结果。
在MATLAB中实现迭代显示®命令行,输入
选项=最佳选项('solvername","显示","iter",;
使用选项
结构。
有关迭代显示的示例,请参见解释结果.
在迭代展示中应该寻找什么
看看目标函数(Fval
或f(x)
或重新规范
)减少。减少显示进展。
检查约束违背(马克斯约束
)以确保它向0
.减少表示进步。
看看一阶最优性是否向0
.减少表示进步。
看看信赖域半径
减小到一个小值。这一数字的下降表明目标可能不会一帆风顺。
怎么办
如果解算器似乎正在进行:
设置最大迭代次数
和/或最大函数求值
更改为大于默认值的值。您可以在求解器函数参考页的Options表中看到默认值。
从最后一个计算点开始求解。
如果求解器没有进展,请尝试其他列出的建议。
如果阶跃公差
或最佳耐受性
,例如,太小,求解器可能无法识别何时已达到最小值;它可以无休止地进行无意义的迭代。
要在命令行更改容忍度,请使用最佳选择
中描述的设置和更改选项.
这个FiniteDifferenceStepSize
选择权(或DiffMaxChange
和DiffMinChange
选项)可以影响求解器的进程。这些选项控制微分估计的有限差分步长。
看见改变起始点.
例如,检查目标约束函数和非线性约束函数在某些点返回的值是否正确。请参阅检查目标和约束函数.检查不可行点不会在函数中引起错误;看到迭代会违反约束.
当每个坐标对目标函数和约束函数的影响大致相同时,求解器运行更可靠。将坐标方向与适当的标量相乘以使每个坐标的效果相等。将适当的值添加到特定的坐标以使其大小相等。
例如:定心和缩放。考虑最小化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 %正确答案
如果不提供梯度或雅可比矩阵,求解器将通过有限差分估计梯度和雅可比矩阵。因此,提供这些导数可以节省计算时间,并可以提高精度。基于问题的方法可以自动提供梯度;看到优化工具箱中的自动微分.
对于有约束的问题,提供梯度还有另一个好处。一个解算器可以到达一个点x
以致x
是可行的,但周围的差异是有限的x
总是导致一个不可行的点。在这种情况下,求解器可能会失败或提前停止。提供梯度允许求解器继续进行。
在目标函数和非线性约束函数的文件中提供梯度或雅可比矩阵。有关语法的详细信息,请参见标量目标函数的编写,写向量和矩阵目标函数,非线性约束.
为了检验梯度函数或雅可比函数是否正确,请使用检查梯度
选项,如中所述检查梯度或雅可比矩阵的有效性.
如果您有Symbolic Math Toolbox™许可证,您可以通过编程方式计算梯度和Hessians。例如,请参见使用符号数学工具箱计算渐变和黑森值™.
关于使用梯度和雅可比矩阵的例子,请参见梯度和Hessian最小化,带有梯度的非线性约束,使用符号数学工具箱计算渐变和黑森值™,求解不含和含雅可比矩阵的非线性系统,具有雅可比矩阵的大型稀疏非线性方程组。有关基于问题的方法中的自动区分,请参阅自动微分在基于问题优化中的作用.
当你提供Hessian时,求解器通常运行更可靠,迭代次数更少。
以下求解器和算法接受Hessians:
铁铬镍铁合金
内点
.将Hessian写成一个单独的函数。例如,请参见基于解析Hessian的fmincon内点算法.
铁铬镍铁合金
trust-region-reflective
.给出Hessian作为目标函数的第三个输出。例如,请参见稠密结构Hessian线性等式的极小化.
fminunc
信赖域
.给出Hessian作为目标函数的第三个输出。例如,请参见梯度和Hessian最小化.
如果您拥有符号数学工具箱许可证,则可以通过编程方式计算渐变和黑森值。例如,请参阅使用符号数学工具箱计算渐变和黑森值™.要在基于问题的方法中提供一个Hessian,请参见基于问题的工作流中的供应衍生品.
通常,之所以会得到此结果,是因为解算器无法找到满足所有约束的点约束耐受性
宽容。然而,求解器可能已经定位或开始于一个可行点,并收敛到一个不可行点。如果求解器失去了可行性,请参见解算器失去可行性.如果quadprog
返回此结果,参见收敛于不可行点
若要在解算器没有找到可行点时继续,请尝试下列一个或多个方法。
1.检查线性约束 |
2.检查非线性约束 |
试着通过求解线性规划问题找到一个满足边界和线性约束的点。
定义一个目标函数始终为零的线性规划问题:
f = 0(大小(x0));%假设x0是起始点
解线性规划问题,看看是否存在可行点:
xnew = linprog (f, A、b Aeq,说真的,磅,乌兰巴托);
如果有一个可行的点xnew
,使用xnew
作为初始点,重新运行原始问题。
如果没有可行点,则说明问题没有得到很好的解决。请检查边界和线性约束的定义。有关检查线性约束的详细信息,请参阅研究线性不可行性.
在确保你的边界和线性约束是可行的(包含一个满足所有约束的点)之后,检查你的非线性约束。
将你的目标函数设为零:
@ (x) 0
在所有约束条件和零目标的情况下运行优化。如果你找到一个可行点xnew
设置x0 = xnew
然后重新运行原来的问题。
如果你不能用零目标函数找到可行点,那就用带有几个初始点的零目标函数。
如果你找到一个可行点xnew
设置x0 = xnew
然后重新运行原来的问题。
如果你找不到一个可行的点,试着放松约束,下面讨论。
尝试放松你的非线性不等式约束,然后收紧它们。
改变非线性约束函数C
归来c-
Δ,其中Δ为正数。此更改使非线性约束更容易满足。
为新约束函数寻找一个可行点,使用原始目标函数或零目标函数。
如果你找到一个可行点,
减少Δ
为新的约束函数寻找一个可行点,从先前找到的点开始。
如果找不到可行点,尝试增加Δ并再次查看。
如果您没有找到可行点,您的问题可能确实不可行,这意味着不存在解决方案。请再次检查所有约束定义。
如果求解器从一个可行点开始,但收敛到一个不可行点,请尝试以下技术。
尝试一种不同的算法。这个铁铬镍铁合金
“sqp”
和“内点”
算法通常是最健壮的,所以先尝试一种或两种算法。
收紧界限,给最高的分数磅
最低的乌兰巴托
向量。这可以帮助求解器保持可行性。这个铁铬镍铁合金
“sqp”
和“内点”
算法在每次迭代时都服从边界,因此严格的边界有助于整个优化过程。
quadprog
收敛到不可行点通常,由于线性约束不一致或近乎奇异,您会收到此消息。若要检查是否存在可行点,请创建具有相同约束且目标函数向量为零的线性规划问题F
.解决使用linprog
对偶单纯形的
算法:
选择= optimoptions (“linprog”,“算法”,对偶单纯形的);x = linprog (f, A、b Aeq,说真的,磅,乌兰巴托,选项)
如果linprog
没有发现可行点,那么你的问题是真正不可行的。
如果linprog
找到一个可行点,然后尝试另一个quadprog
算法。或者,改变一些公差,如阶跃公差
或约束耐受性
再解决一次问题。
解算器到达目标函数小于目标极限公差的点。
fsolve
由于各种原因,可能无法求解方程式。以下是一些如何继续的建议:
试一试改变初始点.fsolve
依赖于一个初始点。通过给它不同的初始点,你增加了成功的机会。
检查方程式的定义,确保其平滑。fsolve
对于具有不连续梯度(如绝对值)的方程可能无法收敛。fsolve
对于具有不连续性的函数,可能无法收敛。
检查方程是否为“正方形”,这意味着输入和输出的维数相同(未知数的数量与方程的值相同)。
改变公差,特别是最佳耐受性
和阶跃公差
. 如果试图通过将公差设置为非常小的值来获得高精度,fsolve
不能收敛。如果你设置的公差太高,fsolve
可能无法准确地解出方程式。
检查问题定义。有些问题没有真正的解决方案,例如X ^2 + 1 = 0
.