约束最优化函数的比较
NMinimize、NMaximize、Minimize 和 Maximize 使用全局优化算法,因而当我们要求一个全局最优解的时候,这些方法是合适的.
Minimize 和 Maximize 可以对包括任意多项式问题的一类最优化问题找到精确的全局最优解. 然而,我们所使用的算法具有非常高的渐近复杂度,因此只适合具有少数变量的问题.
FindMinimum 只试图找到局部极小值,因此适合用于当我们需要求解局部最优解的时候,或者当我们事先知道该问题只有一个最优解,或者只有几个能通过使用不同的初始值找到的最优解.
即使对于局部优化,使用 NMinimize 解决小规模问题仍然是值得的. NMinimize 使用这四个直接搜索算法之一 (Nelder–Mead、差异演化、模拟退火和随机搜索), 然后采用KKT 解、 内点法和惩罚函数方法的组合对产生的解进行微调. 所以如果效率不是一个问题的话,NMinimize 应该比 FindMinimum 更稳健,而且得到的解还是全局最优解.
这里显示了 NMinimize 在一个具有4个变量的问题上的默认行为.
这表明,两个后处理器,KKT 与 FindMinimum,没有给我们提供默认的结果. 请注意,由于历史原因,FindMinimum 这个名字,作为 PostProcess 的选项名时,代表一个用惩罚函数方法把约束最优化问题转换为无约束最优化问题、 并且用(无约束) FindMinimum 解决问题的过程.
但是,如果效率问题非常重要,FindMinimum 可以在以下情况使用:如果你只需要一个局部最小值,或者你可以提供一个良好的初始值,或者你知道该问题只有一个极小值(例如,凸函数的情况),或者你要解决的问题很大/代价很高. 下面用FindMinimum 和 NMinimize 来解决具有7个变量的同样的问题. 这些约束条件相对来说计算代价较高. 显然在这种情况下FindMinimum 速度远远超过 NMinimize.