20.2 最小化器

通常,找到函数的最小值而非其与 x 轴交点的零值是很有用的。fminbnd 针对更简单但非常常见的情况——搜索区间有界的单变量函数而设计。对于可能具有多个变量的函数的无界最小化,使用 fminuncfminsearch。这两个函数使用不同的内部算法,需要对目标函数有一定了解。对于可微的函数,fminunc 是合适的。对于不连续的函数,或梯度搜索会失败的情况,请使用 fminsearch。 有关在存在约束函数情况下的最小化,另请参阅 优化。注意,通过简单地反转目标函数即可搜索最大值 (Fto_max = -Fto_min)。

 
x = fminbnd (fcn, a, b)
x = fminbnd (fcn, a, b, options)
[x, fval, info, output] = fminbnd (…)

求单变量函数的最小值点。

fcn 是一个函数句柄、内联函数或包含要计算函数名称的字符串。

起始区间由 a(左边界)和 b(右边界)指定。端点必须是有限值。

options 是一个指定控制算法的附加参数的结构体。目前,fminbnd 识别以下选项: "Display""FunValCheck""MaxFunEvals""MaxIter""OutputFcn""TolX"

"MaxFunEvals" 规定了优化停止前最大函数求值次数。默认值为 500。 该值必须为正整数。

"MaxIter" 规定了优化停止前最大算法迭代次数。默认值为 500。 该值必须为正整数。

"TolX" 指定解 x 的终止容差。 默认值为 1e-4

有关其他选项的描述, 请参阅 optimset。 要使用 fminbnd 的默认值初始化选项结构体, 请使用 options = optimset ("fminbnd")

退出时,函数返回 x(近似最小值点)以及 fval(在 x 处计算的函数值)。

第三个输出 info 报告算法是否成功,可能 取以下值之一:

  • 1 算法收敛到一个解。
  • 0 超过迭代限制(MaxIterMaxFunEvals)。
  • -1 算法被用户的 OutputFcn 终止。

应用说明:

  1. 最小值的搜索被限制在由 ab 界定的有限区间内。如果您只有一个起始点开始搜索,则需要使用无约束最小化算法,例如 fminuncfminsearchfminbnd 内部使用黄金分割搜索策略。
  2. 使用 匿名函数fcn 传递额外参数。 有关 fminbnd 和其他最小化函数的具体示例,请参阅 GNU Octave 手册的 最小化器 章节。

另请参阅: fzerofminuncfminsearchoptimset

 
x = fminunc (fcn, x0)
x = fminunc (fcn, x0, options)
[x, fval] = fminunc (fcn, …)
[x, fval, info] = fminunc (fcn, …)
[x, fval, info, output] = fminunc (fcn, …)
[x, fval, info, output, grad] = fminunc (fcn, …)
[x, fval, info, output, grad, hess] = fminunc (fcn, …)

求解由函数 fcn 定义的无约束优化问题。

fminunc 试图确定一个向量 x,使得 fcn (x) 是局部最小值。

fcn 是一个函数句柄、内联函数或包含要计算函数名称的字符串。fcn 应接受一个定义未知变量的向量(数组),并返回目标函数值, 可选地返回梯度。

x0 确定起始猜测值。x0 的形状在所有对 fcn 的调用中保持不变, 但在其他方面被视为列向量。

options 是一个指定控制算法的附加参数的结构体。目前,fminunc 识别以下选项: "AutoScaling""FinDiffType""FunValCheck""GradObj""MaxFunEvals""MaxIter""OutputFcn""TolFun""TolX""TypicalX"

如果 "AutoScaling""on",则变量将 根据(估计的)雅可比矩阵的列范数自动缩放。 因此,"TolFun" 变得与缩放无关。默认情况下,此选项为 "off", 因为它有时可能会产生意外(尽管数学上正确)的结果。

如果 "GradObj""on",则指定 fcn——当 使用两个输出参数调用时——还会返回所请求点处的偏一阶导数的雅可比矩阵。

"MaxFunEvals" 规定了优化停止前最大函数求值次数。默认值为 100 * number_of_variables,即 100 * length (x0)。 该值必须为正整数。

"MaxIter" 规定了优化停止前最大算法迭代次数。默认值为 400。 该值必须为正整数。

"TolX" 指定未知变量 x 的终止容差,而 "TolFun" 是目标函数 值 fval 的容差。两个选项的默认值均为 1e-6

有关其他选项的描述, 请参阅 optimset

返回时,x 是最小值的位置,fval 包含 目标函数在 x 处的值。

info 可以是以下值之一:

1

收敛到一个解点。相对梯度误差小于 TolFun 指定的值。

2

最后相对步长小于 TolX

3

函数值的最后相对变化小于 TolFun

0

超过迭代限制——即最大算法迭代次数 MaxIter 或最大函数求值次数 MaxFunEvals

-1

算法被 OutputFcn 终止。

-3

信赖域半径变得过小。

可选地,fminunc 可以返回一个包含收敛统计信息 (output)、解 x 处的输出梯度(grad) 以及解 x 处的近似黑塞矩阵(hess)的结构体。

应用说明:

  1. 如果目标函数是单变量的单个非线性方程,那么使用 fminbnd 通常是更好的选择。
  2. fminunc 使用的算法是一种梯度搜索,依赖于目标函数是可微的。如果函数具有不连续性,最好使用无需导数的算法,如 fminsearch
  3. 使用 匿名函数fcn 传递额外参数。 有关 fminunc 和其他最小化函数的具体示例,请参阅 GNU Octave 手册的 最小化器 章节。

另请参阅: fminbndfminsearchoptimset

 
x = fminsearch (fcn, x0)
x = fminsearch (fcn, x0, options)
x = fminsearch (problem)
[x, fval, exitflag, output] = fminsearch (…)

找到一个使多变量函数 fcn 最小化的 x 值。

fcn 是一个函数句柄、内联函数或包含要计算函数名称的字符串。

搜索从点 x0 开始,并使用 Nelder & Mead 单纯形算法(一种无需导数的方法)迭代。该算法更适合具有不连续性的函数,或基于梯度的搜索(如 fminunc)会失败的情况。

搜索的选项通过函数 optimset 在参数 options 中提供。目前,fminsearch 接受以下选项: "Display""FunValCheck""MaxFunEvals""MaxIter""OutputFcn""TolFun""TolX"

"MaxFunEvals" 规定了优化停止前最大函数求值次数。默认值为 200 * number_of_variables,即 200 * length (x0)。 该值必须为正整数。

"MaxIter" 规定了优化停止前最大算法迭代次数。默认值为 200 * number_of_variables,即 200 * length (x0)。 该值必须为正整数。

有关其他选项的描述, 请参阅 optimset。要使用 fminsearch 的默认值初始化选项结构体, 请使用 options = optimset ("fminsearch")

fminsearch 也可以使用单个结构体参数调用, 该结构体包含以下字段:

objective

目标函数。

x0

初始点。

solver

必须设置为 "fminsearch"

options

optimset 返回的结构体,或空矩阵以 指示应使用默认值。

options 字段是可选的。其他所有字段都是必需的。

退出时,函数返回 x(最小值点)和 fval(最小值处的函数值)。

第三个输出 exitflag 报告算法是否成功, 可能取以下值之一:

1

如果算法收敛 (单纯形的大小小于 TolX 并且 迭代之间函数值的变化 小于 TolFun)。

0

如果达到了最大迭代次数或最大函数 求值次数。

-1

如果迭代被 "OutputFcn" 停止。

第四个输出是一个结构体 output,包含关于 算法的运行时信息。结构体中的字段包括:funcCount(包含对 fcn 的函数调用次数)、iterations(包含迭代步数)、algorithm(搜索算法的名称,始终为: "Nelder-Mead simplex direct search")以及 message(包含退出信息)。

示例:

fminsearch (@(x) (x(1)-5).^2+(x(2)-8).^4, [0;0])

应用说明:

  1. 如果您需要求单变量函数的最小值,可能最好使用 fminbnd
  2. 在 Octave 10 中已删除了将参数附加到 options 之后的输入参数列表中来传递给 fcn 的旧式、未文档化的语法。向 fcn 传递参数的跨平台兼容方法是使用 匿名函数。有关 fminsearch 和其他最小化函数的具体示例,请参阅 GNU Octave 手册的 最小化器 章节。

另请参阅: fminbndfminuncoptimset

某些最小化操作需要向被最小化的函数 F 传递额外的参数。例如,F = F(x, C)。 Octave 的最小化函数设计为只向 F 传递一个优化变量,但可以通过定义一个包含必要参数的 匿名函数 来实现参数传递。请参见下面的示例:

A = 2; B = 3;
f = @(x) sin (A*x + B);
fminbnd (f, 0, 2)
   ⇒    0.8562

注意,匿名函数会保留定义时参数的值。函数定义后更改参数值不会影响函数的输出,直到重新定义函数:

B = 4;
fminbnd (f, 0, 2)
   ⇒    0.8562
f = @(x) sin (A*x + B);
fminbnd (f, 0, 2)
   ⇒    0.3562

函数 humps 是一个用于测试零点和极值查找函数的有用函数。

 
y = humps (x)
[x, y] = humps (x)

求一个具有多个最小值、最大值和过零点的函数的值。

输出 y 是对有理函数的求值:

        1200*x^4 - 2880*x^3 + 2036*x^2 - 348*x - 88
 y = - ---------------------------------------------
         200*x^4 - 480*x^3 + 406*x^2 - 138*x + 17

x 可以是标量、向量或数组。如果省略 x,则使用默认范围 [0:0.05:1]。

当使用两个输出参数调用时 [x, y],x 将包含输入值,y 将包含 humps 的输出。

编程说明:humpsx = 0.300 和 0.893 附近有两个局部最大值,在 x = 0.637 附近有一个局部最小值,在 x = -0.132 和 1.300 附近有零点。humps 是测试寻找零点或局部最小值和最大值的算法的有用函数。

尝试 demo humps 查看 humps 函数的图形。

另请参阅: fzerofminbndfminuncfminsearch


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2