|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
Matlab优化工具箱详解
1.fminbnd
进行有约束的一元函数最小值求解。它的求解命令是:
X = FMINBND(FUN,x1,x2),FUN 是目标函数,可以为表达式字符串或MATLAB自定义函数的函数柄,要求解在约束 x1 <= X <= x2下的最优解X*。
还有其他一些求解命令是:
x = fminbnd(fun,x1,x2,options) % options为指定优化参数选项,由OPTIMSET设定
[x,fval] = fminbnd(…) % fval为目标函数的最小值
[x,fval,exitflag] = fminbnd(…) %exitflag为终止迭代的原因
[x,fval,exitflag,output] = fminbnd(…) % output为优化信息
说明:若参数exitflag>0,表示函数收敛于x,若exitflag=0,表示达到了最大迭代次数,exitflag<0表示函数不收敛于x;若参数output=iterations表示迭代次数,output=funccount表示函数赋值次数,output=algorithm表示所使用的算法。
例子:要求解f(x)=x3-2x-5在(0,2)之间最优解,求解命令如下:
f = @(x)x.^3-2*x-5;
x = fminbnd(f, 0, 2);
2.fminsearch
进行多变量函数的无约束优化。
格式主要有:
x = fminsearch(fun,x0);%对函数fun,从x0开始搜索最优值,返回最优变量x
x = fminsearch(fun,x0,options);%可以用optimset设置一些优化选项;
[x,fval] = fminsearch(...);%返回feval为最优函数值;
[x,fval,exitflag] = fminsearch(...);%exitflag与fminbnd类似;
[x,fval,exitflag,output] = fminsearch(...);%output与fminbnd类似;
例子:要求函数f (x)= 100*(x(2)-x(1)^2)^2+(1-x(1))^2的最小值,用fminsearch求解如下:
fun = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2;
[x,fval] = fminsearch(fun,[-1.2, 1]);
3.fminunc
与fminsearch一样,也是对多变量无约束函数优化。
指令格式:
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(...);%grad为解x处的梯度值;
[x,fval,exitflag,output,grad,hessian] = fminunc(...);% 目标函数在解x处的海赛(Hessian)值。
从算法上来讲,当函数的阶数大于2时,fminunc比fminsearch更有效,因为它采用了基于梯度的优化算法,而fminsearch采用的是Nelder-Mead型简单搜寻法,但是,正因为这样,当函数不连续时,fminsearch的效果反而更好。
4.fmincon
对有约束的多变量函数巡优。
格式:
x = fmincon(fun,x0,A,b)
x = fmincon(fun,x0,A,b,Aeq,beq)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
[x,fval] = fmincon(...)
[x,fval,exitflag] = fmincon(...)
[x,fval,exitflag,output] = fmincon(...)
[x,fval,exitflag,output,lambda] = fmincon(...)
[x,fval,exitflag,output,lambda,grad] = fmincon(...)
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(...)
其中一些参数的定义见非线性有约束多变量函数的标准形式:
min f(x)
sub.to C(x)<=0
Ceq(x)=0
A*x<=b
Aeq*x=beq
lb<=x<=ub
其中非线性不等式C(x)和等式Ceq(x)定义在nonlcon中。通过指定函数柄来使用,如:>>x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon),先建立非线性约束函数,并保存为mycon.m:function [C,Ceq] = mycon(x)
C = … % 计算x处的非线性不等约束 的函数值。
Ceq = … % 计算x处的非线性等式约束的函数值。
lambda是Lagrange乘子,它体现哪一个约束有效。
output为输出优化信息;
grad表示目标函数在x处的梯度;
hessian表示目标函数在x处的Hessiab值。
例如,目标函数为:
function f = myfun(x)
f = -x(1) * x(2) * x(3);
约束为:
0≤x(1)+2x(2)+2x(3) ≤72
那么我们可以将其写成Ax≤b的形式,则
A=[-1 -2 -2;1 2 2];b=[0;b];
求解命令为:
x0 = [10; 10; 10]; % 初始值
[x,fval] = fmincon(@myfun,x0,A,b) |
评分
-
1
查看全部评分
-
|