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.

有关其他参数的描述,详见optimsetfminbnd使用的初始化参数结构体的默认值为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*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可以返回在解决方案x收敛的统计结果结构体(output),输出梯度(grad),和与解决方案x相似的海森矩阵(hess).

注意:

  1. 如果目标函数是一个变量的单个非线性方程,则使用fminbnd通常是更好的选择。
  2. 使用的算法fminunc是一种依赖于目标函数可微的梯度搜索。 如果函数不连续,则最好使用无导数算法,例如fminsearch.
  3. 使用匿名函数传入额外参数给fcn。 这样的写法可用于fminunc和其他最优化函数,详见最优化示例

详见: 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*length(x0)。该值必须是正整数。

"MaxIter"禁止在停止优化之前的最大算法迭代次数。默认值为200 * number_of_variables,即,200*length(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