最优化实验报告.docx
- 文档编号:28187540
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:21
- 大小:172.75KB
最优化实验报告.docx
《最优化实验报告.docx》由会员分享,可在线阅读,更多相关《最优化实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
最优化实验报告
《最优化方法及其应用》
课程实验报告
项目名称:
最优化方法课程实验
学生姓名:
许庆平
学生学号:
3111008162
指导教师:
杨理平
完成日期:
2013年12月30
、实验内容
项目一一维搜索算法
(一)
[实验目的]
编写加步探索法、对分法、Newton法的程序。
[实验学时]
2学时
[实验准备]
1掌握一维收搜索中搜索区间的加步探索法的思想及迭代步骤;
2•掌握对分法的思想及迭代步骤;
3.掌握Newton法的思想及迭代步骤。
[实验内容及步骤]
编程解决以下问题:
1.用加步探索法确定一维最优化问题
min(t)t32t1
t0
的搜索区间,要求选取to°,ho1,2.
2.用对分法求解
min(t)t(t2)
已知初始单谷区间[a,b][3,5],要求按精度0.3,°.°°1分别计算.
3.用Newton法求解
3
min(t)t32t1已知初始单谷区间[a,b][0,1],要求精度0.01.
项目二一维搜索算法
(二)
[实验目的]
编写黄金分割法、抛物线插值法的程序。
[实验学时]
2学时
[实验准备]1.掌握黄金分割法的思想及迭代步骤;2.掌握抛物线插值法的思想及迭代步骤。
[实验内容及步骤]编程解决以下问题:
1.用黄金分割法求解min(t)t(t2),已知初始单谷区间[a,b][3,5],要求精度0.001.
2.用抛物线插值法求解minf(x)8x32x27x3
已知初始单谷区间[a,b][0,2],0.001.
项目三常用无约束最优化方法
(一)
[实验目的]
编写最速下降法、Newton法(修正Newton法)的程序。
[实验学时]
2学时[实验准备]
1.掌握最速下降法的思想及迭代步骤。
2.掌握Newton法的思想及迭代步骤;
3.掌握修正Newton法的思想及迭代步骤。
[实验内容及步骤]
编程解决以下问题:
1.用最速下降法求
minf(X)x1225x22,X0[2,2]T,0.01
2.用Newton法求
minf(X)6010x14x2x12x22x1x2,初始点X0[0,0],0.01.
3.用修正Newton求
22minf(X)4(x11)22(x21)2x1x210,初始点X0[0,0],0.01.
项目四常用无约束最优化方法
(二)
[实验目的]
编写共轭梯度法、变尺度法(DFP法和BFGSt)程序。
[实验学时]2学时
[实验准备]
1.掌握共轭方向法的思路及迭代过程;
2.掌握共轭梯度法的思想及迭代步骤;
3.掌握DFP法和BFGSS的思想及迭代步骤。
[实验内容及步骤]编程解决以下问题:
1.用共轭梯度法求得min(x14x2),取初始点X0[1,1],0.01.
22
2.用共轭梯度法求minf(X)2x1x2x1x2,自定初始点,0.01.
22
3.用DFP法求minf(X)4(x15)(X26),初始点X。
[8,9]t,0.01.项目五常用约束最优化方法
[实验目的]编写外点罚函数法、外点罚函数法的程序。
[实验学时]
2学时
[实验准备]
1.掌握外点罚函数法的思想及迭代步骤;
2.掌握内点罚函数法的思想及迭代步骤。
[实验内容及步骤]
编程解决以下问题:
1.用外点罚函数法编程计算
minf(X)x1x2,
gi(X)Inx20,
s.t.
h1(X)x1x210,
精度105.
2•用内点罚函数法编程计算
13min—(儿1)x2,
3
为10,
st.x20.
0.1.
C++源文件
初始点取为X。
[3,4]丁,初始障碍因子取u110,缩小系数取C
二、实验主要步骤
首先用VC为每一个项目新建一个工程,再新建一个再把有关头文件包含进去,有关头文件的定义:
#include
#include
#include
三、程序清单
项目一
(1)//函数f(t)=tA3-2t+1
doublef1(doublet){
doubley;
y=t*t*t-2*t+1;
returny;
}
//加步探索法
doublejiabu(doublet,doubleh,doublee){
doublet0,
t1,y;t0=t;
do{
t1=t0+h;
if(f1(t1) h=2*h;} else{ if(fabs(h) {y=t0;break;} h=-0.25*h;}}while (1);returny; } //主函数 voidmain(){doublet,h,e; cout<<"请输入初始点t: ";cin>>t;cout<<"请输入步长h: ";cin>>h;cout<<"请输入精确度e: ";cin>>e;doublex=jiabu(t,h,e); cout<<"极小点为: "<<"x="< (2) //函数f(t)=t(t+2)的导函数doublef2(doublet){doubley; y=2*t+2;returny;} //对分法 doubleduifen(doublea,doubleb,doublee){ doublex0=0.5*(a+b); do{if(f2(x0)>0){b=x0;x0=(a+b)*0.5;}else{a=x0;x0=(a+b)*0.5;}}while(fabs(a-b)>=e); returnx0;}//主函数voidmain(){doublea,b,e; cout<<"请输入区间: ";cin>>a>>b;cout<<"请输入精确度: ";cin>>e;doublet=duifen(a,b,e); cout<<"极小点为: x="< (3) //函数f(t)=tA3-2t+1的一阶导函数 doublef3(doublet){ return3*t*t-2; } //函数f(t)=tA3-2t+1的二阶导函数 doublef4(doublet){ return6*t; }//Newton法doubleNewton(doublex,doublee){doublex0=x,x1; do{x1=x0-f3(x0)/f4(x0); x0=x1;}while(fabs(f3(x0))>=e); returnx0; } //主函数 Voidmain(){doublet,e;cout<<"请输入初始点t: ";cin>>t;cout<<"请输入精确度: ";cin>>e;doublex=Newton(t,e); cout<<"极小点为: x="< 项目二 (1) /函数f(t)=t(t+2) doublef1(doublet){doubley; y=t*(t+2); returny; } //黄金分割法 doublegold(doublea,doubleb,doublee){doublem1,m2; m1=a+0.382*(b-a); m2=a+0.618*(b-a);while((b-a)>=e){if(f1(m1)>f1(m2)){ a=m1; m1=m2;m2=a+0.618*(b-a); } else{ b=m2; m2=m1;m1=a+0.382*(b-a); }} return0.5*(b+a); } intmain(){ doublea,b,e; cout<<"请输入区间: ";cin>>a>>b; cout<<"请输入精确度: ";cin>>e; doublet=gold(a,b,e); cout<<"极小点为x="< (2) //函数f(x)=8xA3-2xA2-7x+3 doublef2(doublex){ return8*x*x*x-2*x*x-7*x+3; } //抛物线插值法 doublepaowuxian(doublex0,doublex1,doublex2){doubley y=0.5*(x1+x0-((f2(x1)-f2(x0))*(x2-x1))/((x1-x0)*(f2(x2)-f2(x1)))); returny; } Voidmain(){doublea,b,c; cout<<"请输入3个插入节点的值(初始区间为[0,2]): ";cin>>a>>b>>c; doublex=paowuxian(a,b,c); cout<<"极小点为x=: "< 项目三 (1) //最速下降法 voidxiajiang(double&x1,double&x2,doublee){ doublea; while(sqrt(4*x1*x1+2500*x2*x2)>=e){a=(x1*x1+625*x2*x2)/((2*x1*x1+31250*x2*x2));x1=x1-2*a*x1;x2=x2-50*a*x2; } } Voidmain(){doublex1,x2,e;cout<<"请输入初始点(x1,x2): ";cin>>x1>>x2; cout<<"请输入精确度: ";cin>>e; xiajiang(x1,x2,e); cout<<"极小点 为: ("vvx1vv","vvx2 (2) //Newton法 voidNewton(double&x1,double&x2,doublee){while(sqrt((-10+2*x1-x2)*(-10+2*x1-x2)+(-4+2*x2-x1)*(-4+2*x2-x1))>=e){ x1=x1-(-8+x1);x2=x2-(-6+x2);} } Voidmain(){ doublex1,x2,e; cout<<"请输入初始点(x1,x2): ";cin>>x1>>x2; cout<<"请输入精确度: ";cin>>e; Newton(x1,x2,e); cout<<"极小点为: ("< cout<<"minf(x)="<<60-10*x1-4*x2+x1*x1+x2*x2-x1*x2< (3) //修改后的Newton法voidCnewton(float&x1,float&x2,floate){while(sqrt((8*x1+9)*(8*x1+9)+(4*x2-3)*(4*x2-3))>=e)x1=x1-(x1+9/8.0);x2=x2-(x2-3/4.0); } Voidmain(){floatx1,x2,e; cout<<"请输入初始点(x1,x2): ";cin>>x1>>x2; cout<<"请输入精确度: ";cin>>e;Cnewton(x1,x2,e); cout<<"极小点为: ("< } 项目四 (1) //共轭梯度法算min(x1八2+4x2八2) voidTidu1(double&a,double&b,doublee){ intk=0;doubleg=4*a*a+8*b*b; doubles=-2*a,q=-8*b; again1: doublem=-(s*a+4*q*b)/(s*s+4*q*q);a=a+s*m;b=b+q*m; doubleg1=4*a*a+8*b*b; if(sqrt(g1) else{ if(k<1){ doublen=g1/g; s=-2*a+n*s; q=-8*b+n*q; k=k+1; gotoagain1;} elseTidu1(a,b,e); }} //主函数 voidmain(){ doublex1,x2,e; cout<<"请输入初始点(x1,x2): ";cin>>x1>>x2; cout<<"请输入精确度: ";cin>>e; Tidu1(x1,x2,e); cout<<"极小点为x=("< (2) //共轭梯度法算minf(x)=2x1八2+x2八2-x1*x2 voidTidu2(double&a,double&b,doublee){ intk=0;doubleg=(4*a-b)*(4*a-b)+(2*b-a)*(2*b-a); doubles=b-4*a,q=a-2*b; again2: doublem=(a*q+s*b-4*a*s-2*b*q)/(4*s*s+2*q*q-2*s*q); a=a+s*m;b=b+q*m; doubleg1=(4*a-b)*(4*a-b)+(2*b-a)*(2*b-a); if(sqrt(g1) else{ if(k<1){ doublen=g1/g; s=b-4*a+n*s; q=a-2*b+n*q; k=k+1; gotoagain2;}elseTidu2(a,b,e);} } //主函数 voidmain(){ doublex1,x2,e;cout<<"请输入初始点(x1,x2): ";cin>>x1>>x2; cout<<"请输入精确度: ";cin>>e; Tidu2(x1,x2,e); cout<<"极小点为x=("< cout<<"minf(x)="<<2*x1*x1+x2*x2-x1*x2< } (3) //DEP法 voidDEP(double&a,double&b,doublee){ intk=0;doubles=40-8*a,q=12-2*b; again: doublem=(6*q+20*s-b*q)/(4*s*s+q*q); doublea1=a+m*s,b1=b+m*q; doubleg=(8*a1-40)*(8*a1-40)+(2*b-12)*(2*b-12);if(sqrt(g) a=a1; b=b1;return;} else{if(k<1){ doublex=a1-a,y=b1-b; doublec=8*(a1-a),d=2*(b1-b); doubleh1=1+x*x/(x*c+y*d)-c*c/(c*c+d*d); doubleh2=x*y/(x*c+y*d)+c*d/(c*c+d*d); doubleh3=h2; doubleh4=1+y*y/(x*c+y*d)-d*d/(c*c+d*d); doubleg1=8*a1-40,g2=2*b1-12; s=-h1*g1-h2*g2; q=-h3*g1-h4*g2; k=k+1; gotoagain;}elseDEP(a1,b1,e);} } //主函数 voidmain(){ doublex1,x2,e;cout<<"请输入初始点(x1,x2): ";cin>>x1>>x2;cout<<"请输入精确度: ";cin>>e;DEP(x1,x2,e); cout<<"极小点为x=("< } 项目五 (1) voidwaidian(double&a,double&b,doublee){ intM=4; do{ a=1/2*M; b=M/(M-1); M=100*M; }while(fabs(a+b-1)>=e); } voidmain(){doublex1,x2,e;cout<<"请输入精确度: ";cin>>e;waidian(x1,x2,e);cout<<"极小点为x=("< } (2) voidneidian(double&a,double&b,doublee){doubleu1=10; doublec=0.1; do{a=(1+sqrt(1+2*u1))/2;b=u1;u1=u1*c; }while(a-1>=e&&b>=e); } voidmain(){ doublex1,x2,e; cout<<"请输入精确度: ";cin>>e;neidian(x1,x2,e); cout<<"极小点为x=("< 四、实验结果项目一 (1) MC: \UAdmini5tr^tQr\De&ktop\®优Hi实捡\tw tie点h;度-1始长确: t 圭=入入入点“ ffriJFLTn/n圭冃圭冃青頤i■Itlu—ILr1IF Pressanykeutocontinue rrr (2) (3) (0) n4>壬命<14 昌詁感邕v漳删 字总一凶vlfe显 -a習绘T-B吕mu拓恐乎^ti^^victSa9JD3场U£pS5J聖n.0- (L) nm^M 项目三 (1) 'C: \Users\Administrator\Desletop'呈优e...I? dI凹 请输入初始点txl■也〉屹 请制入精确度泪・01 极小点为: <0-0024118B,-3.85901e-006> ninf 55e-006 Freesani/keytocant;Inue ■rr (2) ■C: \U&ers\Adiriini5tr钳gr\Dg\t焙曲\g・・・〔I回 £1 请输入初始点 回 请菊I入萌确度胡血 极小点为=<•6> ninf Pressarsfkeytocontinue 项目四 (1) I*C: \ll&ers\Administrator\pes化奥验牡Debu-g\tes_.. 睛输入初始点£4mu i 请制入稱确度=0-0001 极小点为=<-«>«> ndnfKxJ=0 PressNnykE_vtengontinue (3) *C: \User5\A-dmini^trdtor\Deslet口pl最优化^捡曲期\口亡bs」l宁'I四屮■^gl 1青输入初始点txl・x£》;討 请稱入精确度: 0.ei 赧小点为x=<5,6) min* Pressanykeytocontinue itr irr 项目五 (1) 谪输入帶确倉詛上跑酿极小点为其yio-eaaninf Pi'essan^keutocontinue 上课纪律(20% 头验过程及结果(40% 实验报告质量(40% 教师评语: 总分: 教师签字:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 优化 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)