最优化课程设计黄金分割法及其算法实现.docx
《最优化课程设计黄金分割法及其算法实现.docx》由会员分享,可在线阅读,更多相关《最优化课程设计黄金分割法及其算法实现.docx(18页珍藏版)》请在冰豆网上搜索。
最优化课程设计黄金分割法及其算法实现
机械优化设计报告
姓名:
刘洋
学号:
S12080203054
院系:
机械工程学院
专业:
机械设计及理论
2012年12月4日
摘要
最优化理论和方法日益受到重视,已经渗透到生产、管理、商业、军事、决策等各个领域,而最优化模型和方法广泛应用于工业、农业、交通运输、商业、国防、建筑、同学、政府机关等各个部门及各个领域。
伴随着计算机技术的高速发展,最优化理论和方法的迅速进步为解决实际最优化问题的软件也在飞速发展。
其中,MATLAB软件已经成为最优化领域应用最广的软件之一。
有了MATLAB这个强大的计算平台,既可以利用MATLAB优化工具箱(OptimizationToolbox)中的函数,又可以通过算法变成实现相应的最优化计算。
关键词:
优化、黄金分割法、最速下降法、MATLAB、算法
Abstract
Optimizationtheoryandmethodsandmoreattention,havepenetratedintotheproduction,management,business,military,decision-makingandotherfields,andoptimizationmodelsandmethodswidelyusedinindustry,agriculture,transportation,commerce,defense,construction,students,governmentvariousdepartmentsandagenciesandotherfields.Withtherapiddevelopmentofcomputertechnology,optimizationtheoryandmethodsfortherapidprogressoftheoptimizationproblemtosolvepracticalsoftwareisalsodevelopingrapidly.Which,MATLABsoftwarehasbecomethemostoptimizationsoftwareisoneofthemostwidelyused.WiththispowerfulcomputingplatformMATLAB,eitherusingMATLABoptimizationtoolbox(OptimizationToolbox)inthefunction,butalsocanachievetheappropriatealgorithmtooptimizeintothecalculation.
Keywords:
Optimization、Goldensectionmethod、steepestdescentmethod、MATLAB、algorithm
第1章绪论
在人类活动中,要办好一件事(指规划、设计等),都期望得到最满意、最好的结果或效果。
为了实现这种期望,必须有好的预测和决策方法。
方法对头,事半功倍,反之则事倍功半。
优化方法就是各类决策方法中普遍采用的一种方法。
历史上最早记载下来的最优化问题可追溯到古希腊的欧几里得(Euclid,公元前300年左右),他指出:
在周长相同的一切矩形中,以正方形的面积为最大。
十七、十八世纪微积分的建立给出了求函数极值的一些准则,对最优化的研究提供了某些理论基础。
然而,在以后的两个世纪中,最优化技术的进展缓慢,主要考虑了有约束条件的最优化问题,发展了一套变分方法。
六十年代以来,最优化技术进入了蓬勃发展的时期,主要是近代科学技术和生产的迅速发展,提出了许多用经典最优化技术无法解决的最优化问题。
为了取得重大的解决和军事效果,又必将解决这些问题,这种客观需要极大地推动了最优化的研究和应用。
另一方面,近代科学,特别是数学、力学、技术和计算机科学的发展,以及专业理论、数学规划和计算机的不断发展,为最优化技术提供了有效手段。
现在,最优化技术这门较新的科学分支目前已深入到各个生产和科学领域,例如:
化学工程、机械工程、建筑工程、运输工程、生产控制、经济规划和经济管理等,并取得了重大的经济效益和社会效益。
机械优化设计是最优化技术在机械设计领域的移植和应用,其基本思想是根据机械设计的理论,方法和标准规范等建立一反映工程设计问题和符合数学规划要求的数学模型,然后采用数学规划方法和计算机计算技术自动找出设计问题的最优方案,求解优化问题可以采用解析法,也可以采用数值法。
由于数值法可用于求复杂函数的优化解,也可以用于处理没有数学解析表达式的优化设计问题,因此它是实际问题中常用的解法,很受重视。
第2章黄金分割法的基本思想和原理
2.1黄金分割法的基本原理和步骤
一维搜索是解函数极小值的方法之一,其解法思想为沿某一已知方向求目标函数的极小值点。
一维搜索的解法很多,这里主要采用黄金分割法(0.618法)。
该方法用不变的区间缩短率0.618代替斐波那契法每次不同的缩短率,从而可以看成是斐波那契法的近似,实现起来比较容易,也易于人们所接受。
黄金分割法是用于一元函数f(x)在给定初始区间[a,b]内搜索极小点xmin的一种方法。
它是优化计算中的经典算法,以算法简单、收敛速度均匀、效果较好而著称,是许多优化算法的基础,但它只适用于一维区间上的凸函数,即只在单峰区间内才能进行一维寻优,其收敛效率较低。
其基本原理是:
依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩小搜索区间。
具体步骤是:
在区间[a,b]内取点:
a1,a2把[a,b]分为三段。
如果f(a1)>f(a2),令a=a1,a1=a2,a2=a+0.618*(b-a);
如果f(a1)如果|(b-a)/b|和|(y1-y2)/y2|都大于收敛精度ε重新开始循环。
因为[a,b]为单峰区间,这样每次可将搜索区间缩小0.618倍,处理后的区间都将包含极小点的区间缩小,然后在保留下来的区间上作同样的处理,如此迭代下去,将使搜索区[a,b]逐步缩小,直到满足预先给定的精度时,即获得一维优化问题的近似最优解。
插入点原理图如下:
2.2算法流程图
2.3用matlab编写源程序
编写程序,并且输出每次的搜索区间。
则源程序如下:
golden程序
function[x,fval]=golden1(f,a,b,eps)
k=0;
a1=a+0.382*(b-a);%插入点的值
a2=a+0.618*(b-a);
y1=f(a1);
y2=f(a2);
whileabs(b-a)>=eps%循环条件,eps为收敛精度
ify1>=y2%比较插入点的函数值的大小
a=a1;%缩短搜索区间
a1=a2;
y1=y2;
a2=a+0.618*(b-a);
y2=f(a2);
else
b=a2;
a2=a1;
y2=y1;
a1=b-0.618*(b-a);
y1=f(a1);
end
k=k+1;
end%停止迭代
x=(a+b)/2;%取最后两点的平均值作为极小点的数值近似解
fval=f(x);
fprintf('k=\n');%显示迭代次数
disp(k);
end
2.4黄金分割法应用举例
例1
根据0.618算法编写程序,求函数
在区间
上的极大值。
解:
程序为:
>>z=@(t)t^2-10*t+36;[x,fval]=golden(z,0,10,10^-6)
运行结果:
k=
34
t=
5.0000
fval=
11.0000
说明最小值点为
,最小值为
,迭代次数为34
第3章最速下降法的基本思想和原理
3.1最速下降法基本思路
最速下降法的搜索法向是目标函数的负梯度方向,最速下降法从目标函数的负梯度方向一直前进,直到到达目标函数的最低点。
已知目标函数在
点的梯度为:
当求目标函数的最小点时,由于函数沿负梯度方向下降最快,故在
点的探索方向应取该点的负梯度方向,即
显然,
为单位向量。
这样第
次迭代计算所得的新点为
负梯度仅给出了最优化方向,而没有给出步长的大小,所以可能有各种各样的最速下降的过程,它们依赖于的大小。
步长
有两种取法:
一种方法是任意给定一个初始步长,使满足条件:
另外一种方法是沿负梯度方向做一维探索,以求解一维最优化问题的最优步长
,即对目标函数极小,以得到最优步长:
以此最优步长作为由
点出发沿该点的负梯度方向探索的步长
。
这种方法的迭代计算的收敛性,可用以下三式中的任一式或二式作为准则来进行判断:
用最速下降法求无约束多维极值问题
的算法步骤如下:
(1)取初始点
,精度
,令
(2)计算搜索方向
,其中
表示函数
在点
处的梯度;
(3)若
,则停止计算;否则,从
出发,沿
进行一维搜索,即求
,使得
。
此处的一维搜索可以用黄金分割法等算法,当然也可以用MATLAB的
函数;
(4)令
,转步骤
(2)。
3.2算法流程图
3.3用matlab编写源程序
编写程序,并且输出每次的搜索区间。
则源程序如下:
fsxsteep程序
functionx=fsxsteep(f,e,a,b)
%fsxsteep函数最速下降法
%x=fsxsteep(f,e,a,b)为输入函数f为函数e为允许误差(a,b)为初始点;
%fsxTJPU2008.6.15
x1=a;x2=b;
Q=fsxhesse(f,x1,x2);
x0=[x1x2]';
fx1=diff(f,'x1');%对x1求偏导数
fx2=diff(f,'x2');%对x2求偏导数
g=[fx1fx2]';%梯度
g1=subs(g);%把符号变量转为数值
d=-g1;
while(abs(norm(g1))>=e)
t=(-d)'*d/((-d)'*Q*d);t=(-d)'*d/((-d)'*Q*d);%求搜索方向
x0=x0-t*g1;%搜索到的点
v=x0;
a=[10]*x0;
b=[01]*x0;
x1=a;
x2=b;
g1=subs(g);
d=-g1;
end;
x=v;
functionx=fsxhesse(f,a,b)
%fsxhesse函数求函数的hesse矩阵;
%本程序仅是简单的求二次函数的hesse矩阵!
;
%x=fsxhesse(f)为输入函数f为二次函数x1,x2为自变量;
%fsxTJPU2008.6.15
x1=a;x2=b;
fx=diff(f,'x1');%求f对x1偏导数
fy=diff(f,'x2');%求f对x2偏导数
fxx=diff(fx,'x1');%求二阶偏导数对x1再对x1
fxy=diff(fx,'x2');%求二阶偏导数对x1再对x2
fyx=diff(fy,'x1');%求二阶偏导数对x2再对x1
fyy=diff(fy,'x2');%求二阶偏导数对x2再对x2
fxx=subs(fxx);%将符号变量转化为数值
fxy=subs(fxy);
fyx=subs(fyx);
fyy=subs(fyy);
x=[fxx,fxy;fyx,fyy];%求hesse矩阵
3.4最速下降法应用举例
例
根据算法编写程序,求函数
在初始点
上的极小值。
解:
程序为:
>>symsx1x2;
X=[x1,x2];
fx=(4*X
(1)-5)^2+(X
(2)-6)^2;
x=fsxsteep(fx,0.001,8,9)
运行结果:
x=
5
6
第4章惩罚函数法的基本思想和原理
4.1惩罚函数法基本思路
惩罚函数法是应用广泛,非常有效的间接解法,又称为序列无约束极小化方法(SUMT法)。
该方法通过将原约束优化问题中的等式和不等式约束函数加权处理后和原目标函数结合,得到新的目标函数(惩罚函数)。
原问题转化为新的无约束优化问题,求解该新的无约束优化问题,间接得到原约束优化问题的最优解。
程序步骤:
①选择适当的初始罚因子
、初始点
、收敛精度
和罚因子系数c。
在本程序中分别取令迭代步数k=0。
②采用牛顿法求无约束问题
的极值点
。
③检验迭代终止准则,若满足
及
则停止迭代计算,输出最优点
;否则,转入步骤④。
④取
,
,k=k+1,转入步骤②继续迭代。
4.2算法流程图
给定、、c、
4.3用matlab编写程序
clc
symsx1x2M;%M为罚因子。
m
(1)=1;
c=8;%c为递增系数。
赋初值。
a
(1)=20;
b
(1)=20;
f=(x1-2)^2+(x2-1)^2+M*((x1^2-x2)^2+(x1+x2-2)^2);%外点罚函数
f0
(1)=500;
%求偏导、Hessian元素
fx1=diff(f,'x1');
fx2=diff(f,'x2');
fx1x1=diff(fx1,'x1');
fx1x2=diff(fx1,'x2');
fx2x1=diff(fx2,'x1');
fx2x2=diff(fx2,'x2');
%外点法M迭代循环
fork=1:
100
x1=a(k);x2=b(k);M=m(k);
%牛顿法求最优值
forn=1:
100
f1=subs(fx1);%求解梯度值和Hessian矩阵
f2=subs(fx2);
f11=subs(fx1x1);
f12=subs(fx1x2);
f21=subs(fx2x1);
f22=subs(fx2x2);
if(double(sqrt(f1^2+f2^2))<=1e-6)%最优值收敛条件
a(k+1)=double(x1);b(k+1)=double(x2);f0(k+1)=double(subs(f));
break;
else
X=[x1x2]'-inv([f11f12;f21f22])*[f1f2]';
x1=X(1,1);x2=X(2,1);
end
end
if(double(sqrt((a(k+1)-a(k))^2+(b(k+1)-b(k))^2))<=1e-6)&&(double(abs((f0(k+1)-f0(k))/f0(k)))<=1e-6)%罚因子迭代收敛条件
%输出最优点坐标,罚因子迭代次数,最优值
a(k+1)
b(k+1)
k
f0(k+1)
break;
else
m(k+1)=c*m(k);
end
end
4.4惩罚函数法应用举例
例
根据算法编写程序,求函数
在初始点
上的极小值。
解:
运行结果:
ans=
1.0000
ans=
1.0000
k=
18
ans=
1.0000
第五章总结
刚开始觉得学习优化设计有很大的困难,但是随着对课本内容的学习跟老师的讲解,发现并不是像自己在学初想的那样困难,特别是在老师介绍了一些和机械优化设计相关的计算机语言和计算机软件后,真正体会到科学优化设计的强大跟简洁明了,和传统优化设计方法相比较,大大提高了设计效率和质量。
传统设计方法常在调查分析的基础上,参照同类产品通过估算,经验类比或试验来确定初始设计方案,如不能满足指标要求,则进行反复分析计算—性能检验—参数修改,到满足设计指标要求为止。
整个传统设计过程就是人工凑试和定性分析比较的过程,是被动地重复分析产品性能,不是主动设计产品参数。
按照传统设计方法做出的设计方案,有改进余地,但不是最佳设计方案。
而现代化设计工作是借助电子计算机,,应用一些精确度较高的力学数值分析方法,优化软件进行分析计算,找最优设计方案,实现理论设计代替经验设计,用精确计算代替近似计算,用优化设计代替一般的安全寿命可行性设计。
在进行程序求解的过程中,因为是初学Matlab软件,对很多问题的关键点不能够掌握,非线性约束如何书写,上、下限如何选择,函数格式如何书写,变量未定义等等或大或小的问题,但是在一步步排除错误、重新编写程序的过程中,渐渐的对Mtalab熟悉起来,懂得了一些优化方法的简单计算过程和原理,省去了繁琐复杂的优化计算过程。
在学完课程之后,反思自己在学习过程中的得失,深深体会到,不论在人生的哪个阶段,都要对自己负责,做任何事都要耐心,细致,“千里之行,始于足下”,学会在物欲横流的社会大潮中,坚持踏踏实实走好人生的每一步。
感谢所有老师和同学们!
参考文献
1孙靖民,梁迎春.机械优化设计.机械工业出版社,2006
2张德丰.MATLAB语言高级编程,2010