当前位置:首页 > 第九章 最优化方法要点
或迭代的最大数字,exitflag<0表示函数不收敛于x;若参数output=iterations表示迭代次数,output=funccount表示函数赋值次数,output=algorithm表示所使用的算法。
x3+cosx+xlogx例6 计算函数f(x)=在区间(0,1)内的最小值。 xe在命令窗口输入:
>> [x,fval,exitflag,output]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1) 输出结果为:
x = 0.5223 fval = 0.3974 exitflag = 1 output = iterations: 8 funcCount: 9
algorithm: 'golden section search, parabolic interpolation' message: [1x112 char]
表明该函数在x =0.5223时取最小值0.3974。 ezplot('(x^3+cos(x)+x*log(x))/exp(x)',0,1) 为简化输出结果,可输入:
>> [x,fval]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1) 9.3.2 无约束多元函数极(最)小值
在MATLAB中使用fminsearch函数和fminunc函数求无约束多元函数的极(最)小值。
(1)fminsearch函数 该函数的调用格式为:
[x,fval,exitflag,output]= fminsearch(fun,x0,options)
其中输入参数fun为目标函数的表达式字符串或MATLAB自定义的M函数,x0为初始点,options为指定优化参数选项;输出参数x为多元函数的最小值点,fval为最小值,exitflag和output与单变量情形一致。
332例7 求y=2x1的最小值点。 +4x1x2-10x1x2+x2在命令窗口输入:
>> [x,fval]=fminsearch('2*x(1)^3+4*x(1)*x(2)^3-10*x(1)*x(2)+x(2)^2', [0,0]) 输出结果为:
x =
1.0016 0.8335 fval = -3.3241
表明当x1=1.0016,x2=0.8335时函数的最小值为-3.3241。
(2)fminunc函数 该函数的调用格式为:
[x,fval,exitflag,output,grad,hessian] = fminunc (fun,x0,options)
其中输入参数fun为目标函数的表达式字符串或MATLAB自定义的M函数,x0为初始点,options为指定优化参数选项;输出参数x为多元函数的最小值点,fval为最小值,exitflag和output与单变量情形一致,grad为函数在解x处的梯度值,hessian为目标函数在解x处的海赛(Hessian)值。
fminsearch利用了单纯形法的原理,fminunc利用了拟牛顿法的原理。当函数的阶数大于2时,使用fminunc比fminsearch更有效,但当所选函数高度不连续时,使用fminsearch效果较好,这两个函数都容易陷入局部优化,并且结果的正确与否还要取决于初值点x0的选取。
利用fiminunc求例7的最小值。 在名利窗口输入:
>>[x,fval]=fminunc('2*x(1)^3+4*x(1)*x(2)^3-10*x(1)*x(2)+x(2)^2',[0.5,0.5]) 输出结果为:
x =
1.0016 0.8335
fval = -3.3241
此结果和fminsearch函数的求解结果一样。 9.3.3有约束的多元函数最小值
非线性有约束的多元函数的标准形式为:
minxf(x)
ìC(x)£0????Ceq(x)=0??s.t ?xb íA祝??Aeq?xbeq??????lb#xub其中:x,b,beq,lb,ub是向量,A,Aeq为矩阵,C(x)、Ceq(x)是返回向量的函数,f(x)为目标函数,f(x)、C(x)、Ceq(x)可以是非线性函数。
在MATLAB用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(…)
其中fun为目标函数,它可用前面的方法定义;x0为初始值;A、b满足线
xb,若没有不等式约束,则取A=[],b=[];Aeq、beq满足等性不等式约束A祝式约束Aeq?xbeq,若没有,则取Aeq=[],beq=[];lb、ub满足lb#xub,
若没有界,可设lb=[],ub=[];nonlcon的作用是通过接受的向量x来计算非线性不等约束C(x)£0和等式约束Ceq(x)=0分别在x处的估计C和Ceq,通过M文件建立,如:
>>x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon),先建立非线性约束函数,并保存为mycon.m:function [C,Ceq] = mycon(x)
C = … % 计算x处的非线性不等约束C(x)£0的函数值。 Ceq = … % 计算x处的非线性等式约束Ceq(x)=0的函数值。 输出参数x为多元函数的最小值点,fval为最小值,exitflag和output与单变量情形一致,lambda是Lagrange乘子,它体现哪一个约束有效,grad为函数在解x处的梯度值,hessian为目标函数在解x处的海赛(Hessian)值。
例8 求下面问题在初始点x=(10, 10, 10)处的最优解。 min f(x)=-x1x2x3 sub.to 0?x12x2+2x3?72
解:约束条件的标准形式为 sub.to -x1-2x2-2x3?0
x1+2x2+2x3?72
在命令窗口输入: >> fun= '-x(1)*x(2)*x(3)'; x0=[10,10,10]; A=[-1 -2 -2;1 2 2]; b=[0;72];
[x,fval]=fmincon(fun,x0,A,b) 输出结果为:
Optimization terminated: magnitude of directional derivative in search direction less than 2*options.TolFun and maximum constraint violation is less than options.TolCon.
Active inequalities (to within options.TolCon = 1e-006):
共分享92篇相关文档