matlab最小值优化问题中fminunc、fmincon的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

工程最优化即最大(小)值问题
1、无约束(无条件)的最优化
(1)使用fminunc函数(un-condition)(2)可用于任意函数求最小值
(3)将最大、最小问题统一为求最小值问题(即只能求最小值)。


求最大值,
而变成求最小值问题,
最后即为函数
的最大值。

)(前后都是函数y两次取反,而自变量X不要取反)
(4)使用格式
x=fminunc(‘程序名’, x0)
左边的结果还可以写成
[x,fval] 或
[x,fval,exitflag] 或
必须预先把函数存入到一个程序中,(所编的程序一定是只有一个参数,则当为多元函数时,则x(1),x(2),x(3)…分别代表每个自变量)
其中fval为函数的最小值,
x0为自变量初始向量,一般不影响结果(如有n个变量(即n元函数),则x0中就有n个元素)
exitflag为退出标志,当它大于0时表示函数收敛于x,当它等于0时表示迭代次数超过,当它小于0时表示函数不收敛(所以解完题后还必须判断exitflag的值是否>0,以决定结果的正误/有效性)
函数存在最值的条件:在闭区间连续,存在导数等(说明有
很多函数不存在最值:有大、有小、有大小、都无)
最后一定要看看exitflag
........的值(判断结果是否有效)---所以
函数可以用内联函数inline(‘表达式’)
(程序中的.* ./ .^可要可不要,一般还是不要吧)
(5)y= x2+4x+5 的最小值(结果-2,1)其函数形式为:---可以@, 内联函数inline(‘x2+4x+5’),
function f=a1(x)
f=x^2+4*x+5;------最好不要.* .^ ./因为不是向量(一批数)的运算,初始x0就是变量的个数(调用该程
序时,所提供的每个变量的初始值)
函数名:’zhc1’或 @zhc1 或 inline(‘…’)
>> [x,f,g]=fminunc(inline('x^2+4*x+5'),1)
还有学生f=y=x^2+4*x+5;??????
>> edit
>> [x,fval,exitflag]=fminunc('max1',1)
Warning: Gradient must be provided for trust-region method;
using line-search method instead.
> In fminunc at 241
Optimization terminated: relative infinity-norm of gradient less than options.TolFun.
x =
-2.0000
fval =
1.0000
exitflag =
1
>> [a,b,c]=fminunc('max1',1)
Warning: Gradient must be provided for trust-region method;
using line-search method instead.
> In fminunc at 241
Optimization terminated: relative infinity-norm of gradient less than options.TolFun.
a = -2.0000
b = 1.0000
c = 1
>> [x,fval,exitflag]=fminunc('max1',0)
>> [x,fval,exitflag]=fminunc('max1',5)
>> [x,fval,exitflag]=fminunc(@max1,5)
>> [x,fval,exitflag]=fminunc(inline('x^2+4*x+5'),1)
>> [x,fval,exitflag]=fminunc(@(x)x^2+4*x+5,1)
>> a=@(x)x^2+4*x+5;
>> [x,fval,exitflag]=fminunc(a,1)
(6)例如:求y=1+2x-x2的最大值(结果为:x=1,y=-(-2) )---X不要取反,两次都是函数取反
其函数形式为:
function f=a1(x) 命令形式[x,y,z]=fminunc('a1',3)
f=-(1+2*x-x^2) 或负号展开—最后再取反------需两次取反
>> a1(1)
ans = -2
>> a1(0)
ans = -1
(7)求函数f(x,y)=e2x(x+y2+2y)的最小值
其函数形式为:
function f=a1(r)--fmin所要求的程序一定是一个参数x=r(1);y=r(2);
f=exp(2*x)*(x+y^2+2*y);----有学生写成f(x,y)=……
或function f=a2(a) x=a(1);y=a(2);f= 或f中直接用x(1),x(2)
命令为:[x,fval,exitflag]=fminunc('a1',[2,1])—即a1调用时的参数
x =
0.5000 -1.0000 ---
fval =
-1.3591 (即-e/2)
exitflag =
1
此题的x0也可为[1,1],[0,1],[1,0],[0,0],但不能用[1,2],如出问题,可尝试换一个初值----x0建议最好用[1,1,1]
此题说明可对任意函数、任意n元求最小值(此题为二元,含exp函数)
n元,则x视作一个向量,它的每个元素分别代表某一个自变量(可以a=x(1);b=x(2);…..)
结果x也是一个向量,每个元素分别代表每个自变量
此题不存在最大值。

(可求一下,结果为x =1.0e+012 * 2.2923 0.2986 fval = -Inf exitflag = 0)-----结果无效----说明最值不一定存在
如为n元函数,则初始向量也必须为n个元素的向量
(都是小.)无条件的命令在实际问题中用的很少,一般还是使用下一条命令
2、fminbnd(‘程序名’,x1,xn)
求函数在区间[x1,xn]的最小值
3、有约束条件的最优化问题
使用fmincon函数(condition)
这是优化(最值)的万能命令
(1)左边(结果)可为:
x=
[x,fval]=
[x,fval,exitflag]=
(2)右边可为:
fmincon(‘程序名’,x0,A,b)
用于线性不等式约束,即A*x< =b,
A为系数矩阵,b为常数项列向量,
x0为初始向量
fmincon(‘程序名’,x0,A,b,
Aeq,beq)
用于线性不等式与线性等式约
束,线性等式为Aeq*x=beq, 其
中Aeq为系数矩阵,为beq列
向量
A,b, Aeq,beq的形式类似于解线性方程组的形式
fmincon(‘程序名’,x0, A,b,
Aeq,beq, l,u)
其中l、u为解的上下限(即解
的范围l<=x<=u)
(如为多元函数:则l=[x0,y0,z0,….], u=[xn,yn,zn,…]) (条件顺序:(线性)不等式---(线性)等式---上下限---非线性条件)
fmincon(‘程序名’,x0, A,b,
Aeq,beq, l,u, ‘程序2’)
其中‘程序2’ 是用于非线性
约束,它的格式为:c(x)<=0
ceq(x)=0
程序形式为:
function [c,ceq]=fxx(x)
c=……;
ceq=……;
如有多个非线性条件---见下面的例3---方法1:可以返回2/4/6/8…个结果,结果分别为不1、等1、不2、等2、不3、等3……,没有的则用[ ]或0 方法2:把c,ceq视作数组,即c=[不1, 不2, 不3,…]; ceq=[等1,等2, 等3,……] 或c(1)=不1; c(2)= 不2;……; ceq(1)=等1;……,建议最好使用最后一种形式,即c(1),c(2),c(3)…ceq(1),ceq(2),ceq(3)…
(3)注意:前面的各向量(矩阵)如不
使用,必须使用空的向量(后
面的如不使用,则可以不管)
(即每个参数的意义是由它们的位置来决定的,不是由变量决定的,变量名可以任意。

)
函数的形式:function f=zha(r)一定是只有一个形参x=r(1);y=r(2);z=r(3);……
f=函数表达式;
看一下exitflag, 如无效则换一个初始向量x0
先做好各种准备(目标函数表达式---
编程序;线性条件(不等
式、等式);非线性条件---
编另一个程序)
最后再执行命令fmincon
条件分为:线性不等式、线性等式、
上下限(范围)、非线性条
件(不等式、等式)--程序
返回两个结果
一般是不等式居多(再多都不要紧),一般不会有太多的等式条
件(否则都可以解方程了)
(4)如1:f(x,y,z)=x2/2+xy+xz+y2+3yz
+z3-6x-7y-8z 求其最小值
受约束于:x+y+3z<=5
x+2y+z<=6
3x+y+2z<=13
答案为:(4,1,0, -18) (再添加2x+3y+4z=11; 3x+5z=12;--------再添加上/下限:x—[1,10], y----[0,5], z---[-5,5])
函数形式为:function f=zhabc(x)
a=x(1);b=x(2);c=x(3); %也可直接用(1),x(2),x(3)
f=a^2/2+a*b+a*c+b^2+3*b*c+c^3-6*a-7*b-8*c;
命令形式为:》a=[1,1,3;1,2,1;3,1,2];b=[5;6;13];
>> [x,fval,exitflag]=fmincon('zhabc',[1,1,1],a,b) 也可先x0
x =
4.0000 1.0000 -0.0000
fval =
-18
警告信息没有关系
虽然程序中可以直接用x(1),x(2),x(3)…,但更麻烦。

所以最好这样:function f=zha(t) (用任意变量名都可以,但用其他字
母代替x更好,因为函数表达式可以直接拷贝过来,省得去对应)
x=t(1);y=t(2);z=t(3);……f=…….;
>> [x,fval,exitflag]=fmincon('minzh1',[1,1,1],[1,1,3;1,2,1;3,1,2],[5;6;13])
Warning: Large-scale (trust region) method does not currently solve this type of problem, switching to medium-scale (line search).
x = 4.0000 1.0000 -0.0000
fval = -18.0000
exitflag = 1
如2:z=sqrt((x-12)2+(y-12)2)
求其最小值
受约束于:x+y<=20
y<=14
3y-x>=0 (需转换)
答案为:10,10;2.8284 (再增加范围3<=x<=8, 5<=y<=14)
( l=[3,5] u=[8,14])---结果是一样的)
>> a=[1,1;0,1;-1,3];
>> a=[1,1;0,1;1,-3];
>> b=[20;14;0];
>> [x,fval,exitflag]=fmincon('minzh2',[1,2],a,b)
x = 10.0001 9.9999
fval = 2.8284
exitflag = 5
函数形式为:function f=zhabc(x)
a=x(1);b=x(2);
f=sqrt((a-12)^2+(b-12)^2);
命令为:a=[1,1;0,1;1,-3]; b=[20;14;0];
>> [x,fval,exitflag]=fmincon('zhabc',[8,8],a,b,[],[],[5,5],[20,20])
x = 10.0000 10.0000
fval =
2.8284
exitflag = [8,8] [5,5] [20,20]也可预先定义
5 [8,8]一定要在上下限的范围内>> [x,fval,exitflag]=fmincon(@minzh2,[1,1],a,b,[],[],[5,8],[10,15])
如3:f(x)=x2+y2-xy-10x-4y+60
求其最小值
约束条件为:x+y=8,
x,y的上下限分别为[-5,10],[0,5]
(答案为:5,3;17)
function f=zhabc(x)
a=x(1);b=x(2);
f=a^2+b^2-a*b-10*a-4*b+60;
a=[1,1];b=8;
>> l=[-5,0];u=[10,5];
>> [x,y,z]=fmincon('zhabc',[1,3]或[4,4],[],[],a,b,l,u)注意[1,3]范围x = 5.0000 3.0000
y = 17
z = 1
如再增加非线性条件:x^2+y^2=34,exp(y)<=64 (结果是不变的) ----去掉上/下限function [c,d]=zhxy(x) a=x(1);b=x(2); c=exp(b)-64;d=a^2+b^2-34;(先不后等)
aeq=[1,1];beq=8;-----此(非线性条件)函数也只能有一个参数
>> l=[-5,0];u=[10,5];
>> [x,fval,exitflag]=fmincon('zhabc',[5,4],[],[],aeq,beq,l,u,'zhxy')-----x0还可为[5,3]等,可能要多次试用
或程序为function [c,ceq]=fxx1(t) ----初值1,1---1,2 不可以,而3,2等则可以x=t(1);
y=t(2);
c=exp(y)-64;
ceq=x^2+y^2-34;
如有多个非线性条件,如再增加sin(x)+exp(y)<=70,x*y>=14, x+y^2=14
function [c,d,c2,d2]=zhxy(x) 先不等式后等式,不1,等1,不2,等2……(一定是一个形参)
a=x(1);b=x(2); c=exp(b)-64; c2=sin(a)+exp(b)-70; d=a^2+b^2-34;
d2=a+b^2-14;
或程序为:function [c,ceq]=fxx1(t)
x=t(1);
y=t(2);
c(1)=exp(y)-64;
c(2)=sin(x)+exp(y)-70;
c(3)=-x*y+14;
ceq=x^2+y^2-34;
ceq(2)=x+y^2-14;
如再加条件:x^3+y^3=152 则
function [c,d,c2,d2,c3,d3]=zhxy(x) a=x(1);b=x(2); c=exp(b)-64;
c2=sin(a)+exp(b)-70; d=a^2+b^2-34; d2=a+b^2-14;
c3=[];d3=a^3+b^3-152;
不能(最好不要)有太多的等式条件
(因为这可以解方程了。


如4:P330 考虑三段旅程所化时间最
短问题。

第一段为沙漠,长
度为10千米,行走速度为
5km/h,第二段为河流,长度
为10,坐渡般速度为10,
第三段为平地,长度为10,
坐汽车速度为40,且起点与
终点的水平距离为40,垂直
距离为30,求最短时间
(答案:1.214, 2.483, 36.303;
3.9864)
如5:P327漏斗问题(即漏斗的表
面积一定,求漏斗容积的最
大化
v=1/3*pi*r2*h
=1/3*pi*h3 *sin2(x)*cos(x)
s=pi*h2*sin(x)
(如要s=100,则h=7.4252, x=0.6155,化角度为x*180/pi=35.2644, v=116.675,
必须转化成求最小值问题)
如6: P337计算平面方程x+3y+5z=11, 求平面到原点的垂直距离及垂
足的坐标.
(d=x2+y2+z2,求d的最小值约束条件为:x+3y+5z=11,结果为
0.3143,0.9429,1.5714; 3.4571)
例7:P321-326多级铁心设计
例8:P355今有4种素食品,其维生素每公斤含量,人每天维生素需要量
和食品价格见下表,求在满足每天所需维生素的前提下如何使开支最小。

食品成分甲乙丙丁每天需
要量
维A 1000 1500 1750 3250 4000 维B 0.6 0.27 0.68 0.3 1.0 维C 17.5 7.5 0 30 30 价格1.6 1 1.8 3.0
设每天需要甲乙丙丁食品各x,y,z,m minf=1.6x+y+1.8z+3m
1000x+1500y+1750z+3250m>=4000 0.6x+0.27y+1750z+0.3m>=1.0
17.5x+7.5y+0z+30m>=30
x,y,z,m>=0
>=必须转化成<= (乘以-1)
(结果0.71753,2.02588,0.00000000004492,0.074966/f=3.3988398)
例9:某工厂生产两种产品A和B,产品A的利润每台150元,B的每台利润为200元. 产品A B每台所需加工工时及设备所能提供加工工
时见下表,问如何安排生产才能使
工厂的利润最大.
工时产品工序A B 每月可用
工时
机械加工 3.0 2.0 1500
装配 2.0 3.0 1500
设A的每月台数为x, B的每月生产台数为y,总利润为p, 则目标函数求最
大值maxP=150x+200 y
约束条件为: 3x+2y<=1500
2x+3y <=1500
x,y>=0
(求最大:必须要两次取反) function f=zhabc(x)
a=x(1);b=x(2);
f=-(150*a+200*b);
a=[3,2;2,3];b=[1500;1500];
>> l=[0,0];u=[inf,inf](可要可不要);
>> [x,fval,exitflag]=fmincon('zhabc',[2,2],a,b,[],[],l) x =
300.0000 300.0000
fval =
-105000 所以结果为-(-105000)即105000
exitflag =
1
结果为:x =
300.0000
300.0000
fval = -1.0500e+005
(也可以u=[inf,inf])
此题用linprog求解的结果也是一样的。

------非线性条件------
(第九个条件,编另一个程序)
fmincon(‘程序名’,x0, A,b,
Aeq,beq, l,u, ‘程序2’)
其中‘程序2’ 是用于非线性
约束,它的格式为:c(x)<=0
ceq(x)=0
程序形式为:
function [c,ceq]=fxx(x)
c=……;
ceq=……;
(如无等式,则ceq=0或ceq=[ ];如无不等式条件:则c=[ ] 或c=0) 如有多个非线性条件---见下面的例3---方法1:可以返回2/4/6/8…个结果,结果分别为不1、等1、不2、等2、不3、等3……,没有的则用
[ ]或0 方法2:把c,ceq视作数组,即c=[不1, 不2, 不3,…]; ceq=[等1,等2, 等3,……] 或c(1)=不1; c(2)= 不2;……; ceq(1)=等1;……,建议最好使用最后一种形式,即c(1),c(2),c(3)…ceq(1),ceq(2),ceq(3)…
如3:f(x,y)=x2+y2-xy-10x-4y+60
求其最小值
约束条件为:x+y=8,
x,y的上下限分别为[-5,10],[0,5]
(答案为:5,3;17)
function f=zhabc(x)
a=x(1);b=x(2);
f=a^2+b^2-a*b-10*a-4*b+60;
a=[1,1];b=8;
>> l=[-5,0];u=[10,5];
>> [x,y,z]=fmincon('zhabc',[1,3],[],[],a,b,l,u) 注意[1,3]范围x = 5.0000 3.0000
y = 17
z = 1
如再增加非线性条件:x^2+y^2=34,exp(y)<=64 (结果是不变的)
function [c,d]=zhxy(x) a=x(1);b=x(2); c=exp(b)-64;d=a^2+b^2-34;(先不后等)aeq=[1,1];beq=8;
>> l=[-5,0];u=[10,5];
>> [x,fval,exitflag]=fmincon('zhabc',[5,4],[],[],aeq,beq,l,u,'zhxy')-----x0还可为[5,3]等,可能要多次试用
或程序为function [c,ceq]=fxx1(t)------初值1,1---1,2 不可以,而3,2等则可以
x=t(1);
y=t(2);
c=exp(y)-64;
ceq=x^2+y^2-34;
如有多个非线性条件,如再增加sin(x)+exp(y)<=70,x*y>=14,
x+y^2=14
function [c,d,c2,d2]=zhxy(x) 先不等式后等式,不1,等1,不2,等2……(一定是一个形参)
a=x(1);b=x(2); c=exp(b)-64; c2=sin(a)+exp(b)-70; d=a^2+b^2-34;
d2=a+b^2-14;
或程序为:function [c,ceq]=fxx1(t)
x=t(1);
y=t(2);
c(1)=exp(y)-64;------最好使用这个方法
c(2)=sin(x)+exp(y)-70;
c(3)=-x*y+14;
ceq=x^2+y^2-34;
ceq(2)=x+y^2-14;
如再加条件:x^3+y^3=152 则
function [c,d,c2,d2,c3,d3]=zhxy(x) a=x(1);b=x(2); c=exp(b)-64;
c2=sin(a)+exp(b)-70; d=a^2+b^2-34; d2=a+b^2-14;
c3=[];d3=a^3+b^3-152;。

相关文档
最新文档