不使用导数的优化
fminsearch 函数在无约束下求问题的最小值。它使用的算法不估计目标函数的任何导数。它使用 fminsearch Algorithm 中所述的几何搜索方法。
使用 fminsearch 最小化香蕉函数。同时使用一个输出函数来报告迭代序列。
fun = @(x)(100*(x(2) - x(1)^2)^2 + (1 - x(1))^2);
options = optimset('OutputFcn',@bananaout,'Display','off');
x0 = [-1.9,2];
[x,fval,eflag,output] = fminsearch(fun,x0,options);
title 'Rosenbrock solution via fminsearch'
Fcount = output.funcCount;
disp(['Number of function evaluations for fminsearch was ',num2str(Fcount)])
Number of function evaluations for fminsearch was 210
disp(['Number of solver iterations for fminsearch was ',num2str(output.iterations)])
Number of solver iterations for fminsearch was 114
使用估计导数的优化
fminunc 函数在无约束下求问题的最小值。它使用基于导数的算法。该算法不仅尝试估计目标函数的一阶导数,还尝试估计二阶导数的矩阵。fminunc 通常比 fminsearch 效率更高。
使用 fminunc 最小化香蕉函数。
options = optimoptions('fminunc','Display','off',...
'OutputFcn',@bananaout,'Algorithm','quasi-newton');
[x,fval,eflag,output] = fminunc(fun,x0,options);
title 'Rosenbrock solution via fminunc'