最优化实验报告.docx

上传人:b****3 文档编号:5125503 上传时间:2022-12-13 格式:DOCX 页数:22 大小:634.70KB
下载 相关 举报
最优化实验报告.docx_第1页
第1页 / 共22页
最优化实验报告.docx_第2页
第2页 / 共22页
最优化实验报告.docx_第3页
第3页 / 共22页
最优化实验报告.docx_第4页
第4页 / 共22页
最优化实验报告.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

最优化实验报告.docx

《最优化实验报告.docx》由会员分享,可在线阅读,更多相关《最优化实验报告.docx(22页珍藏版)》请在冰豆网上搜索。

最优化实验报告.docx

最优化实验报告

《最优化方法及其应用》

课程实验报告

项目名称:

最优化方法课程实验

学生姓名:

许庆平

学生学号:

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%)

教师评语:

 

总分:

教师签字:

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1