主要内容

当解算器可能已经成功了

最后一点等于初始点

起始点似乎是一个局部最小值或解决方案,因为一阶最优性测量接近0。你可能会对这个结果不满意,自解算器没有改善你的初始点。

如果你不确定,最初确实是一个局部最小值点,试一试:

  1. 从不同的点,看到的改变初始点

  2. 检查你的目标和约束正确定义(例如,他们返回正确的值在某个点吗?),看到的检查你的目标和约束函数。检查一个不可行点并不会导致一个错误在你的函数;看到迭代可以违反约束

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

  4. 扩展你的问题所以每个坐标有同样的效果——看到重新调节问题

  5. 提供梯度和黑森——看到的信息提供分析梯度或雅可比矩阵提供一个黑森

当地最低可能的

解算器可能已经达到当地最低,但不能确定,因为一阶最优性措施不小于OptimalityTolerance宽容。(了解更多关于一阶最优性测量,见一阶最优性测量)。是否报告解决方案是可靠的,可以考虑以下建议。

1。非光滑函数
2。在最后一个点重新开始
3所示。尝试不同的算法
4所示。改变公差
5。重新调节问题
6。检查附近的点
7所示。改变有限差分方法
8。提供分析梯度或雅可比矩阵
9。提供一个黑森

1。非光滑函数

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

为了满足自己的解决方案是适当的,试一试检查附近的点

2。在最后一个点重新开始

重启一个优化的最后一点会导致解决方案更好的一阶最优性措施。一个更好的(低)一阶最优性测量给你更多理由相信答案是可靠的。

例如,考虑下面的最小化问题,从例子用符号数学优化工具箱解决者:

选择= 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]选项)局部最小值。fminunc停止,因为它不能减少目标函数在当前的搜索方向。xfinal fval 1.0370 = 1.3333 = 8.5265 e - 014 exitflag = 5

出口标志的价值5表明函数上方的一阶最优性测量是宽容。再次运行最小化从xfinal:

[xfinal2 fval2 exitflag2] = fminunc (funh、xfinal选项)局部最小值。优化完成因为梯度的大小小于默认值函数的宽容。xfinal2 fval2 1.0370 = 1.3333 = 6.5281 e - 014 exitflag2 = 1

局部最小值是“发现”,而不是“有可能,”和exitflag1,而不是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 =日志(g);gradf (1) = 2 * (x (1) 4/3) + 6 * (x (2) - (x(1) ^法(1)))* (1 - 3 * x (1) ^ 2);gradf (1) = gradf / g (1);gradf (2) = 6 * (x (2) - (x (1) ^ 3 - x (1))) / g;

运行优化使用信赖域算法结果exitflag不同:

选择= optimoptions (“fminunc”、“算法”、“信赖域”,“SpecifyObjectiveGradient”,真正的);[xfinal3 fval3 exitflag3] = fminunc (@betopt[1, 2]选项)局部最小值。fminunc停止是因为最后的函数值的变化相对于其初始值小于默认值函数的宽容。xfinal3 fval3 1.0370 = 1.3333 = 7.6659 e - 012 exitflag3 = 3

比退出条件拟牛顿条件,尽管它还不是最好的。重新运行该算法从最终点产生一个更好点,极小的一阶最优性措施:

[xfinal4 fval4 eflag4 output4] = fminunc (@betopt、xfinal3选项)局部最小值。优化完成因为梯度的大小小于默认值函数的宽容。xfinal4 = 1.3333 - 1.0370 fval4 = 0 eflag4 = 1 output4 =迭代:1 funcCount: 2 cgiterations: 1 firstorderopt: 7.5497 e-11算法:“信赖域”的信息:“局部最小值。优化完成,因为大小啊……“constrviolation: []

4所示。改变公差

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

选择= optimoptions (“fminunc”、“算法”、“信赖域”,…OptimalityTolerance, 1 e-8 SpecifyObjectiveGradient,真实);%默认= 1 e-6 [xfinal3 fval3 eflag3 output3] = fminunc (@betopt、[1, 2]选项)局部最小值。优化完成因为梯度的大小小于所选值函数的宽容。xfinal3 = 1.3333 - 1.0370 fval3 = 0 eflag3 = 1 output3 =迭代:15 funcCount: 16 cgiterations: 12 firstorderopt: 7.5497 e-11算法:“信赖域”的信息:“局部最小值。优化完成,因为大小……“constrviolation: []

fminunc比以前多一个迭代,到达一个更好的解决方案。

5。重新调节问题

试图让每个坐标给同样的效果在目标和约束函数通过缩放和定心。有关示例,请参见你的问题中心和规模

6。检查附近的点

评估你的目标函数和约束,如果他们存在,在点附近的最后一点。如果最终是一个局部最小值点,可行点附近有较大的目标函数值。看到检查附近的点了一个例子。

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

7所示。改变有限差分方法

中央有限的差异更耗时的评估,但更准确。使用中央差异当你的问题可以有很高的曲率。

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

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

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

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

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

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

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

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

9。提供一个黑森

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

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

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

中的例子计算梯度和麻布使用符号数学工具箱显示fmincon77次迭代的麻绳,但只有19个迭代的麻绳。