主要内容

当解算器可能成功的时候

终点等于起点

初始点似乎是一个局部最小值或解,因为一阶最优性测度接近于0。您可能对这个结果不满意,因为求解器并没有改进您的初始点。

如果你不确定初始点真的是局部最小值,试试:

  1. 从不同的角度出发——看改变起始点

  2. 检查您的目标和约束是否正确定义(例如,它们是否在某些点上返回正确的值?)-请参见检查你的目标和约束函数.检查一个不可行的点不会在你的函数中导致错误;看到迭代可能会违反约束

  3. 改变公差,如OptimalityToleranceConstraintTolerance,StepTolerance——看使用适当的公差

  4. 缩放你的问题,使每个坐标都有相同的效果-见重新评估问题

  5. 提供梯度和黑森信息-见提供分析梯度或雅可比矩阵而且提供黑森

局部最小值可能

求解器可能已经达到局部最小值,但不能确定,因为一阶最优性测度不小于OptimalityTolerance宽容。(要了解有关一阶最优性度量的更多信息,请参见一阶最优测度)。要查看报告的解决方案是否可靠,请考虑以下建议。

1.非光滑函数
2.重新运行“从终点开始”
3.尝试不同的算法
4.改变公差
5.重新评估问题
6.检查附近地点
7.改变有限差分选项
8.提供分析梯度或雅可比矩阵
9.提供黑森

1.非光滑函数

如果你试图最小化一个非光滑函数,或者有非光滑约束,“局部最小可能”可能是最好的退出消息。这是因为一阶最优性条件不适用于非光滑点。

为了让自己确信溶液是足够的,试着检查附近地点

2.重新运行“从终点开始”

在最后一点重新启动优化可以得到一个具有更好的一阶最优性度量的解决方案。一个更好(更低)的一阶最优性度量让你有更多的理由相信答案是可靠的。

例如,考虑下面的最小化问题使用符号数学与优化工具箱求解器

options = optimoptions('fminunc','算法','准牛顿');funh = @ (x)日志(1 + (x (1) - 4/3) ^ 2 + 3 * (x (2) - (x (1) ^ 3 - x (1))) ^ 2);[xfinal fval exitflag] = fminunc(funh,[-1;2],options)本地最小值。Fminunc停止,因为它不能沿着当前搜索方向减小目标函数。Xfinal = 1.3333 1.0370 fval = 8.5265e-014 exitflag = 5

的退出标志值5表示一阶最优测度高于函数容差。从开始再次运行最小化xfinal

[xfinal2 fval2 exitflag2] = fminunc(funh,xfinal,options)找到本地最小值。优化完成,因为梯度的大小小于函数的默认值公差。Xfinal2 = 1.3333 1.0370 fval2 = 6.5281e-014 exitflag2 = 1

局部最小值是“发现的”,而不是“可能的”,退出标志是1,而不是5.这两种解实际上是相同的。然而,第二轮有一个更令人满意的退出信息,因为一阶最优性度量足够低:7.5996 e - 007,而不是3.9674 e - 006

3.尝试不同的算法

许多求解器提供了算法的选择。不同的算法会导致使用不同的停止准则。

例如,重新运行“从终点开始”返回exitflag5从第一场比赛开始。此运行使用拟牛顿算法。

信赖域算法需要用户提供的梯度。betopt.m包含目标函数和梯度的计算:

函数[f gradf] = betopt (x) g = 1 + (x (1) 4/3) ^ 2 + 3 * (x (2) - (x(1) ^法(1)))^ 2;F = log(g);gradf (1) = 2 * (x (1) 4/3) + 6 * (x (2) - (x(1) ^法(1)))* (1 - 3 * x (1) ^ 2);Gradf (1) = Gradf (1)/g;Gradf (2) = 6*(x(2) - (x(1)^3 -x(1)))/g;

方法运行优化信赖域算法的结果是不同的exitflag:

options = optimoptions('fminunc','Algorithm','trust-region',' speciyobjectivegradient ',true);[xfinal3 fval3 exitflag3] = fminunc(@betopt,[-1;2],options)本地最小值。Fminunc停止,因为函数值相对于其初始值的最终变化小于函数公差的默认值。Xfinal3 = 1.3333 1.0370 fval3 = 7.6659e-012 exitflag3 = 3

退出条件优于拟牛顿虽然还不是最好的。从最后一点重新运行算法会产生一个更好的点,具有极小的一阶最优性度量:

[xfinal4 fval4 eflag4 output4] = fminunc(@betopt,xfinal3,options)找到本地最小值。优化完成,因为梯度的大小小于函数的默认值公差。xfinal4 = 1.3333 1.0370 fval4 = 0 eflag4 = 1 output4 = iterations: 1 funcCount: 2 cgiterations: 1 firstorderopt: 7.5497e-11 algorithm: 'trust-region' message: '发现本地最小值。优化完成,因为大小o…' constrviolation: []

4.改变公差

有时收紧或放松公差会导致更令人满意的结果。例如,选择较小的值OptimalityTolerance尝试不同的算法部分:

options = optimoptions('fminunc','Algorithm','trust-region',…OptimalityTolerance, 1 e-8 SpecifyObjectiveGradient,真实);% default=1e-6 [xfinal3 fval3 eflag3 output3] = fminunc(@betopt,[-1;2],options)发现本地最小值。优化完成,因为梯度的大小小于函数公差的选定值。xfinal3 = 1.3333 1.0370 fval3 = 0 eflag3 = 1 output3 = iterations: 15 funcCount: 16 cgiterations: 12 firstorderopt: 7.5497e-11 algorithm: 'trust-region' message: '发现本地最小值。优化完成,因为大小…' constrviolation: []

fminunc比以前多进行了一次迭代,得到了更好的解决方案。

5.重新评估问题

通过缩放和定心,尽量让每个坐标对目标函数和约束函数产生相同的效果。有关示例,请参见把你的问题集中起来并扩大

6.检查附近地点

评估你的目标函数和约束条件,如果它们存在,在接近最终点的点。如果最终点为局部极小值,则附近可行点的目标函数值较大。看到检查附近地点举个例子。

如果你有全局优化工具箱许可证,尝试运行patternsearch(全局优化工具箱)从最后一点求解。patternsearch检查附近的点,并接受所有类型的约束。

7.改变有限差分选项

中心有限差分的计算更耗时,但更准确。当你的问题可能有高曲率时,使用中心差。

要在命令行中选择中心差异,请使用optimoptions设置“FiniteDifferenceType”“中央”,而不是默认值“前进”

8.提供分析梯度或雅可比矩阵

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

对于有约束的问题,提供梯度还有另一个优势。求解器可以到达一个点x这样x是可行的,但差分是有限的x总是会导致一个不可行的点。在这种情况下,求解器可能会失败或过早停止。提供一个梯度可以让求解器继续进行。

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

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

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

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

9.提供黑森

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

以下求解器和算法接受黑森:

如果您拥有Symbolic Math Toolbox许可证,则可以通过编程方式计算梯度和黑森。有关示例,请参见计算梯度和黑森使用符号数学工具箱.要在基于问题的方法中提供Hessian,请参见基于问题的工作流程中的供给导数

例子是计算梯度和黑森使用符号数学工具箱显示fmincon在没有Hessian的情况下进行77次迭代,而在有Hessian的情况下只进行了19次迭代。

Baidu
map