优化课程实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;