类 型 | 模 型 | 基本函数名 |
---|---|---|
一元函数极小 | m i n F ( x ) s . t . x 1 < x < x 2 min F(x)\\s.t.\ x1 |
x = f m i n b n d ( ‘ F ’ , x 1 , x 2 ) x=fminbnd(‘F’,x1,x2) x=fminbnd(‘F’,x1,x2) |
无约束极小 | m i n F ( X ) min F(X) minF(X) | X = f m i n u n c ( ‘ F ’ , X 0 ) X = f m i n s e a r c h ( ‘ F ’ , X 0 ) X=fminunc(‘F’,X0) \\ X=fminsearch(‘F’,X0) X=fminunc(‘F’,X0)X=fminsearch(‘F’,X0) |
线性规划 | m i n c T s . t . A X ≤ b minc^T \\ s.t.\ AX≤b mincTs.t. AX≤b | X = l i n p r o g ( c , A , b ) X=linprog(c,A,b) X=linprog(c,A,b) |
二次规划 | m i n 1 2 x T H x + c T x s . t . A x ≤ b min\frac{1}{2}xTHx+cTx \\ s.t.\ Ax≤b min21xTHx+cTxs.t. Ax≤b | X = q u a d p r o g ( H , c , A , b ) X=quadprog(H,c,A,b) X=quadprog(H,c,A,b) |
约束极小(非线性规划) | m i n F ( X ) s . t . G ( X ) ≤ 0 min F(X) s.t. G(X)≤0 minF(X)s.t.G(X)≤0 | X = f m i n c o n ( ‘ F G ’ , X 0 ) X=fmincon(‘FG’,X0) X=fmincon(‘FG’,X0) |
达到目标问题 | m i n r s . t . F ( x ) − w r ≤ g o a l min r\\s.t.\ F(x)-wr ≤ goal minrs.t. F(x)−wr≤goal | X = f g o a l a t t a i n ( ‘ F ’ , x , g o a l , w ) X=fgoalattain(‘F’,x, goal,w) X=fgoalattain(‘F’,x,goal,w) |
极小极大问题 | m i n x m a x F i ( x ) { F i ( x ) } s . t . G ( x ) ≤ 0 min_x max_{F_i(x)}\{F_i(x)\} \\s.t.\ G(x)≤0 minxmaxFi(x){ Fi(x)}s.t. G(x)≤0 | X = f m i n i m a x ( ‘ F G ’ , x 0 ) X=fminimax(‘FG’,x0) X=fminimax(‘FG’,x0) |
x x x —— 由优化函数求得的值。若 e x i t f l a g > 0 exitflag>0 exitflag>0,则 x x x为解;否则, x x x不是最终解,它只是迭代停止时优化过程的值
f v a l fval fval —— 解 x x x处的目标函数值
e x i t f l a g exitflag exitflag —— 描述退出条件:
e x i t f l a g > 0 exitflag>0 exitflag>0:表示目标函数收敛于解 x x x处
e x i t f l a g = 0 exitflag=0 exitflag=0:表示已达到函数评价或迭代的最大次数
e x i t f l a g < 0 exitflag<0 exitflag<0:表示目标函数不收敛
o u t p u t output output —— 包含优化结果信息的输出结构.:
I t e r a t i o n s Iterations Iterations:迭代次数
A l g o r i t h m Algorithm Algorithm:所采用的算法
F u n c C o u n t FuncCount FuncCount:函数评价次数
D i s p l a y Display Display:显示水平。取值为 ′ o f f ′ 'off' ′off′时,不显示输出;取值为 ′ i t e r ′ 'iter' ′iter′时,显示每次迭代的信息;取值为 ′ f i n a l ′ 'final' ′final′时,显示最终结果.默认值为 ′ f i n a l ′ 'final' ′final′
M a x F u n E v a l s MaxFunEvals MaxFunEvals: 允许进行函数评价的最大次数,取值为正整数
M a x I t e r MaxIter MaxIter: 允许进行迭代的最大次数,取值为正整数
option1 = optimset(optimfun)
% 创建一个含有所有参数名,并与优化函数optimfun相关的默认值的选项结构
option2 = optimset('param1','value1','param2','value2'...)
% 创建一个名称为option2的优化选项参数,其中指定的参数具有指定值,所有未指定的参数取默认值
option3 = optimset(old_options,'param1','value1','param2','value2'...)
% 创建名称为old_options的参数的拷贝,并用指定的参数值修改oldops中相应的参数.
[x, fval, exitflag, output] = fminbnd(fun, vlb, vub)
% 函数fminbnd的算法基于黄金分割法和二次插值法,它要求目标函数必须是连续函数,并可能只给出局部最优解
问题0
function f = fun0(x)
f = -(3-2*x)^2 * x;
[x, fval] = fminbnd('fun0', 0, 1.5);
xmax = x;
fmax = -fval;
xmax =
0.5000
fmax =
2.0000
[x, fval, exitflag, output] = fminunc('fun', X0, options)
% 或者[x, fval, exitflag, output] = fminsearch('fun', X0, options)
% fminsearch是用单纯形法寻优,fminunc算法见以下几点说明:
% [1] fminunc为无约束优化提供了大型优化和中型优化算法.由选项中的参数LargeScale控制:
% LargeScale=‘on' (默认值),使用大型算法;
% LargeScale=‘off' (默认值),使用中型算法.
% [2] fminunc为中型优化算法的搜索方向提供了4种算法,由选项中的参数HessUpdate控制:
% HessUpdate='bfgs'(默认值),拟牛顿法的BFGS公式;
% HessUpdate='dfp',拟牛顿法的DFP公式;
% HessUpdate='steepdesc',最速下降法。
% [3] fminunc为中型优化算法的步长一维搜索提供了两种算法,由选项中参数LineSearchType控制:
% LineSearchType=‘quadcubic’ (默认值),混合的二次和三次多项式插值;
% LineSearchType='cubicpoly',三次多项式插值;
% [4] 使用fminunc和 fminsearch可能会得到局部最优解。
function f = fun1(x)
f = exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
x0 = [-1 1]; % x0为迭代初始坐标
x = fminunc('fun1', x0);
y = fun1(x);
x =
0.5000 -1.0000
y =
3.6609e-16
问题2
% [x,y] = meshgrid(-2:0.1:3, -2:0.1:3);
% % meshgrid为网格采样点函数
% z = 100*(y-x.^2).^2+(1-x).^2;
% mesh(x, y, z);
% % hold on
% % mesh为画三维的网格图的函数
% % 画出函数的三维图像
%
% contour(x,y,z,20);
% % contour(x,y,z,levels)为绘制矩阵的等高线图的函数,20为等高线的层数
% hold on
% plot(-1.2,2,'o');
% text(-1.2,2,'start point');
% plot(1,1,'o');
% text(1,1,'solution');
% % 绘制等高线
% 使用fminsearch函数求解
x0 = [-1.2 2];
[x, fval, exitflag, output] = fminsearch('fun2',x0);
% 使用fminunc函数求解
% 使用三种算法进行求解
% LargeScale设置算法规模
% Hessupdate设置中型算法种类
% LineSearchType设置步长一维搜索的算法种类
% MaxIter: 允许进行迭代的最大次数,取值为正整数
% MaxFunEvals: 允许进行函数评价的最大次数,取值为正整数
% 使用中型算法
x0 = [-1.2 2];
oldoptions = optimset('fminunc')
options = optimset(oldoptions, 'LargeScale', 'off')
% 1.1:DFP算法
options1 = optimset(options, 'HessUpdate', 'dfp')
[x1, fval1, exitflag1, output1] = fminunc('fun2', x0, options1)
pause
% 2.1:BFGS算法
options2 = optimset(options, 'HessUpdate', 'bfgs')
[x2, fval2, exitflag2, output2] = fminunc('fun2', x0, options2)
pause
% 3.1:最速下降法
options31 = optimset(options, 'HessUpdate', 'steepdesc')
[x31, fval31, exitflag31, output31] = fminunc('fun2', x0, options31)
pause
% 3.2:最速下降法,迭代的最大次数为8000,进行函数评价的最大次数为8000
options32 = optimset(options, 'HessUpdate', 'steepdesc', 'MaxIter', 8000, 'MaxFunEvals', 8000)
[x32,fval32, exitflag32, output32] = fminunc('fun2', x0, options32)
pause
% 3.3:最速下降法,迭代的最大次数为9000,进行函数评价的最大次数为9000
options33 = optimset(options, 'HessUpdate', 'steepdesc', 'MaxIter', 9000, 'MaxFunEvals', 9000)
[x33, fval33, exitflag33, output33] = fminunc('fun2', x0, options33)
x =
1.0000 1.0000
fval =
1.9151e-10
output =
包含以下字段的 struct:
iterations: 108
funcCount: 202
algorithm: 'Nelder-Mead simplex direct search'
message: '优化已终止:↵ 当前的 x 满足使用 1.000000e-04 的 OPTIONS.TolX 的终止条件,↵F(X) 满足使用 1.000000e-04 的 OPTIONS.TolFun 的收敛条件↵'
exitflag1 = 0
exitflag2 = 1
exitflag31 = 0
exitflag32 = 0
exitflag33 = 0
fval1 = 3.118857168885522
fval2 = 5.308577048854317e-10
fval31 = 0.013712025822507
fval32 = 0.006357580614852
fval33 = 0.005729363160867
x0 = [-1.200000000000000,2]
x1 = [-0.747553337321273,0.533357667606796]
x2 = [0.999977453011579,0.999954432284563]
x31 = [1.116921345974429,1.248156913152331]
x32 = [1.079607291413950,1.166002012200930]
x33 = [1.075675703374728,1.157237939825174]
% 可根据得出来的结果判断算法的特点与优缺点
{ p 1 = b 1 − a 11 x 1 − a 12 x 2 , b 1 , a 11 , a 12 > 0 , a 11 > a 12 ; p 1 = b 1 − a 11 x 1 − a 12 x 2 , b 1 , a 21 , a 22 > 0 , a 22 > a 21 ; \begin{cases} p_1 = b_1 - a_{11}x_1 - a_{12}x_2,\ b_1,a_{11},a_{12}>0,a_{11}>a_{12}; \\ p_1 = b_1 - a_{11}x_1 - a_{12}x_2,\ b_1,a_{21},a_{22}>0,a_{22}>a_{21}; \end{cases} { p1=b1−a11x1−a12x2, b1,a11,a12>0,a11>a12;p1=b1−a11x1−a12x2, b1,a21,a22>0,a22>a21;
q 1 = r 1 e − λ 1 x 1 + c 1 , r 1 , λ 1 , c 1 > 0 q 2 = r 2 e − λ 2 x 2 + c 2 , r 2 , λ 2 , c 2 > 0 q_1 = r_1e^{-\lambda_1 x_1} + c_1, \ r_1, \lambda_1, c_1>0 \\ q_2 = r_2e^{-\lambda_2 x_2} + c_2, \ r_2, \lambda_2, c_2>0 q1=r1e−λ1x1+c1, r1,λ1,c1>0q2=r2e−λ2x2+c2, r2,λ2,c2>0
目标函数: Z = ( p 1 − q 1 ) x 1 + ( p 2 − q 2 ) x 2 Z = (p_1 - q_1)x_1+(p_2 - q_2)x_2 Z=(p1−q1)x1+(p2−q2)x2
根据统计数据得到待定系数;
忽略成本求得 Z Z Z极点(最小值)处的 x 1 , x 2 x_1,x_2 x1,x2,作为初始值。
function f = fun3(x)
y1=((100-x(1)- 0.1*x(2))-(30*exp(-0.015*x(1))+20))*x(1);
y2=((280-0.2*x(1)- 2*x(2))-(100*exp(-0.02*x(2))+30))*x(2);
f=-(y1+y2);
x0 = [50 70];
[x, fval] = fminunc('fun3', x0);
zmax = -fun3(x);
x =
23.9025 62.4977
zmax =
6.4135e+03
在甲产量为23.9025,乙产量为62.4977时,最大利润为6413.5.
略
fuchaoxinHUST