Main Content

优化故障排除和提示

下表介绍了典型的优化问题并提供了处理建议。

问题

建议

fminbndfminsearch 求出的解不是全局最小值。全局最小值在搜索空间内的所有点中具有最小的目标函数值。

除非问题是连续的且只有一个最小值,否则无法保证解就是全局最小值。要搜索全局最小值,请从多个起点开始优化(如果使用 fminbnd,则从多个区间开始优化)。

目标函数 f(x) 在某些点 x 处无法计算出值。这些点称为不可行点。

修改您的函数,以便在不可行点 x 处为 f(x) 返回较大的正值。

最小化例程似乎进入无限循环,或者返回不是最小值的解(对于 fzero,解不为零)。

可能是您的目标函数返回了 NaN 或复数值。求解器只接受实数目标函数值。任何其他值都可能导致意外结果。要确定是否存在 NaN 或复数值,请设置

options = optimset('FunValCheck','on')

并调用将 options 作为输入参量的优化函数。如果目标函数返回 NaN 或复数值,此设置将导致求解器引发错误。

求解器需要很长时间来求解。

好的起点对大多数优化问题都有帮助。可以根据您的问题特征,在某个区域尝试可能接近解的随机起点。

有时您可以使用演进方法来求解复杂的问题。首先,对具有较少自变量的问题进行求解。然后,通过适当的映射,将较简单问题的解用作更复杂问题的起点。有时候,您还可以在优化问题的初始阶段使用更简单的目标函数和更宽松的停止条件来加速求解过程。

不知道求解器在做什么。

要查看求解器在迭代过程中做了些什么,请执行以下操作:

fminsearch 未能求出解。

fminsearch 未能求出解的原因有多种。

  • 缩放不良。如果您的问题没有充分中心化和缩放,求解器可能无法正确收敛。尽量使每个坐标给予目标函数的效应大致相同,并确保接近可能解的每个坐标的比例不要太大或太小。为此,可以编辑目标函数并将每个坐标加上或乘以适当的常量。

  • 终止条件不合适。如果您为 TolFunTolX 指定的值太小,fminsearch 在找到解时可能并未意识到。如果值太大,fminsearch 可能在离解很远的地方就停止了。

  • 初始点不良。尝试从多个初始点开始 fminsearch

  • 迭代次数不够。如果求解器用尽了所有的迭代次数或卡住,请尝试从终点重新开始 fminsearch 以获得更好的解。有时候,如果您在默认值 200*length(x0) 的基础上增大 MaxFunEvalsMaxIter 选项的值,fminsearch 可以得出更好的解。

注意

优化求解器适用于实数值函数。复数值无法优化(除了复数值的实数值函数,例如范数)。

相关主题