黄金分割法
太原理工大学机械学院机测系课程上机实验报告
课 程 名 称: 机械优化
班日 期 成绩评定 xxx 2012/6/6 级
姓实验室 机械馆图强机房 老师签名 xxx 名
实
验用黄金分割法程序解题 名
称
所DEV-C++ 5 用
软
件
实
验
目
实验目的: 的
及 1.掌握并能够建立最优化基本类型问题的数学模型。 内
2.掌握最优化方法的基本概念、基本理论和基本方法,奠定最优化的理论基础。 容
3.能够熟练编制和调试最优化方法的程序,奠定解决实际中的优化问题的基础
实验内容:
理解黄金分割法并编写相关程序求其最优解。
黄金分割法程序考核题: 实 2minF(x),x,10x,36 1)
验 432minF(x),x,5x,4x,6x,60 2)
原 2minF(x),(x,1)(x,2)3) (x>0)
理 实验原理: 步 一维搜索是解函数极小值的方法之一,其解法思想为沿某一已知方向求目标函数的极小 值点。一维搜索的解法很多,这里主要采用黄金分割法(0.618法)。该方法用不变的区间骤 缩短率0.618代替斐波那契法每次不同的缩短率,从而可以看成是斐波那契法的近似,实、 现起来比较容易,也易于人们所接受。
黄金分割法是用于一元函数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)
0)
次数 a b a(1) a(2) f1 f2 b-a
… … … … … 28, 1.99999614, 2.00000325, 1.99999886, 1.99999904, 0.00000000, 0.00000000, 0.00000711 29, 1.99999886, 2.00000325, 1.99999904, 2.00000157, 0.00000000, 0.00000000, 0.00000439 30, 1.99999886, 2.00000157, 1.99999989, 1.99999904, 0.00000000, 0.00000000, 0.00000271 31, 1.99999886, 1.99999904, 1.99999893, 1.99999989, 0.00000000, 0.00000000, 0.00000018 *********************
黄金分割法最优点及目标函数值为:
x( *)=[ 1.9999989], f( *)= 0.0000000
迭代精度: 0.000000180
算法程序实现
/*csssqj.cpp */
#include
#include
#include
#include
#include
#define N 1 /*优化设计维数*/
#define EPSIN 0.000001 /*迭代精度*/
#define H_QJ 1.0 /*初始区间搜索步长*/
FILE *fp;
char outname[50]="黄金分割法计算结果.txt"; /*计算结果输出文件*/
/*给出初始点坐标*/
void csd_x(double x0[])
{
int i;
for(i=0;if2)
{
a2=a3;
a3=0.0;
f1=f2;
f2=f3;
f3=f1;
h=-h;
}
do
{
a1=a2;
a2=a3;
f1=f2;
f2=f3;
a3=a2+h;
f3=xkadd(x,d,a3);
h=2*h;
}while(f30.0)
{
ab[0]=a1;
ab[1]=a3;
}
else
{
ab[0]=a3;
ab[1]=a1;
}
return;
}
/*黄金分割法*/
void goldcut(double x[],double d[],double h,double ebsin)
{
double a1,a2,f1,f2,a,b,ab[2];
int i,k=0;
fprintf(fp,"**********黄金分割法计算结果**********\n\n");
fprintf(fp,"缩短次数 a b a(1) a(2)");
fprintf(fp," f1 f2 b-a\n");
csssqj(x,d,h,ab);
a=ab[0];
b=ab[1];
a1=b-0.618*(b-a);
f1=xkadd(x,d,a1);
a2=a+0.618*(b-a);
f2=xkadd(x,d,a2);
fprintf(fp,"%3d,%15.8lf,%15.8lf,%15.8lf,%15.8lf,%15.8lf,%15.8lf,%15.8lf\n",
k,a,b,a1,a2,f1,f2,b-a);
do
{
if(f1>f2)
{
a=a1;
a1=a2;
f1=f2;
a2=a+0.618*(b-a);
f2=xkadd(x,d,a2);
}
else
{
b=a2;
a2=a1;
f2=f1;
a1=b-0.618*(b-a);
f1=xkadd(x,d,a1);
}
k++;
fprintf(fp,"%3d,%15.8lf,%15.8lf,%15.8lf,%15.8lf,%15.8lf,%15.8lf,%15.8lf\n",
k,a,b,a1,a2,f1,f2,b-a);
}while(b-a>ebsin);
for(i=0;i