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。如果您只有一个起始点可以开始搜索,则需要使用未经训练的最小化算法,例如fminuncfminsearch. fminbnd内部使用黄金分割搜索策略。
  2. 使用 Anonymous Functions 可以向 fcn 传入额外参数. 要获取特定例程以用于 fminbnd 和其他 优化函数,详见 Minimizers 手册中的 一节.

详见: fzero, fminunc, fminsearch, optimset.

广告
 
: 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*长度(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),输出梯度(grad)在解决方案x,和近似的黑森(hess)在解决方案x.

注意:

  1. 如果目标函数是一个变量的单个非线性方程,则使用fminbnd通常是更好的选择。
  2. 使用的算法fminunc是一种依赖于目标函数可微的梯度搜索。如果函数具有不连续性,则最好使用无导数算法,例如fminsearch.
  3. The algorithm used by fminunc is a gradient search which depends on the objective function being differentiable. If the function has discontinuities it may be better to use a derivative-free algorithm such as fminsearch.
  4. Use Anonymous Functions to pass additional parameters to fcn. For specific examples of doing so for fminunc and other minimization functions see the Minimizers section of the GNU Octave manual.

详见: fminbnd, fminsearch, optimset.

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

查找的值x使多变量函数最小化fcn.

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

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

参数中提供了搜索参数options使用函数optimset目前,fminsearch接受以下参数:"Display", "FunValCheck","MaxFunEvals","MaxIter", "OutputFcn", "TolFun", "TolX".

"MaxFunEvals"禁止在停止优化之前进行最大数量的函数评估。默认值为200 * number_of_variables即。,200*长度(x0)。该值必须是正整数。

"MaxIter"禁止在停止优化之前的最大算法迭代次数。默认值为200 * number_of_variables即。,200*长度(x0)。该值必须是正整数。

有关其他参数的描述,详见optimset。使用的默认值初始化参数结构体fminsearch使用options = optimset ("fminsearch").

fminsearch也可以用具有以下字段的单个结构体参数调用:

objective

目标函数。

广告
x0

起点。

广告
solver

必须设置为"fminsearch".

广告
options

从返回的结构体optimset或者一个空矩阵来指示应该使用默认值。

广告

该fieldoptions是可选的。所有其他都是必需的。

退出时,函数返回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. 旧版的, 文档中没有的 fcn 传参语法可以用于 在 options 传参,不推荐这种用法 且在Octave 10中将移除. 推荐的、 跨平台的 fcn 传参用法详见 Anonymous Functions. 要获取特定例程以用于 fminsearch 和其他 优化函数,详见 Minimizers 手册中的 一节.

详见: fminbnd, fminunc, optimset.

广告

特定的优化操作需要传入额外 参数, F, 即被优化的函数. 例如, F = F(x, C) . Octave的优化函数被设计仅能传入一个优化 变量到 F, 传入更多的参数可以通过 一个 Anonymous Function 接收优化变量 来实现. 例如:

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是一个有用的函数,用于测试零和xtrema查找函数。

 
: 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.

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

尝试demo humps查看的情节humps作用

详见: fzero, fminbnd, fminunc, fminsearch.

广告

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

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