无约束优化求解函数fminsearch和fminunc
求解无约束非线性优化问题的函数有fminsearch 函数、fminunc函数。函数fminsearch和fminunc功能相同,但fminunc函数可以得到目标函数在最优解处的梯度和Hessian矩阵值。
无约束优化数学模型为: min f(X) X∈Rn 求解无约束非线性优化问题的步骤为:
第一步: 先编写目标函数的M文件; 第二步: 再在命令窗口中调用相应的优化函数。 1、fminsearch函数调用格式为
[x, fval]=fminsearch(@myfun, x0) 输出参数的含义:
x:返回最优解的设计变量的值;
fval:在最优设计变量值时,目标函数的最小值;
exitflag:返回算法终止的标志,有以下几种情况,>0 表示算法收敛于最优解处;=0 表示算法已经达到迭代的最大次数;<0 表示算法不收敛。
output:返回优化算法信息的一个数据结构,有以下信息:
output.iteration 表示迭代次数 output.algorithm 表示所采用的算法 output.funcCount 表示函数评价次数
输入参数的含义:
@myfun:目标函数的M文件,在其前要加 “@”,或表示为'myfun' ,myfun自己可以任意命名; x0: 在调用该优化函数时,需要先对设计变量赋一个初始值;
2、fminunc函数的调用格式
[x, fval]=fminunc (@myfun, x0)
grad: 返回目标函数在最优解处的梯度信息;hessian:返回目标函数在最优解处的hessian矩阵信息。其余含义同上。 3、实例 已知某一优化问题的数学模型为:
min f(X)=3x12+2x1x2+x22 X∈Rn 用MATLAB程序编写的代码为:
第一步:首先编写目标函数的.m文件,并保存为examplefsearch.m文件(先单击file菜单,后点击New命令中的M—file,即可打开M文件编辑窗口进行代码的编辑,在英文状态下输入程序代码),代码为:
function f=examplefsearch(x) f=3*x(1)^ 2+2*x(1)*x(2)+x(2)^2;
第二步:在Command窗口中调用fminsearch函数,代码为: x0=[1;1]; %赋初值 [x,fval]=fminsearch(@examplefsearch,x0) %回车即可调用fminsearch函数,得到结果 输出最优解结果为: x=
1.0e-0.08* -0.7914 0.2260 %分别为x1和x2的最优点的值(近似为0)
fval= 1.5722e-016 %对应最优点的最优目标函数值(近似为0) 4、作业 已知几个优化问题的数学模型分别为: (1)min f(X)=0.1935x1 x22 x32(4+6x4) X∈R4
(2)min f(X)= (x13+cos x2+log x3)/ e x1 X∈R3
∈ R3 (3)min f(X)=2x13+4x1x23 -10x1x2+x33 X
试用MATLAB编程分别求解上述优化问题的最优解。(分别把步骤、代码、结果写在另一张纸上,作为作业交)
其中cos x2在MATLAB应写为cos(x(2));log x3应为log(x(3));e x1应为exp(x(1))。
二、求解线性优化问题的函数linprog 1 、linprog函数要求数学模型的形式
在MATLAB优化工具箱中,用于求解线性规划的函数有linprog,要求的线性规划的数学模型的一般形式为:
min f(X) =fT*X X∈Rn s.t. A*X≤b Aeq* X =beq lb≤X≤ub
上式中,f:表示目标函数中变量的系数向量,为列向量;
A:表示所有线性不等式约束的系数矩阵;
b:为所有线性不等式约束的不等式右面常数向量,为列向量; Aeq:表示所有线性等式约束的系数矩阵;
beq:为所有线性等式约束的等式右面常数向量,为列向量; lb和ub:分别表示为变量的上下限,为列向量。
2、linprog函数的调用格式
调用格式如下: [x,fval]= linprog (f, A,b, Aeq,beq,lb,ub)
上式中,A、b、Aeq、beq、lb、ub、x0、options均为可选项,如果数学模型中无该项参数,则用[]代替。 例如如果某一数学模型中没有等式约束,即无Aeq和beq参数,则调用的格式为: [x,fval]= linprog (f, A,b, [],[],lb,ub) 用linprog函数求解线性规划问题时,直接在MATLAB软件的Command窗口中调用,先将各个输入参数在Command窗口中赋值后,即可调用linprog函数。 3、实例 求使目标函数f(x)= -5 x1- 4 x2-6 x3 取最小值时的x 的值,且满足约束条件为: x1- x2+x3≤20 3x1+2 x2+4x3≤42 3x1+2 x2≤30 x1≥0,x2≥0,x3≥0 直接在MATLAB的Command窗口输入下列代码,即可求解,过程如下: f=[-5; -4; -6]; A=[1, -1, 1; 3 , 2 , 4 ; 3 , 2 ,0]; b=[20 ; 42; 30]; lb=zeros(3,1); [x,fval,exitflag,output]= linprog (f, A,b, [],[],lb,[],[]) 结果输出为: x=0.000 15.000 3.000 fval=-78.000 4、作业 用linprog函数求下列数学模型的最优解。 min f(X)= -7 x1- 5 x2 s.t. 3x1+x2≤90 4x1+6 x2≤200 x1≤20 x2≤30 x1≥0,x2≥0
三、求解二次规划问题的函数quadprog 1 、quadprog函数要求数学模型的形式
在MATLAB优化工具箱中,用于求解线性规划的函数有quadprog,要求的线性规划的数学模型的一般形式为:
min f(X) =1/2*XT*H*X+fT*X X∈Rn s.t. A*X≤b Aeq*x=beq lb≤x≤ub
上式中,H:表示目标函数中变量的二次项的系数矩阵;其余参数同linprog函数中的含义。 2、quadprog函数的调用格式
调用格式如下: [x,fval]= quadprog (H,f, A,b, Aeq,beq,lb,ub)
上式中,A、b、Aeq、beq、lb、ub均为可选项,如果数学模型中无该项参数,则用[]代替。 例如如果某一数学模型中没有等式约束,即无Aeq和beq参数,则调用的格式为: [x,fval]= quadprog (H,f, A,b, [],[],lb,ub) 用quadprog函数求解二次规划问题时,直接在MATLAB软件的Command窗口中调用,先将各个输入参数在Command窗口中赋值后,即可调用quadprog函数。 3、实例 求使目标函数f(x)= 1/2 x12+x22-x1 x2-2 x1 -6 x2 取最小值时的x 的值,且满足约束条件为: x1+x2≤2 -x1+2 x2≤2 2x1+x2≤3 x1≥0,x2≥0 首先把目标函数写成以下形式:f(X) =1/2*XT*H*X+fT*X,其中 f(x)= 1/2 x12+x22-x1 x2-2 x1 -6 x2
=1/2(
x12-x1 x2-x2 x1+2x22)-2 x1 -6 x2
T?1?1??x1???2??x1? 1=?x,x?12???x????6??x??122???2????2?上式中H= ?1??1??1?,f= 2????2?
??6???直接在MATLAB的Command窗口输入下列代码,即可求解,过程如下: H=[1,-1;-1,2];
f=[-2; 6]; A=[1, 1,;-1 , 2 ;2 ,1]; b=[2 ; 2; 3]; lb=zeros(2,1); [x,fval]= quadprog (H,f, A,b, [],[],lb) 结果输出略。 4、作业 用quadprog函数求下列数学模型的最优解。 min f(X)= x12+x22-10 x1-16 x2 +89 s.t. x1-x2+1≥0
x1≥0
10-x1≥0 x2-1≥0 10-x2≥0 x2-x1=0
四、MATLAB求解非线性优化问题的函数fmincon 1 、fmincon函数要求数学模型的形式
在MATLAB优化工具箱中,用于求解非线性规划的函数有fmincon,要求的非线性规划的数学模型的一般形式为:
min f(X) X∈Rn s.t. A*X≤b Aeq*x=beq lb≤x≤ub
c(X) ≤0 ceq(X)=0 上式中,c(X):表示约束函数中的非线性不等式约束函数;ceq(X) 约束函数中的非线性等式约束函数。其他含义同linprog函数。 2、fmincon函数的调用格式
调用格式如下: [x,fval]= fmincon (@objfun,x0, A,b, Aeq, beq, lb, ub, @nonlcon)
上式中,objfun为目标函数的m文件函数名,自己命名,引用时前面需要加句柄@,或用单引号 ‘’引用 ;x0为给变量赋的初值;nonlcon为非线性约束的m文件函数名,自己命名,引用时前面需要加句柄@,或用单引号 ‘’引用;A、b、Aeq、beq、lb、ub、x0、options的含义同线性规划函数linprog。 3、上机编制程序求解过程 第一步:先编制目标函数的.m文件,并保存; 第二步:编制非线性约束的.m文件,并保存; 第三步:在MATLAB的Command窗口输入赋予x0的初值,以及线性约束、边界约束等输入参数的值后,即可调用fmincon函数,进行求解。 4、实例 求使目标函数f(X)= ( x1 -3)2 + x2 2 取最小值时的X 的值,且满足约束条件为: x1 2+x2-4≤0 x2- x1≤2 x1≥0,x2≥0 该问题是非线性规划问题,其约束条件中含有非线性约束,求解过程如下:
(1)先编制目标函数的m文件,并保存为myobjfun.m,代码如下: function f=myobjfun(x) f=( x(1) -3)^2+ x(2)^2;
(2) 编制非线性约束的.m文件,并保存为myconfun.m,代码如下: function [c, ceq]= myconfun (x) c =x (1) ^2+ x(2)-4; ceq =[]; (3)在MATLAB的Command窗口输入下列代码,即可求解: x0=[1; 1]; A=[-1 ,1]; b=[2]; Aeq=[ ]; beq=[ ]; lb=[0; 0]; ub=[ ]; [x,fval]= fmincon (@myobjfun,x0, A,b,Aeq,beq,lb,ub, @myconfun) 结果输出略。 5、作业 用fmincon函数求下列数学模型的最优解。 min f(X)=25/(x1 x2 3) min f(x)??x1x2x3 min f(X)= x12+x22-10 x1-16 x2 +89 s.t. 30/(x1 x2 3)-50≤0 s.t. 0?x1?2x2?2x3?72 s.t. x1-x2+1≥0 10-4x1 x2≥0 10-x1≥0 2≤x1≤4 x2-1≥0 22min f(X)= x?x?xx?2x?5x 0.5≤x2≤1 121212 10-x2≥0 2s.t. ?(x1?1)?x2?0 x2-x1=0
2x1?3x2?6?0
作业五:设计一圆柱螺旋压缩弹簧,参数为:弹簧中径D、钢丝直径d、总圈数n。设计要求在F=700N作用下,产生10mm 的变形量。要求弹簧压并高度≤50mm,弹簧内径≥16mm,在满足强度条件下,要求设计的弹簧具有最轻的重量。根据设计要求和弹簧的受力分析,可得到下面的数学模型
2??2 min f(X)?x1x2x34 上式中, x1 表示弹簧中径 D , x2 表示钢丝直径 d , x3
38Fx1(x3?n0) 表示总圈数 n 。 s.t.
g(x)??10 其中:第一个约束为弹簧的变形量要求; 第二个约束为弹簧的压并高度要求; 第三个约束为弹簧的内径要求; 第四、五个约束为弹簧的旋绕比要求; 第六个约束为弹簧的强度要求;
第七到第十二个约束为弹簧的尺寸要求
(即边界约束要求); 其中未知参数的取值为:
材料剪切模量G=81000N/mm2; 弹簧支承圈数n0=1.75; 弹簧终端类型系数? =0.5; 弹簧中径D和钢丝直径d的取值优先选用第一系列,有 D:8,9,10,12,16,20,25,30,35,40,45,50;
d:1,1.2,1.6,2,2.5,3,3.5,4,4.5,5,6,8,10,
12,16,20
试用MATLAB编程分别求解上述优化问题的最优解。
(分别把步骤、代码、结果写在另一张纸上,作为作业交)
作业六:教材166页实例。
1Gx42g2(x)?x2(x3??)?50g3(x)?16?x1?x2?0g4(x)?4?x1x?02g(x)?x15x?10?02g)?(x1?0.25x2x?0.615x2)8Fx16(x3?[?]?02?x1x1?x2g7(x)?8?x1?0g8(x)?x1?50?0g9(x)?1?x2?0g10(x)?x2?20?0g11(x)?1?x3?0g12(x)?x3?20?0