通常,找到函数的最小值是有用的,而调整函数与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 和其他
优化函数,详见 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可以是以下值之一:
聚合到解决方案点。相对梯度误差小于指定的TolFun.
上次相对步长小于TolX.
函数值的上次相对变化小于TolFun.
超过迭代限制--算法迭代的最大次数MaxIter或函数评估的最大数量MaxFunEvals.
算法终止于OutputFcn.
信任区域半径变得过小。
可选地,fminunc可以返回在解决方案x收敛的统计结果结构体(output),输出梯度(grad),和与解决方案x相似的海森矩阵(hess).
注意:
fminbnd通常是更好的选择。
fminunc是一种依赖于目标函数可微的梯度搜索。
如果函数不连续,则最好使用无导数算法,例如fminsearch.
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返回算法是否成功,并可能采用以下值之一:
如果算法收敛(单纯形的大小小于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])
注意:
fminbnd.
fminsearch 和其他
优化函数,详见 Minimizers 手册中的
一节.
特定的优化操作需要传入额外
参数, 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