一维搜索法程序的编制、调试和结果分析(0.618法) 题目:f(a)=2a2+5a 0 A8 v# K9 K# x. ]* y6 q g( ?) Z
-2≦a≦4 1.实验目的 1、加深对机械优化设计方法的基本理论和算法步骤的理解。 2、培养学生独立编制、调试计算机程序的能力。 3、掌握常用优化方法程序的使用方法。 4、培养学生灵活运用优化设计方法解决工程实际问题的能力。 2.基本原理简述 黄金分割法是通过不断缩短搜索区间的长度来寻求一维函数的极小点,这种方法的基本原理是:在搜索区间[a,b]内按如下规则对称地取两点 和 =a+0.382(b-a);/ d; z" }; d; M/ s! d
=a+0.618(b-a); 黄金分割法的搜索过程是: 1)给出初始搜索区间 [a,b] - x: t2 \. @8 m, L
及收敛精度 ε,将λ赋以0.618 2)计算 : V! B% J. Y- p) f- _1 n
和 ,并计算起对应的函数值 f( ),f( ) 3)根据期间消去法原理缩短搜索区间,为了能用原来的坐标点计算公式,需进行区间名称的代换,并在保留区间中计算一个新的试验点及其函数值。 4)检查区间是否缩短到足够小和函数值收敛到足够近,如果条件不满足则返回到步骤2。 5)如果条件满足,则取最后两试验点的平均值作为极小点的数值近似解。 黄金分割法的程序框图如下: 3.自编优化方法程序 #include "math.h" #include "stdio.h" #define f(x) 2*x*x+5*x# U; A9 L+ Y7 {( g9 M/ U; T. f7 e
/*一元函数f(x)=2x2+5x */double hj(double *a,double *b,double e,int *n) { double x1,x2,s; if(fabs(*b-*a)<=e) s=f((*b+*a)/2); else {
3 k$ d* P2 Z+ ?# H bx1=*a+0.382*(*b-*a); x2=*a+0.618*(*b-*a); if(f(x1)>f(x2)) *a=x1; else *b=x2; *n=*n+1; s=hj(a,b,e,n); } return s; } main() { double s,a,b,e; int n=0; scanf("%lf %lf %lf",&a,&b,&e);
& s; m* ~3 @0 X6 S8 g& g; i/* 输入区间[a,b]和精度e的值*/s=hj(&a,&b,e,&n);8 F; M+ n/ M# R0 ]5 h& g8 d0 k
/*调用hj函数,其中n代表迭代次数*/printf("a=%lf,b=%lf,s=%lf,n=%d\n",a,b,s,n); } 4.考核计算结果及其分析。 输入:-3 8 0.35 结果输出:a=-1.395324 b=-1.161278 s=-3.123398 n=8。 |