最优化实验报告.docx
《最优化实验报告.docx》由会员分享,可在线阅读,更多相关《最优化实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
最优化实验报告
《最优化方法及其应用》
课程实验报告
项目名称:
最优化方法课程实验
学生姓名:
许庆平
学生学号:
3111008162
指导教师:
杨理平
完成日期:
2013年12月30
一、实验内容
项目一一维搜索算法
(一)
[实验目的]
编写加步探索法、对分法、Newton法的程序。
[实验学时]
2学时
[实验准备]
1.掌握一维收搜索中搜索区间的加步探索法的思想及迭代步骤;
2.掌握对分法的思想及迭代步骤;
3.掌握Newton法的思想及迭代步骤。
[实验内容及步骤]
编程解决以下问题:
1.用加步探索法确定一维最优化问题
的搜索区间,要求选取
.
2.用对分法求解
,
已知初始单谷区间
,要求按精度
,
分别计算.
3.用Newton法求解
,
已知初始单谷区间
,要求精度
.
项目二一维搜索算法
(二)
[实验目的]
编写黄金分割法、抛物线插值法的程序。
[实验学时]
2学时
[实验准备]
1.掌握黄金分割法的思想及迭代步骤;
2.掌握抛物线插值法的思想及迭代步骤。
[实验内容及步骤]
编程解决以下问题:
1.用黄金分割法求解
,
已知初始单谷区间
,要求精度
.
2.用抛物线插值法求解
,
已知初始单谷区间
.
项目三常用无约束最优化方法
(一)
[实验目的]
编写最速下降法、Newton法(修正Newton法)的程序。
[实验学时]
2学时
[实验准备]
1.掌握最速下降法的思想及迭代步骤。
2.掌握Newton法的思想及迭代步骤;
3.掌握修正Newton法的思想及迭代步骤。
[实验内容及步骤]
编程解决以下问题:
1.用最速下降法求
.
2.用Newton法求
,
初始点
.
3.用修正Newton求
,
初始点
.
项目四常用无约束最优化方法
(二)
[实验目的]
编写共轭梯度法、变尺度法(DFP法和BFGS法)程序。
[实验学时]2学时
[实验准备]
1.掌握共轭方向法的思路及迭代过程;
2.掌握共轭梯度法的思想及迭代步骤;
3.掌握DFP法和BFGS法的思想及迭代步骤。
[实验内容及步骤]
编程解决以下问题:
1.用共轭梯度法求得
,取初始点
,
.
2.用共轭梯度法求
,自定初始点,
.
3.用DFP法求
,初始点
.
项目五常用约束最优化方法
[实验目的]
编写外点罚函数法、外点罚函数法的程序。
[实验学时]
2学时
[实验准备]
1.掌握外点罚函数法的思想及迭代步骤;
2.掌握内点罚函数法的思想及迭代步骤。
[实验内容及步骤]
编程解决以下问题:
1.用外点罚函数法编程计算
精度
.
2.用内点罚函数法编程计算
初始点取为
,初始障碍因子取
,缩小系数取
.
二、实验主要步骤
首先用VC为每一个项目新建一个工程,再新建一个c++源文件
再把有关头文件包含进去,有关头文件的定义:
#include
#include
#include
三、程序清单
项目一
(1)//函数f(t)=t^3-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)=t^3-2t+1的一阶导函数
doublef3(doublet){
return3*t*t-2;
}
//函数f(t)=t^3-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)=8x^3-2x^2-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<<"极小点为:
("<(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<<"极小点为:
("<cout<<"minf(x)="<<4*(x1+1)*(x1+1)+2*(x2-1)*(x2-1)+x1+x2+10<}
项目四
(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=("<cout<<"minf(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=("<cout<<"minf(x)="<<4*(x1-5)*(x1-5)+(x2-6)*(x2-6)<}
项目五
(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=("<cout<<"minf(x)="<<-x1+x2<}
(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=("<cout<<"minf(x)="<<((x1+1)*(x1+1)*(x1+1))/3+x2<}
四、实验结果
项目一
(1)
(2)
(3)
项目二
(1)
(2)
项目三
(1)
(2)
(3)
项目四
(1)
(2)
(3)
项目五
(1)
(2)
上课纪律(20%)
实验过程及结果(40%)
实验报告质量(40%)
教师评语:
总分:
教师签字: