当前位置:首页 > 第九章 最优化方法要点
lower upper ineqlin ineqnonlin 2 x = 24.0000 12.0000 12.0000 fval =
-3.4560e+003
例9 求表面积为36而体积最大的长方体的体积。
解 设长方体的三个棱长分别为x1,x2,x3,则体积v=x1*x2*x3,且满足约束条件2(x1*x2+x2*x3+x3*x1)=36。
首先建立目标函数的M文件myopt1.m,内容如下: function f = myopt1(x)
f =-x(1)*x(2)*x(3); % 负号表示最小值,即x(1)*x(2)*x(3)的最大值 再建立非线性约束函数的M文件mycon.m,内容如下: function [C,Ceq] = mycon(x) C = [];
Ceq = x(1)*x(2)+x(2)*x(3)+x(3)*x(1)-18; 由于没有非线性不等式,故C为[]。
在命令窗口输入:
>> [x,fval] = fmincon('myopt1',[1 1 1],[],[],[],[],[0 0 0],[],'mycon') 输出结果为:
x =
2.4495 2.4495 2.4495 fval = -14.6969
结果表明当x1=x2=x3=2.4495时,体积最大值为14.6969。该问题的精确解为x1=x2=x3=6时最大体积为66。
9.4 二次规划
二次规划问题(quadratic programming)的标准形式为:
min1xⅱHx+fx 2ìA祝xb???sub.to íAeq?xbeq
?????lb#xub其中,H、A、Aeq为矩阵,f、b、beq、lb、ub、x为向量。其它形式的二次规划问题都可转化为标准形式。
MATLAB中使用quadprog函数求解二次规划,其调用格式有: x = quadprog(H,f,A,b) x = quadprog(H,f,A,b,Aeq,beq) x = quadprog(H,f,A,b,Aeq,beq,lb,ub) x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0) x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options) [x,fval] = quadprog(…) [x,fval,exitflag] = quadprog(…) [x,fval,exitflag,output] = quadprog(…) [x,fval,exitflag,output,lambda] = quadprog(…) 例10 求解下面二次规划问题
122x1+x2-x1x2-2x1-6x2 2ìx1+x2?2?????-x1+2x2?2s.. t í?2x1+x2?3??????0#x1,0x21Hx+fx 解:f(x)=xⅱ2minf(x)=骣骣1-1÷-2÷??则H=?,x=?,f=??÷÷?÷÷?-12-6桫桫在命令窗口中输入:
>> H = [1 -1; -1 2] ; f = [-2; -6]; A = [1 1; -1 2; 2 1]; b = [2; 2; 3]; lb = zeros(2,1);
骣x1÷? ?÷÷?x2÷桫[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[ ],[ ],lb) 输出结果为:
x = %最优解 0.6667 1.3333 fval = %最优值 -8.2222
exitflag = %收敛 1 output =
iterations: 3
algorithm: 'medium-scale: active-set' firstorderopt: [ ] cgiterations: [ ] lambda =
lower: [2x1 double] upper: [2x1 double] eqlin: [0x1 double] ineqlin: [3x1 double] >> lambda.ineqlin ans = 3.1111 0.4444 0 >> lambda.lower ans = 0 0
此结果说明第1、2个约束条件有效,其余无效。
9.5 多目标规划
多目标规划是指在一组约束下,对多个不同目标函数进行优化。它的一般形式为
min[f1(x),f2(x),,fm(x)]
goalìF(x)-weight祝g????C(x)£0???Ceq(x)=0??s.. tí?A祝xb???Aeq?xbeq??????lb#xub
其中:x、b、beq、lb、ub是向量;A、Aeq为矩阵;C(x)、Ceq(x)和F(x)是返回向量的函数;F(x)、C(x)、Ceq(x)可以是非线性函数;weight为权值系数向量,用于控制对应的目标函数与用户定义的目标函数值的接近程度;goal为用户设计的与目标函数相应的目标函数值向量;g为一个松弛因子标量;F(x)为多目标规划中的目标函数向量。
MATLAB中求解多目标规划的函数为fgoalattain,其调用格式有: x = fgoalattain(fun,x0,goal,weight) x = fgoalattain(fun,x0,goal,weight,A,b) x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq) x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub) x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon) x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options) [x,fval] = fgoalattain(…)
[x,fval,attainfactor] = fgoalattain(…) [x,fval,attainfactor,exitflag] = fgoalattain(…) [x,fval,attainfactor,exitflag,output] = fgoalattain(…) [x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(…)
输入参数x0为初始解向量;fun为多目标函数的文件名字符串,其定义方式与前fun的定义方式相同;goal为用户设计的目标函数值向量;weight权值系数向量,用于控制目标函数与用户自定义目标值的接近程度;A、b满足线性不等
共分享92篇相关文档