优化课程实验

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

实验一一维搜索方法实验

实验学时:2h

实验类型:常规

实验要求:必修

一、实验目的:

1.掌握确定搜索区间的进退法,一维搜索的黄金分割法、牛顿法(切线法)、二次插值法的基本思想及迭代过程。

2.掌握上述常用一维搜索方法的优缺点及程序编制的方法。

3.掌握采用一维优化方法求优时如何提高搜索效率,减少盲目性。

二、实验内容

1、任选实验以下内容之一,自编程序;

1) 用0.618法求函数f (x)=x(x+2)在区间[-3,5]中的极小点,要求精度为ε=0.01。

2) .用0.618法求函数f (x)=x2+x+2的近似极小点及近似极小值,以致[a,

b]=[-1,3],缩短的相对精度为ε=0.08。

3) 用牛顿法求函数 f (x)=x4-5x3-4x2-6x+60的极小点及极小值, 已知[a,

b]=[3,4] ,要求精度为ε=0.01。

4) 用二次插值法求f (x)=x2+e–x的极小点及极小值, 已知[a,b]=[0,1] ,要求精度为ε=0.001。

5) 用二次插值法求f (x)=3x4-16x3+30x2-24x+8的极小点及极小值, 已知[a,

b]=[0,3] ,要求精度为ε=0.001。

2、改变初始搜索区间或精度要求,观察程序运行结果及迭代次数的变化情况。

三、实验原理、方法和手段

一维搜索方法的内容包括搜索区间的确定和区间缩小两个内容,首先给定初始点,应用外推法确定一个高—低—高的单谷区间,在采用黄金分割法或插值法进行区间缩小,当区间缩小到收敛精度。

四、实验组织运行要求

本实验为上机实验,采用单人单机,集中授课形式。

五、实验条件

人均计算机一台,安装有C语言软件。

六、实验步骤

1. 实验课前,明确实验目的和要求,预习相关内容,应用选择的算法语言

编写程序;

2. 在C 语言环境下输入和调试程序;

3. 运行程序,分析结果的正确性;

4. 改变搜索区间,运行程序,观察结果和迭代次数的变化;

5. 改变收敛精度,观察结果和迭代次数的变化。

七、思考题

对黄金分割法和二次插值法的特点进行总结,具体使用时应如何选择?

八、实验报告

1、写清上机实验的名称及要求。

2、所选优化方法的基本原理简述。

3、绘制程序框图。

4、程序中变量及参数说明。

5、运行结果分析。(要求输出迭代过程中搜索区间上下限、迭代次数、极小

点和极小值)

#include

#include

double obfunc(double x) /*目标函数*/

{

double ff;

ff=pow(x,2)+9*x;

return(ff);

}

void jts(double x0,double h0,double s[],int n,double a[],double b[]) /*进退法*/

{

int i;

double x[3],h,f1,f2,f3;

h=h0;

for(i=0;i

x[0]=x0;

f1=obfunc(x[0]);

for(i=0;i

if(f2>=f1)

{

h=-h0;

for(i=0;i

x[2]=x[0];

f3=f1;

for(i=0;i

{

x[0]=x[1];

x[1]=x[2];

}

f1=f2;

f2=f3;

}

for(;;)

{

h=2.0*h;

for(i=0;i

x[2]=x[1]+h*s[i];

f3=obfunc(x[2]);

if(f2

break;

else

{

for(i=0;i

{

x[0]=x[1];

x[1]=x[2];

}

f1=f2;

f2=f3;

}

}

if(h<0)

for(i=0;i

{

a[i]=x[2];

b[i]=x[0];

}

else

for(i=0;i

{

a[i]=x[0];

b[i]=x[2];

}

printf("%4d",n);

}

double gold(double a[],double b[],double eps,int n,double xx) /*黄金分割法*/

{ int i;

double f1,f2,ff,q,w;

double x[3];

for(i=0;i

{

x[0]=a[i]+0.618*(b[i]-a[i]);

x[1]=a[i]+0.382*(b[i]-a[i]);

}

f1=obfunc(x[0]); f2=obfunc(x[1]); do

{

if(f1>f2)

{

for(i=0;i

{b[i]=x[0];

x[0]=x[1];

}

f1=f2;

for(i=0;i

x[1]=a[i]+0.382*(b[i]-a[i]);

f2=obfunc(x[1]);

}

else

{for(i=0;i

{

a[i]=x[1];

x[1]=x[0];

}

f2=f1;

相关文档
最新文档