机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3308|回复: 1

黄金分割法

[复制链接]
发表于 2010-12-21 12:12:21 | 显示全部楼层 |阅读模式
一维搜索法程序的编制、调试和结果分析(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)给出初始搜索区间 [ab] - 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
回复

使用道具 举报

发表于 2010-12-21 12:31:53 | 显示全部楼层
楼主“递归”用的好啊……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

小黑屋|手机版|Archiver|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2024-11-29 17:38 , Processed in 0.048921 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表