通常,找到函数的最小值而非其与 x 轴交点的零值是很有用的。fminbnd 针对更简单但非常常见的情况——搜索区间有界的单变量函数而设计。对于可能具有多个变量的函数的无界最小化,使用 fminunc 或 fminsearch。这两个函数使用不同的内部算法,需要对目标函数有一定了解。对于可微的函数,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 报告算法是否成功,可能 取以下值之一:
MaxIter 或 MaxFunEvals)。
OutputFcn 终止。
应用说明:
fminunc 或 fminsearch。
fminbnd 内部使用黄金分割搜索策略。
fminbnd 和其他最小化函数的具体示例,请参阅 GNU Octave 手册的 最小化器 章节。
另请参阅: 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 可以是以下值之一:
收敛到一个解点。相对梯度误差小于
TolFun 指定的值。
最后相对步长小于 TolX。
函数值的最后相对变化小于 TolFun。
超过迭代限制——即最大算法迭代次数 MaxIter 或最大函数求值次数 MaxFunEvals。
算法被 OutputFcn 终止。
信赖域半径变得过小。
可选地,fminunc 可以返回一个包含收敛统计信息
(output)、解 x 处的输出梯度(grad)
以及解 x 处的近似黑塞矩阵(hess)的结构体。
应用说明:
fminbnd 通常是更好的选择。
fminunc 使用的算法是一种梯度搜索,依赖于目标函数是可微的。如果函数具有不连续性,最好使用无需导数的算法,如 fminsearch。
fminunc 和其他最小化函数的具体示例,请参阅 GNU Octave 手册的 最小化器 章节。
另请参阅: fminbnd、fminsearch、optimset。
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 报告算法是否成功, 可能取以下值之一:
如果算法收敛
(单纯形的大小小于 TolX 并且 迭代之间函数值的变化
小于 TolFun)。
如果达到了最大迭代次数或最大函数 求值次数。
如果迭代被 "OutputFcn" 停止。
第四个输出是一个结构体 output,包含关于
算法的运行时信息。结构体中的字段包括:funcCount(包含对 fcn 的函数调用次数)、iterations(包含迭代步数)、algorithm(搜索算法的名称,始终为:
"Nelder-Mead simplex direct search")以及 message(包含退出信息)。
示例:
fminsearch (@(x) (x(1)-5).^2+(x(2)-8).^4, [0;0])
应用说明:
某些最小化操作需要向被最小化的函数 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 的输出。
编程说明:humps 在 x = 0.300 和 0.893 附近有两个局部最大值,在 x = 0.637 附近有一个局部最小值,在 x = -0.132 和 1.300 附近有零点。humps 是测试寻找零点或局部最小值和最大值的算法的有用函数。
尝试 demo humps 查看 humps 函数的图形。
另请参阅: fzero、fminbnd、fminunc、fminsearch。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2