基于VisualC的黄金分割法程序设计实验报告
新疆农业大学机械交通学院
实验报告
基于Visual C 的黄金分割法程序设计
一 、实验目的
1. 加深对机械优化设计方法的基本理论和算法步骤的理解;
2. 掌握最优化方法的基本概念、基本理论和基本方法,奠定最优化的理论基础;
3. 能够熟练编制和调试最优化方法的程序,奠定解决实际中的优化问题的基础;
二、实验设备和必备物品
安装有Microsoft Visual C++ 6.0的软件的计算机。
三、实验项目及要求
1、明确黄金分割法基本原理及适用范围;
2、以函数最小为目标,以为变量,变量,编写程序的流程图;
3、编制Visual C的黄金分割法的程序,并对所编制程序的结果进行校核。
四、实验内容
1、简述实验基本原理及适用范围;
在实际计算中,最常用的一维搜索试探方法是黄金分割法,又称作0.618法。金分割法德的基本思想是:在搜索区间内适当插入两点、,并计算其函数值。、将区间分成三段。应用函数的单谷性质,通过函数值大小的比较,删去其中一段,使搜索区间得以缩短。然后再在保留下来的区间上作同样的处置,如此迭代下去,使搜索区间无限缩小,从而得到极小点的数值近似解。
黄金分割法是建立在区间消去法原理基础上的试探方法,该方法适用于在区间上的任何单谷函数求极小值问题。要求函数具有“单谷”特性外不作其它要求,甚至可以不连续。因此,这种方法的适应面相当广。
此外,黄金分割法对插入点的要求:
(1)要求插入点、 的位置相对于区间两端点具有对称性,即
(1)
式中为待定常数。
(2)黄金分割法还要求在保留下来的区间内再插入一点所形成的区间新三段,与原来区间的三段具有相同的比例分布。即每次缩小所得的新区间长度与缩小前区间长度之比(即:区间收缩率)为定值。
2、程序流程图
二次函数的黄金分割法程序流程图如图1所示。
图1 程序流程图
3、基于Visual C的程序清单及运行结果
(1)程序清单
#include
#include
#define R 0.618
#define E 0.00001
void main()
{
float A,B,C,D,a,b;
float x1,x2,y1,y2;
double x,y;
printf("请输入次项系数 A\n");
scanf("%f",&A);
printf("请输入次项系数B\n");
scanf("%f",&B);printf("请输入C\n");
scanf("%f",&C);
printf("请输入\n");
scanf("%f",&D);
printf("请输入变量x的初始区间a\n");
scanf("%f",&a);
printf("请输入变量x的初始区间b\n");
scanf("%f",&b);
x1=(b-R*(b-a));
x2=(a+R*(b-a));
y1=A*x1*x1+B*x1+C;
y2=A*x2*x2+B*x2+C;
do
{
if(y1>y2)
{
a=x1;
x1=x2;
x2=(a+R*(b-a));
y1=A*x1*x1*x1+B*x1*x1+C*x1+D;
y2=A*x2*x2*x2+B*x2*x2+C*x2+D;
}
else
{
b=x2;
x2=x1;
x1=(b-R*(b-a));
y1=A*x1*x1*x1+B*x1*x1+C*x1+D;
y2=A*x2*x2*x2+B*x2*x2+C*x2+D;
}
}while(sqrt(((y2-y1)/y2)*((y2-y1)/y2))>E);
x=(0.5*(a+b));
y=(A*x*x*x+B*x*x+C*x+D);
printf("黄金分割法