MATLAB的fminbnd函数能够查找单变量函数在定区间上的最小值。fminbnd函数 是一个一维最小值,用于求由以下条件指定的问题的最小值:
minx f(x) such that x1<x<x2
x、x1 和 x2 是有限标量,f(x) 是返回标量的函数。
x=fminbnd(fun,x1,x2)
x=fminbnd(fun,x1,x2,options)
x=fminbnd(problem)
[x,fval]=fminbnd(___)
[x,fval,exitflag]=fminbnd(___)
[x,fval,exitflag,output]=fminbnd(___)
说明
x=fminbnd(fun,x1,x2) 返回一个值 x,该值是 fun 中描述的标量值函数在区间 x1 < x < x2 中的
局部最小值。
x=fminbnd(fun,x1,x2,options) 使用 options 中指定的优化选项执行最小化计算。
使用 optimset 可设置这些选项。
x=fminbnd(problem) 求 problem 的最小值,其中 problem 是一个结构体。
对于任何输入参数,[x,fval=fminbnd(___) 返回目标函数在 fun 的解 x 处计算出的值。
[x,fval,exitflag]=fminbnd(___) 还返回描述退出条件的值 exitflag。
[x,fval,exitflag,output]=fminbnd(___) 还返回一个包含有关优化的信息的结构体 output。
2.实例1
程序
clc;
clear all;
fun = @sin;
x1 = 0;
x2 = 2*pi;
x = fminbnd(fun,x1,x2)
x_b = 3*pi/2
运行结果
x =
4.7124
x_b =
4.7124
求通过单独的函数文件指定的函数的最小值。函数接受输入点 x 并返回表示 x 处的目标函数值的实数标量。
程序
clc;
clear all;
x = fminbnd(@scalarobjective,1,3)
function f = scalarobjective(x)
f = 0;
for k = -10:10
f = f (k 1)^2*cos(k*x)*exp(-k^2/2);
end
运行结果
结果:
x =
2.0061
监视 fminbnd 计算函数 0在区间2*pi内的最小值时所采用的步骤。
程序
clc;
clear all;
fun = @sin;
x1 = 0;
x2 = 2*pi;
options = optimset('Display','iter');
x = fminbnd(fun,x1,x2,options)
运行结果
结果:
Func-count x f(x) Procedure
1 2.39996 0.67549 initial
2 3.88322 -0.67549 golden
3 4.79993 -0.996171 golden
4 5.08984 -0.929607 parabolic
5 4.70582 -0.999978 parabolic
6 4.7118 -1 parabolic
7 4.71239 -1 parabolic
8 4.71236 -1 parabolic
9 4.71242 -1 parabolic
优化已终止:
当前的 x 满足使用 1.000000e-04 的 OPTIONS.TolX 的终止条件
x =
4.7124
通过请求所有输出返回有关 fminbnd 求解过程的所有信息。此外,还使用绘图函数监视求解过程。
程序
clc;
clear all;
close all;
fun = @sin;
x1 = 0;
x2 = 2*pi;
options = optimset('PlotFcns',@optimplotfval);
[x,fval,exitflag,output] = fminbnd(fun,x1,x2,options)
运行结果
结果:
x =
4.7124
fval =
-1.0000
exitflag =
1
output =
包含以下字段的 struct:
iterations: 8
funcCount: 9
algorithm: 'golden section search, parabolic interpolation'
message: '优化已终止:↵ 当前的 x 满足使用 1.000000e-04 的 OPTIONS.TolX 的终止条件↵'
3.实例2
程序
clc;
clear all;
close all;
fx = @(x) -(0.4./sqrt(1 x.^2) - sqrt(1 x.^2) .* (1- 0.4./(1 x.^2)) x);
[x0, f] =fminbnd(fx,0,2); % f利用负号求最小值
x = 0 :0.1: 2;
y = feval(fx,x);
%% ========maxvalue====
figure
plot(x,-y,'b-','linewidth',2)
hold on
plot(x0,-f,'o','markersize',8,'linewidth',2,'markerFacecolor','g')
xlabel('x')
ylabel('y')
text(x0, -f-0.02, 'maxvalue')
%% ==============minvalue=======
%% ========maxvalue====
figure(2)
plot(x,y,'b-','linewidth',2)
hold on
plot(x0,f,'o','markersize',8,'linewidth',2,'markerFacecolor','g')
xlabel('x')
ylabel('y')
text(x0, f 0.02, 'minvalue')
运行结果
4.函数参数设置
优化选项,指定为结构体,例如 optimset 返回的结构体。可以使用 optimset 设置或更改 options 结构体中这些字段的值。
Display |
显示级别(请参阅迭代显示): |
'notify'(默认值)仅在函数未收敛时显示输出。 |
'off' 或 'none' 不显示输出。 |
'iter' 在每次迭代时显示输出。 |
'final' 仅显示最终输出。 |
FunValCheck |
检查目标函数值是否有效。当目标函数返回的值为 complex 或 NaN 时,默认 'off' 允许 fminbnd 继续。当目标函数返回的值是 complex 或 NaN 时,'on' 设置会引发错误。 |
MaxFunEvals |
允许的函数求值的最大次数,为正整数。默认值为 500。请参阅 容差和终止条件。 |
MaxIter |
允许的迭代最大次数,为正整数。默认值为 500。请参阅 容差和终止条件。 |
OutputFcn |
以函数句柄或函数句柄的元胞数组的形式来指定优化函数在每次迭代时调用的一个或多个用户定义函数。默认值是“无”([])。请参阅 输出函数。 |
PlotFcns |
绘制执行算法过程中的各种测量值,从预定义绘图选择值,或记录您自己的值。传递函数句柄或函数句柄的元胞数组。默认值是“无”([])。 |
@optimplotx 绘制当前点 |
@optimplotfunccount 绘制函数计数 |
@optimplotfval 绘制函数值 |
有关编写自定义绘图函数的信息,请参阅绘图函数。 |
TolX |
关于正标量 x 的终止容差。默认值为 1e-4。请参阅 容差和终止条件。 |
exitflag - fminbnd 停止的原因 |
整数 |
fminbnd 停止的原因,以整数形式返回。 |
1 |
函数收敛于解 x。 |
0 |
迭代次数超出 options.MaxIter 或函数计算次数超过 options.MaxFunEvals。 |
-1 |
由输出函数或绘图函数停止。 |
-2 |
边界不一致,这意味着 x1 > x2。 |
output - 有关优化过程的信息 |
结构体 |
有关优化过程的信息,以包含下列字段的结构体形式返回: |
iterations |
执行的迭代次数 |
funcCount |
函数计算次数 |
algorithm |
'golden section search, parabolic interpolation' |
message |
退出消息 |
本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。
作 者 | 郭志龙编 辑 | 郭志龙校 对 | 郭志龙
,