fminunc解无约束优化
用梯度类算法求多变量无约束函数的最小值. fminunc解无约束优化提供了大型优化和中型优化算法。
语法
x = fminunc(fun,x0)
x = fminunc(fun,x0,options)
[x,fval] = fminunc(...)
[x,fval,exitflag] = fminunc(...)
[x,fval,exitflag,output] = fminunc(...)
[x,fval,exitflag,output,grad]=fminunc(fun,x0,options)
[x,fval,exitflag,output,grad,hessian]=fminunc(fun,x0,options)
解释
fminunc能够从一个初始值开始,找到一个标量函数的最小值。通常被称为无约束非线性优化.
x = fminunc(fun,x0) 从x0开始,找到函数fun中的局部最小值x,x0可以是标量,向量,矩阵。fun是一个函数句柄.
x = fminunc(fun,x0,options) 以优化参数指定的结构最小化函数,可以用optimset函数定义这些参数。(见matlab help)
[x,fval] = fminunc(...)返回在结果x出的目标函数的函数值
[x,fval,exitflag] = fminunc(...) 返回exitflag值来表示fminunc退出的条件:
1--函数找到结果x
0--函数最大功能评价次数达到,或者是迭代次数达到
-1--算法由外部函数结束
[x,fval,exitflag,output] = fminunc(...) 返回一个结构输出output,包含最优化函数的信息:
output.algorithm 使用的优化算法
output.funcCount 函式计算次数
output.iterations 迭代次数
output.message 退出信息
grad:返回目标函数在最优解x点的梯度:
hessian:返回目标函数在最优解x点的Hessian矩阵值。
说明
fun是需要最小化的函数,他的输入为input,输出为标量f,目标函数在x上作出估计,函数可以为M文件的一个句柄函数(当是M文件时,用单引号括起文件名):
functionx = fminunc(@myfun, x0)
这里function f = myfun(x)
f = ... 其自变量为x
或者直接写出
asx = fminunc(@(x,y)sin(x^2+y^2), x0);
优化参数选项Options设置
可以通过 optimoptions 函数设置或改变这些参数。其中有的参数适用于所有的优化算法,有的则只适用于大型优化问题,另外一些则只适用于中型问题。
首先描述适用于大型问题的选项。这仅仅是一个参考,因为使用大型问题算法有一些条件。对于fminunc函数来说,必须提供梯度信息。
由选项中的参数LargeScale控制
LargeScale=‘on' (默认值),使用大型算法
LargeScale=‘off' (默认值),使用中型算法
fminunc为中型优化算法的搜索方向提供了4种算法,由选项中的参数HessUpdate控制
HessUpdate=‘bfgs’(默认值),拟牛顿法的BFGS公式;
HessUpdate=‘dfp’,拟牛顿法的DFP公式;
HessUpdate='steepdesc',最速下降法
例子
例: 求函数f(X)=3*x1^2+2*x1*x2+x2^2的最小值。
首先编写f(x)的.m文件
function f=myfun(x)
f=3*x(1)^2+2*x(1)*x(2)+x(2)^2;
然后调用函数fminunc
x0=[1,1] %起始点
options = optimoptions(@fminunc,'Algorithm','quasi-newton')
[x,fval]=fminunc(@myfun,x0,options)