当前位置:文档之家› 机械优化设计一维搜索实验报告

机械优化设计一维搜索实验报告

《机械优化设计》
实验报告
班级: 机械设计(2)班
姓名:邓传淮
学号:0901102008
1 实验名称:一维搜索黄金分割法求最佳步长
2 实验目的:通过上机编程,理解一维搜索黄金分割法的原理,了解计算机在优化设计中的应用。

3 黄金分割法的基本原理
黄金分割法是用于一元函数f(x)在给定初始区间[a,b]内搜索极小点α*的一种方法。

它是优化计算中的经典算法,以算法简单、收敛速度均匀、效果较好而著称,是许多优化算法的基础,但它只适用于一维区间上的凸函数[6],即只在单峰区间内才能进行一维寻优,其收敛效率较低。

其基本原理是:依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩小搜索区间[7]。

具体步骤是:在区间[a,b]内取点:a1 ,a2 把[a,b]分为三段。

如果f(a1)>f(a2),令a=a1,a1=a2,a2=a+r*(b-a);如果f(a1)<f(a2) ,令b=a2,a2=a1,a1=b-r*(b-a),如果|(b-a)/b|和|(y1-y2)/y2|都大于收敛精度ε重新开始。

因为[a,b]为单峰区间,这样每次可将搜索区间缩小0.618倍或0.382倍,处理后的区间都将包含极小点的区间缩小,然后在保留下来的区间上作同样的处理,如此迭代下去,将使搜索区[a,b]逐步缩小,直到满足预先给定的精度时,即获得一维优化问题的近似最优解。

黄金分割法原理如图所示,
4实验所编程序框图(1)进退发确定单峰区间的计算框图
(2)黄金分割法计算框图
5 程序源代码
(1)进退发确定单峰区间的程序源代码
#include<stdio.h>
#include<math.h>
#define f(x) pow(x,4)-3*pow(x,3)-5*pow(x,2)-14*x+46 main()
{
int k;
double x,h,x1,x2,x3;
double f1,f2,f3,f;
double a,b;
x1=0;
h=1;
x2=x1+h;
f1=f(x1);
f2=f(x2);
if (f1>f2)
{
h=2*h;
x3=x2+h;
f3=f(x3);
. }
else
{
h=-h;
x1=x2;
f1=f2;
x3=x2+h;
f3=f(x3);
}
printf("x1=%lf,x2=%lf\0",x1,x2);
do
{
x1=x2;
x2=x3;
f1=f2;
f2=f3;
x3=x2+h;
f3=f(x3);
}while(f3<f2);
if (h>0)
{
a=x1;
b=x3;
}
else
{
a=x3;
b=x1;
}
printf("a=%lf,b=%lf\n",a,b);
}
(2)黄金分割法的程序源代码
#include<stdio.h>
#include<math.h>
#define f(x)=pow(x,4)-3*pow(x,3)-5*pow(x,2)-14*x+46 main()
{
int k;
double x,h,x1,x2,x3,c;
double f1,f2,f3,f;
double a,b;
printf("input c:\n");
scanf("%lf",&c);
a=1;
b=5;
x1=b-0.618*(b-a);printf("x1=%lf ",x1);
f1=f(x1);printf("f1=%lf ",f1);
x2=a+0.618*(b-a);printf("x2=%lf ",x2);
f2=f(x2);printf("f2=%lf ",f2);
k=0;
loop:
{
if(f1<f2)
{
b=x2;printf("b=%lf ",b);
x2=x1;printf("x2=%lf ",x2);
f2=f1;printf("f2=%lf ",f2);
x1=a+0.382*(b-a);printf("x1=%lf ",x1);
f1=f(x1);printf("f1=%lf ",f1);
}
else
{
a=x1;printf("a=%lf ",a);
x1=x2;printf("x1=%lf ",x1);
f1=f2;printf("f1=%lf ",f1);
x2=a+0.618*(b-a);printf("x2=%lf ",x2);
f2=f(x2);printf("f2=%lf ",f2);
}
k=k+1;
printf("k=%d\n",k);
}
if(fabs(b-a<c))
{
x=0.5*(b+a);printf("x=%lf ",x);
f=f(x);printf("f=%lf ",f);
}
else
{
goto loop;
}
getchar();
}
6 程序运行截图。

相关主题