优化设计黄金分割法实验报告
优化算法数值实验报告(3篇)
第1篇一、实验目的本次实验旨在通过数值实验,验证不同优化算法在解决特定优化问题时的性能和效率。
实验选取了三种常用的优化算法:黄金分割法、复合形法和进化场优化算法(EFO),分别针对一个典型的无约束优化问题进行实验,并对比分析其性能。
二、实验内容1. 黄金分割法- 基本原理:黄金分割法是一种基于搜索区间分割的优化算法,通过不断缩小搜索区间,寻找最优解。
- 实验设计:选择一个无约束优化问题,设定初始搜索区间,通过迭代计算,逐步缩小搜索区间,直至满足终止条件。
2. 复合形法- 基本原理:复合形法是一种基于几何形状的优化算法,通过迭代构建一个复合形,逐渐逼近最优解。
- 实验设计:选择与黄金分割法相同的优化问题,设定初始复合形,通过迭代调整复合形顶点,直至满足终止条件。
3. 进化场优化算法(EFO)- 基本原理:EFO是一种基于种群的元启发式优化算法,通过模拟自然进化过程,寻找最优解。
- 实验设计:选择与黄金分割法和复合形法相同的优化问题,设定初始种群,通过迭代计算,不断进化种群,直至满足终止条件。
三、实验步骤1. 选择优化问题- 实验选取了如下无约束优化问题:\[ f(x) = \sum_{i=1}^{n} x_i^2, \quad x \in [-5, 5]^n \]- 目标:求解函数 \( f(x) \) 的最小值。
2. 算法实现- 黄金分割法:编写程序实现黄金分割法的基本原理,设置初始搜索区间和终止条件。
- 复合形法:编写程序实现复合形法的基本原理,设置初始复合形和终止条件。
- EFO:编写程序实现EFO算法的基本原理,设置初始种群和终止条件。
3. 实验参数设置- 黄金分割法:设置迭代次数为100,初始搜索区间为 \([-5, 5]\)。
- 复合形法:设置迭代次数为100,初始复合形顶点为随机选取。
- EFO:设置迭代次数为100,初始种群规模为10。
4. 实验结果分析- 对比三种算法的迭代次数、最优解值和收敛速度。
机械优化设计实验报告
一、实验目的本次实验旨在通过计算机编程,加深对机械优化设计方法的理解,掌握常用的优化算法,并能够利用计算机解决实际问题。
二、实验内容1. 黄金分割法(1)实验原理黄金分割法是一种常用的优化算法,适用于一元函数的极值求解。
其基本原理是:在给定初始区间内,通过迭代计算,逐步缩小搜索区间,直到满足收敛条件。
(2)实验步骤① 设计实验程序,实现黄金分割法的基本算法。
② 编写函数,用于计算一元函数的值。
③ 设置初始区间和收敛精度。
④ 迭代计算,更新搜索区间。
⑤ 判断是否满足收敛条件,若满足则输出结果,否则继续迭代。
(3)实验结果通过编程实现黄金分割法,求解函数f(x) = x^3 - 6x^2 + 9x + 1在区间[0, 10]内的极小值。
实验结果显示,该函数在区间[0, 10]内的极小值为1,且收敛精度达到0.001。
2. 牛顿法(1)实验原理牛顿法是一种求解非线性方程组的优化算法,其基本原理是:利用函数的导数信息,逐步逼近函数的极值点。
(2)实验步骤① 设计实验程序,实现牛顿法的基本算法。
② 编写函数,用于计算一元函数及其导数。
③ 设置初始值和收敛精度。
④ 迭代计算,更新函数的近似值。
⑤ 判断是否满足收敛条件,若满足则输出结果,否则继续迭代。
(3)实验结果通过编程实现牛顿法,求解函数f(x) = x^3 - 6x^2 + 9x + 1在区间[0, 10]内的极小值。
实验结果显示,该函数在区间[0, 10]内的极小值为1,且收敛精度达到0.001。
3. 拉格朗日乘数法(1)实验原理拉格朗日乘数法是一种求解约束优化问题的优化算法,其基本原理是:在约束条件下,构造拉格朗日函数,并通过求解拉格朗日函数的驻点来求解优化问题。
(2)实验步骤① 设计实验程序,实现拉格朗日乘数法的基本算法。
② 编写函数,用于计算目标函数、约束函数及其导数。
③ 设置初始值和收敛精度。
④ 迭代计算,更新拉格朗日乘数和约束变量的近似值。
南邮运筹与优化实验报告
实验报告实验名称运筹与优化上机实验课程名称运筹与优化班级学号姓名开课时间 2011/2012学年,第二学期实验一:黄金分割法一、实验目的1.掌握并运用黄金分割法2.能在计算机上完成算法的实现,并解决最优化问题二、实验题目用黄金分割法求1xxf的最小值,初始区间[a,b]=[-1,1],精度=x)2-(min2-.0e≤16三、实验过程#include "math.h"#include "stdio.h"#define f(x) 2*x*x-x-1double hj(double *a,double *b,double e,int *n){ double x1,x2,s;if(fabs(*b-*a)<=e)s=f((*b+*a)/2);else{ x1=*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); // 输入区间[a,b]和精度e的值s=hj(&a,&b,e,&n); //调用hj函数,其中n代表迭代次数printf("a=%lf,b=%lf,s=%lf,n=%d\n",a,b,s,n);}四、实验结果相应输入a、b、e的值-1、1、0.16,得出结果:区间为【0.167232,0.278651】一共迭代6次实验二:共轭梯度法一、 实验目的1、掌握并运用共轭梯度法2、能在计算机上完成算法的实现,并解决最优化问题二、 实验题目用共轭梯度法求解:(1)2122212142min x x x x x x -++-三、 实验过程function [ x,g ] = Untitled1( Q,b,x,c,m) a=0; f=Q*x+b;s=sqrt(f(1)^2+f(2)^2); while s>m, d=-f+a*d;t=-f'*d/(d'*Q*d); x=x+t*d; f=Q*x+b;a=f'*Q*d/(d'*Q*d); s=sqrt(f(1)^2+f(2)^2); endg=0.5*x'*Q*x+b'*x+c; Q=[2,-1;-1,2]; b=[2;-4]; x=[0;0]; c=0; m=0.001;[X,U]=getd(Q,b,x,c,m)四、实验结果利用Matlab作出上述结果,最优解为x=(0,2)T实验三:内外惩罚函数一、实验目的通过内外点法的学习让我们掌握利用罚函数解决线性规划为解决相应问题的一种思路与策略。
黄金分割法机械优化设计
黄金分割法机械优化设计机械优化设计黄金分割法班级:学硕一班学号:_姓名:______黄金分割法黄金分割法也成为0.618法,是一种应用广泛的一维搜索方法。
该方法对函数张)无特殊要求,函数甚至可以是不连续的。
黄金分割法是利用序列消去原理,通过不断缩小单峰区间长度,使搜索区间不断缩小,从而不断逼近目标函数极小点的一种优化方法o在搜索区间[a,b]内必须按下述规则对称地取勺和冬两点,使%= —“),a2=a + A(b-a)f这两点把区间分为三段,计算插入点的函数值,如图1-1所示。
根据单峰函数的性质,通过比较函数值大小,删去其中一段,使搜索区间缩小。
在新的区间继续上面的过程,使搜索区间不断缩小,当搜索区间无限缩小时,便可得到函数在极小点附近的近似解。
在第一次缩小区间后,新区间只需要再插入一点即可形成区间新三段。
按比例&缩小,新区间三段与原区间三段具有相同的比例分布,每次缩小所得新区间长度与原区间长度之比成为区间收缩率-设初始区间长度为L,为了保证区间收缩率不变,第一次收缩后的长度为弘,第二次收缩后的长度为厶(1 _兄), 而第二次的收缩率应该相等。
AL/L = (1 一A)/AL ->22 =(1-2)解次方程并舍去负根,就可得到2 = 75-1/2 = 0.618 o所以,⑷和色两点的取法为:a} = b-0.618(Z?-a)9 a2 = “+ 0.618(〃一a) o所以,对于黄金分割法,适用于设计变量少的优化问题中的一维搜索。
二、黄金分割法的搜索过程1)给出初始搜索区间及收敛精度,将別a〕=b-0・618(b-a), = f(a) y a = 6/+ 0.618(Z?-«), f = /(cr);并计0.6182 )按坐标点计算公式计算a〕=b-0・618(b-a), = f(a) y a = 6/+ 0.618(Z?-«), f = /(cr);并计算其对应的函数值。
优化设计黄金分割法实验报告
机械优化设计黄金分割法实验报告1、黄金分割法基本思路:黄金分割法适用于[a,b]区间上的任何单股函数求极小值问题,对函数除要求“单谷”外不做其他要求,甚至可以不连续。
因此,这种方法的适应面非常广。
黄金分割法也是建立在区间消去法原理基础上的试探方法,即在搜索区间[a,b]内适当插入两点al,a2,并计算其函数值。
al,a2将区间分成三段,应用函数的单谷性质,通过函数值大小的比较,删去其中一段,是搜索区间得以缩小。
然后再在保留下来的区间上作同样的处理,如此迭代下去,是搜索区间无限缩小,从而得到极小点的数值近似解。
2黄金分割法的基本原理一维搜索是解函数极小值的方法之一,其解法思想为沿某一已知方向求目标函数的极小值点。
一维搜索的解法很多,这里主要采用黄金分割法(0.618法)。
该方法用不变的区间缩短率0.618代替斐波那契法每次不同的缩短率,从而可以看成是斐波那契法的近似,实现起来比较容易,也易于人们所接受。
rl=a+O382(Js-a)r2=a+0,618(b-a)如图fi(r2)>f(rl)所以新区间为[迈以为新区间,继续求新的试点黄金分割法是用于一元函数f(x)在给定初始区间[a,b]内搜索极小点**的一种方法。
它是优化计算中的经典算法,以算法简单、收敛速度均匀、效果较好而著称,是许多优化算法的基础,但它只适用于一维区间上的凸函数⑹,即只在单峰区间内才能进行一维寻优,其收敛效率较低。
其基本原理是:依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩小搜索区间[7]。
具体步骤是:在区间[a,b]内取点:al,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|都大于收敛精度e重新开始。
因为[a,b]为单峰区间,这样每次可将搜索区间缩小0.618倍或0.382倍,处理后的区间都将包含极小点的区间缩小,然后在保留下来的区间上作同样的处理,如此迭代下去,将使搜索区[a,b]逐步缩小,直到满足预先给定的精度时,即获得一维优化问题的近似最优解。
matlab实验黄金分割法
实验报告实验名称:黄金分割法院(系):机电学院专业班级:机械制造及其自动化姓名:学号:2013年5 月13 日实验一:黄金分割法实验日期:2013年5 月13 日一、实验目的了解MATLAB的基本运用了解MATLB在优化中的使用二、实验原理黄金分割法是用于一元函数f(x)在给定初始区间[a,b]内搜索极小点α*的一种方法。
其基本原理是:依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩小搜索区间。
三、实验内容黄金分割法程序:function [xmin,fmin]=hjfg (f,a0,b0,epsilon)a=a0; %初始化b=b0;x1=b-0.618*(b-a);f1=f(x1);x2=a+0.618*(b-a);f2=f(x2);while abs(b-a)>=epsilon %迭代求解if f1<f2 %判断缩小方向b=x2;x2=x1;f2=f1; %缩小区间x1=b-0.618*(b-a);f1=f(x1);elsea=x1;x1=x2;f1=f2;x2=a+0.618*(b-a);f2=f(x2);endx=0.5*(a+b);endxmin=0.5*(a+b);%输出fmin=f(xmin);end函数程序:function [zhi]= fx2(x) %2²âÊÔº¯Êýzhi=2*x^2-3*x+1;end调用执行程序:[xmin2,fmin2]=hjfg (@fx2,-1,2,0.1) %2»Æ½ð·Ö¸î¼ÆËãÃüÁî执行结果:xmin2 =0.7583fmin2 =-0.1249四、实验小结通过本实验了解了了matlab的基本操作方法,了解黄金分割法法的原理与基本运用。
最优化课程设计--黄金分割法及其算法实现(3
最优化课程设计--黄⾦分割法及其算法实现(3机械优化设计报告姓名:刘洋学号:S12080203054院系:机械⼯程学院专业:机械设计及理论2012年 12⽉ 4⽇摘要最优化理论和⽅法⽇益受到重视,已经渗透到⽣产、管理、商业、军事、决策等各个领域,⽽最优化模型与⽅法⼴泛应⽤于⼯业、农业、交通运输、商业、国防、建筑、同学、政府机关等各个部门及各个领域。
伴随着计算机技术的⾼速发展,最优化理论与⽅法的迅速进步为解决实际最优化问题的软件也在飞速发展。
其中,MATLAB软件已经成为最优化领域应⽤最⼴的软件之⼀。
有了MATLAB 这个强⼤的计算平台,既可以利⽤MATLAB优化⼯具箱(OptimizationToolbox)中的函数,⼜可以通过算法变成实现相应的最优化计算。
关键词:优化、黄⾦分割法、最速下降法、MATLAB、算法AbstractOptimization theory and methods and more attention, have penetrated into the production, management, business, military, decision-making and other fields, and optimization models and methods widely used in industry, agriculture, transportation, commerce, defense, construction, students, government various departments and agencies and other fields. With the rapid development of computer technology,optimization theory and methods for the rapid progress of the optimization problem to solve practical software is also developing rapidly. Which, MATLAB software has become the most optimization software is one of the most widely used. With this powerful computing platform MATLAB, either using MATLAB optimization toolbox (OptimizationToolbox) in the function, but also can achieve the appropriate algorithm to optimize into the calculation.Key words: Optimization、Golden section method、steepest descent method、MATLAB、algorithm⽬录摘要 (2)第⼀章绪论 (5)第⼆章黄⾦分割法的基本思想与原理 (6)2.1 黄⾦分割法的基本思路 (6)2.2 算法流程图 (7)2.3 ⽤matlab编写源程序 (7)2.4 黄⾦分割法应⽤举例 (8)第三章最速下降法的基本思想与原理 (9)3.1 最速下降法的基本思路 (9)3.2 算法流程图 (11)3.3 ⽤matlab编写源程序 (11)3.4 最速下降法应⽤举例 (13)第四章惩罚函数法的基本思想与原理 (13)4.1 惩罚函数法的基本思路 (13)4.2 算法流程图 (14)4.3 ⽤matlab编写源程序 (14)4.4 最速下降法应⽤举例 (16)第五章总结 (17)参考⽂献 (18)第1章绪论在⼈类活动中,要办好⼀件事(指规划、设计等),都期望得到最满意、最好的结果或效果。
黄金分割法实验报告
黄金分割法实验报告一、实验目的1.加深对机械优化设计方法的基本理论和算法步骤的理解。
2.培养独立编制、调试计算机程序的能力。
3.掌握常用优化程序的使用方法。
4.培养灵活运用优化设计方法解决工程实际问题的能力。
二、实验要求1.明确黄金分割法基本原理及程序框图。
2.编制黄金分割法程序。
3.用考核题对所编制程序进行考核。
三.实验内容1.实验基本原理简述2、程序的流程图3.编制黄金分割法程序#include"stdio.h"#include"conio.h"#include"math.h"#define e 0.001#define tt 0.01float function(float x){float y=8*pow(x,3)-2*pow(x,2)-7*x+3; /*求解一维函数*/ return(y);}void finding(float a[3],float f[3]){float t=tt,a1=0.0,f1;int i=0,ia=0;a[0]=0; /* 初始区间的下界值*/f[0]=function(a[0]);for(i=0;;i++){a[1]=a[0]+t;f[1]=function(a[1]);if(f[1]<f[0]) break;if(fabs(f[1]-f[0])>=e){t=-t; a[0]=a[1]; f[0]=f[1];}else {if(ia==1) return;t=t/2; ia=1;} }for(i=0;;i++){a[2]=a[1]+t; f[2]=function(a[2]); if(f[2]>f[1]) break;t=2*t;a[0]=a[1]; f[0]=f[1];a[1]=a[2]; f[1]=f[2];}if(a[0]>a[2]){a[1]=a[0]; f1=f[1];a[0]=a[2]; f[0]=f[2];a[2]=a1; f[2]=f1;}return;}float gold(float *ff){float a1[3], f1[3],a[4],f[4];float aa;int i;finding(a1,f1);a[0]=a1[0]; f[0]=f1[0];a[3]=a1[2]; f[3]=f1[2];a[1]=a[0]+0.382*(a[3]-a[0]); a[2]=a[0]+0.618*(a[3]-a[0]); f[1]=function(a[1]);f[2]=function(a[2]);for( i=0;;i++){if(f[1]>=f[2]){a[0]=a[1]; f[0]=f[1];a[1]=a[2]; f[1]=f[2];a[2]=a[0]+0.618*(a[3]-a[0]); f[2]=function(a[2]);}else { a[3]=a[2]; f[3]=f[2];a[2]=a[1]; f[2]=f[1];a[1]=a[0]+0.382*(a[3]-a[0]); f[1]=function(a[1]);}if((a[3]-a[0])<e){ aa=(a[1]+a[2])/2; *ff=function(aa); break;}}return(aa);}void main(){float xx,ff;xx=gold(&ff);printf("\nThe Optimal Design Result Is:\n"); printf("\n\tx*=%f\n\tf*=%f",xx,ff);getch();}4.程序运行结果x*=0.629867f*=-0.203425。
黄金分割法试验报告
二,框图:
2
开始
给定 a, b, ε
λ ←0.618
a1←b-λ (b-α ) a2←b+λ (b-α )
y1←f(a1) y2←f(a2)
是 y1≧y2?
否
a←a1 a1←a2 y1←y2
b←a2 a2←a1 y2←y1
a2←a+λ (b-α ) y2←f(a2)
a1←b-λ (b-α ) y1←f(a1)
是
|
ba |<ε b
和|
y1 y 2 |<ε y2
否
a3←
1 (a+b) 2
3
结束
三,程序: #include<stdio.h> #include<math.h> #define E 1e-3 int main() { double a=-3.0,b=5.0,y=0.618; int N=0; double a1,a2,y1,y2,a3; a1=b-y*(b-a); a2=a+y*(b-a); y1=a1*a1+2*a1; y2=a2*a2+2*a2; while(1) { N++; printf("第%d 次迭代\t",N); if(y1>=y2) { a=a1; a1=a2; y1=y2; a2=a+y*(b-a); y2=a2*a2+2*a2; printf("a=%.3lf\t a1=.3lf%\t a2=%.3lf\t b=%.3lf\t y1=.3lf%\t y2=.3lf%\t\n",a,a1,a2,b,y1,y2); } else { b=a2; a2=a1; y2=y1; a1=b-y*(b-a); y1=a1*a1+2*a1; printf("a=%.3lf\t a1=%.3lf\t a2=%.3lf\t b=%.3lf\t y1=%.3lf\t y2=%.3lf\t\n",a,a1,a2,b,y1,y2); } if((fabs((b-a)/b)<E)&&(fabs((y2-y1)/y2)<E)) { a3=(a+b)/2; printf("迭代终止最后精确值 a3=%.3lf\t f(a3)=%.3lf\n",a3,a3*a3+2*a3); break; } else continue; } return 0; }
0.618法
《数值优化》实验报告实验[1] [0.618法]专业学号姓名日期1 实验目的练习matlab程序设计,用精确线搜索,求目标函数在给定区间的极小值问题2 实验内容利用程序求解极小值问题[ s ,phis, k, G, E]=golds(inline(‘s^2-sin(s)’),0,1,1e-4,1e-5)3 算法设计0.618法也称黄金分割法,其基本思想是通过试探点函数值得比较,使得包含极小值的区间不断缩小。
输入:phi是目标函数,a,b是搜素区间的两个端点Delta,epsilon 分别是自变量和函数值得容许误差输出:是,phis分别是近似极小点和极小值,G是n*4矩阵其第k行分别是a,p,q,b的第k次迭代值E=[ds,dphi]分别是s和phis的误差线4 程序代码function [s,phis,k,G,E]=golds(phi,a,b,delta,epsilon)t=(sqrt(5)-1)/2; h=b-a;phia=feval(phi,a); phib=feval(phi,b);p=a+(1-t)*h; q=a+t*h;phip=feval(phi,p); phiq=feval(phi,q);k=1; G(k,:)=[a, p, q, b];while(abs(phib-phia)>epsilon)|(h>delta)if(phip<phiq)b=q; phib=phiq; q=p; phiq=phip;h=b-a; p=a+(1-t)*h; phip=feval(phi,p);elsea=p; phia=phip; p=q; phip=phiq;h=b-a; q=a+t*h; phiq=feval(phi,q);endk=k+1; G(k,:)=[a, p, q, b];endds=abs(b-a); dphi=abs(phib-phia);if(phip<=phiq)s=p; phis=phip;elses=q; phis=phiq;endE=[ds,dphi];5 运行结果[ s ,phis, k, G, E]=golds(inline(‘s^2-sin(s)’),0,1,1e-4,1e-5)6 结果分析0.618法计算起来逻辑简单仅需要计算函数值,适用范围广,使用方便,但是任何事都是利弊共存的,0.618法计算效率不高,需要大量的计算,而且只是线性收敛。
机械优化实验报告
一、实验目的本次实验旨在加深对机械优化设计方法的基本理论和算法步骤的理解,培养学生独立编制、调试计算机程序的能力,并掌握常用优化方法程序的使用方法。
通过实验,学生能够灵活运用优化设计方法解决工程实际问题。
二、实验内容本次实验主要涉及以下内容:1. 优化方法的基本原理2. 编程实现优化方法3. 优化方法的实际应用三、实验步骤1. 黄金分割法(1)基本原理黄金分割法是一种在给定初始区间内搜索极小点的一维搜索方法。
其基本原理是:在区间内取两个点,根据函数值的比较,将区间分为三段,保留包含极小值的段,再进行相同的操作,逐步缩小搜索区间。
(2)编程实现根据黄金分割法的基本原理,编写相应的C语言程序,实现一维搜索。
```c#include <stdio.h>#include <math.h>double f(double x) {// 定义目标函数return x x - 4 x + 4;}double golden_section_search(double a, double b, double tol) {double r = 0.618;double a1 = a + r (b - a); double a2 = b - r (b - a); double fa1 = f(a1);double fa2 = f(a2);while (fabs(b - a) > tol) { if (fa1 > fa2) {a = a1;a1 = a2;a2 = b - r (b - a); fa1 = fa2;fa2 = f(a2);} else {b = a2;a2 = a1;a1 = a + r (b - a); fa2 = fa1;fa1 = f(a1);}}return (a + b) / 2;}int main() {double x_min = golden_section_search(a, b, tol);printf("Optimal solution: x = %f\n", x_min);return 0;}```(3)结果分析通过运行程序,可以得到最优解 x = 2.000000,目标函数值为 f(x) = 0。
实验二 黄金分割法实验指导书
实验二黄金分割法实验指导书一、实验目的:1、加深对黄金分割法的基本理论和算法步骤的理解。
2、培养学生独立编制、调试机械优化算法程序的能力。
3、培养学生灵活运用优化设计方法解决工程实际问题的能力。
二、主要设备及软件配置硬件:计算机(1台/人)软件:VC6.0(c++)三、算法程序框图及算法步骤图1-2 黄金分割法程序框图算法程序框图:如图1-2所示。
算法步骤:1)给出初始搜索区间[a,b]及收敛精度ε,将λ赋以0.618。
2)按坐标点计算公式计算a1,a2;并计算其对应的函数值y1,y2。
3)根据区间消去法原理缩短搜索区间。
为了能用原来的坐标点计算公式,需进行区间名称的代换,并在保留区间中计算一个新的试验点及其函数值。
如果y1≥y2,则新区间=[a1 b],a=a1,a1=a2,y1=y2,插入新点a2=a+λ*(b-a) ,y2=f(a2);如果y1<y2,则新区间=[a a2],b=a2,a2=a1,y2=y1插入新点a1=b-λ*(b-a) ,y1=f(a1);4)检查区间是否缩短到足够小和函数值收敛到足够精度,如果收敛条件满足,则取最后两试验点的平均值作为极小点的数值近似解。
如果条件不满足则转向步骤3)进行新的区间缩小。
四、实验内容与结果分析1、根据算法程序框图和算法步骤编写计算机程序;2、求解函数f(x)=x+20/x的极小点,初始搜索区间为[0.2,1], 收敛精度ε=0.01;3、如果初始搜索区间为[0.1,10],收敛精度ε=0.001,结果又如何?4、试分析初始搜索区间和收敛精度对搜索计算的影响。
附录:黄金分割法源程序#include <stdio.h>#include <conio.h>#include <math.h>#include <iostream.h>#define e 0.001#define tt 0.01float function(float x){// float y=xa*pow(x,3)-b*pow(x,2)-c*x+d; //求解的一维函数float y=1*pow(x,4)-5*pow(x,3)-4*pow(x,2)-6*x+60; //求解的一维函数return(y);}void finding(float a[3], float f[3]){float t=tt,a1,f1,ia;//初始区间的下界值a[0]=0;f[0]=function(a[0]);for (int i=0;;i++){a[1]=a[0]+t; f[1]=function(a[1]);if ((f[1]<f[0])) break;if ((fabs(f[1]-f[0])>=e)){t=-t;a[0]=a[1];f[0]=f[1];}else{if (ia==1) return;t=t/2;ia=1;}}for (i=0;;i++){a[2]=a[1]+t; f[2]=function(a[2]);if(f[2]>f[1]) break;t=2*t;a[0]=a[1];f[0]=f[1];a[1]=a[2];f[1]=f[2];}if (a[0]>a[2]){a1=a[0]; f1=f[0];a[0]=a[2]; f[0]=f[2];a[2]=a1; f[2]=f1;}return;}float gold(float *ff){float a1[3],f1[3],a[4],f[4];float aa;finding (a1,f1);a[0]=a1[0]; f[0]=f1[0];a[3]=a1[2]; f[3]=f1[2];a[1]=a[0]+0.382*(a[3]-a[0]); a[2]=a[0]+0.618*(a[3]-a[0]);f[1]=function(a[1]); f[2]=function(a[2]);for (int i=0;;i++){if (f[1]>=f[2]){a[0]=a[1]; f[0]=f[1];a[1]=a[2]; f[1]=f[2];a[2]=a[0]+0.618*(a[3]-a[0]); f[2]=function(a[2]);}else{a[3]=a[2]; f[3]=f[2];a[2]=a[1]; f[2]=f[1];a[1]=a[0]+0.382*(a[3]-a[0]); f[1]=function(a[1]);}if ((a[3]-a[0]<e)){aa=(a[1]+a[2])/2; *ff=function(aa);break;}}return(aa);}void main(){// TODO: Add extra validation herefloat xx,ff;xx=gold(&ff);cout<<"极值点X="<<xx<<endl;cout<<"极值y="<<ff<<endl;#include <stdio.h>#include <conio.h>#include <math.h>#include <iostream.h> #define e 0.001#define tt 0.01float function(float x){// float y=xa*pow(x,3)-b*pow(x,2)-c*x+d; //求解的一维函数 float y=(x+1)*1*pow(x-2,2); //求解的一维函数return(y);}void finding(float a[3], float f[3]){float t=tt,a1,f1,ia;//初始区间的下界值a[0]=0;f[0]=function(a[0]);for (int i=0;;i++){a[1]=a[0]+t; f[1]=function(a[1]);if ((f[1]<f[0])) break;if ((fabs(f[1]-f[0])>=e)){t=-t;a[0]=a[1];f[0]=f[1];}else{if (ia==1) return;t=t/2;ia=1;}}for (i=0;;i++){a[2]=a[1]+t; f[2]=function(a[2]);if(f[2]>f[1]) break;t=2*t;a[0]=a[1];f[0]=f[1];a[1]=a[2];f[1]=f[2];}if (a[0]>a[2]){a1=a[0]; f1=f[0];a[0]=a[2]; f[0]=f[2];a[2]=a1; f[2]=f1;}return;}float gold(float *ff){float a1[3],f1[3],a[4],f[4];float aa;finding (a1,f1);a[0]=a1[0]; f[0]=f1[0];a[3]=a1[2]; f[3]=f1[2];a[1]=a[0]+0.382*(a[3]-a[0]); a[2]=a[0]+0.618*(a[3]-a[0]); f[1]=function(a[1]); f[2]=function(a[2]);for (int i=0;;i++){if (f[1]>=f[2]){a[0]=a[1]; f[0]=f[1];a[1]=a[2]; f[1]=f[2];a[2]=a[0]+0.618*(a[3]-a[0]); f[2]=function(a[2]);}else{a[3]=a[2]; f[3]=f[2];a[2]=a[1]; f[2]=f[1];a[1]=a[0]+0.382*(a[3]-a[0]); f[1]=function(a[1]);}if ((a[3]-a[0]<e)){aa=(a[1]+a[2])/2; *ff=function(aa);break;}}return(aa);}void main(){// TODO: Add extra validation herefloat xx,ff;xx=gold(&ff);cout<<"极值点X="<<xx<<endl;cout<<"极值y="<<ff<<endl;}。
中北大学最优化实验报告
中北大学实验报告课程名:最优化方法任课教师:李卉专业:数学与应用数学学号:14080141姓名:2015/2016学年第2学期中北大学理学院《最优化方法》课程实验 第1次实验报告一、实验内容及基本要求实验项目名称:黄金分割法程序设计实验类型:设计型每组人数:1实验内容及要求:内容:能够应用MATLAB 或C++设计黄金分割法的程序,并用实例进行验证要求:能够独立完成程序的设计及验证二、实验题目利用黄金分割法求函数()232tan x x x φ=-在[]0,1上的极小点。
取容许误差410ε-=,510δ-=三、实验步骤及结果1)、建立y 函数M 文件(fun_gs.m )function y= fun_gs(x)y=3*x^2-2*tan(x);end2)、建立求解极小值点的M 文件(Untitled5.m )function gs(x)a=0;b=1;eps=0.0001;i=100;a1=b-0.618*(b-a);a2=a+0.618*(b-a);y1=fun_gs(a1);y2=fun_gs(a2);for k=1:i;if (abs(b-a)<=eps)y=fun_gs((b+a)/2);break;elseif (y1<=y2)y2=fun_gs(a1);b=a2;a2=a1;a1=b-0.618*(b-a);y1=fun_gs(a1);elsey1=fun_gs(a2);a=a1;a1=a2;a2=a+0.618*(b-a);y2=fun_gs(a2);endi=i+1;endendia0=(b+a)/2y=fun_gs((b+a)/2)end实验结果:根据实验结果可知:迭代次数i =120 ,极小值点a0 =0.3895 ,在极小点处的函数值为y =-0.3658.《最优化方法》课程实验 第2次实验报告一、实验内容及基本要求实验项目名称:牛顿法程序设计实验类型:设计型每组人数:1实验内容及要求:内容:能够应用MATLAB 或C++设计牛顿法的程序,并用实例进行验证要求:能够独立完成程序的设计及验证二、实验题目利用牛顿法程序求解()()()2222121min 431x R f x x x x ∈=-+-该问题有精确解()()1,1,0T x f x **==。
最优化方法(黄金分割和进退法)实验报告
一维搜索方法的MATLAB 实现__ __信息与计算科学__ 实验时间: 2014/6/21一、实验目的:通过上机利用Matlab 数学软件进行一维搜索,并学会对具体问题进行分析。
并且熟悉Matlab 软件的实用方法,并且做到学习与使用并存,增加学习的实际动手性,不再让学习局限于书本和纸上,而是利用计算机学习来增加我们的学习兴趣。
二、实验背景: 黄金分割法它是一种基于区间收缩的极小点搜索算法,当用进退法确定搜索区间后,我们只知道极小点包含于搜索区间内,但是具体哪个点,无法得知。
1、算法原理黄金分割法的思想很直接,既然极小点包含于搜索区间内,则可以不断的缩小搜索区间,就可以使搜索区间的端点逼近到极小点。
2、算法步骤用黄金分割法求无约束问题min (),f x x R ∈的基本步骤如下:〔1〕选定初始区间11[,]a b 与精度0ε>,计算试探点:11110.382*()a b a λ=+-11110.618*()a b a μ=+-。
〔2〕若k k b a ε-<,则停止计算。
否则当()()k k f f λμ>时转步骤〔3〕。
当()()k k f f λμ≤转步骤〔4〕。
〔3〕11111110.382*()k k k k k kk k k k a b b a b a λλμμ+++++++=⎧⎪=⎪⎨=⎪⎪=+-⎩转步骤〔5〕〔4〕转步骤〔5〕(5)令1k k =+,转步骤〔2〕。
算法的MATLAB 实现function xmin=golden(f,a,b,e)k=0;x1=a+0.382*(b-a);x2=a+0.618*(b-a);while b-a>ef1=subs(f,x1);f2=subs(f,x2);if f1>f2a=x1;x1=x2;f1=f2;x2=a+0.618*(b-a);elseb=x2;x2=x1;f2=f1;x1=a+0.382*(b-a);endk=k+1;endxmin=(a+b)/2;fmin=subs(f,xmin)fprintf('k=\n');disp(k);3、实验结果(总结/方案)黄金分割法求解极值实例。
机械优化设计黄金分割法实验报告
实验报告课程名称:机械优化设计实验项目:一维搜索(黄金分割)法上机实验专业班级: XXXXX级机械工程及自动化XX班学号: XXXXXXXXXX 姓名: XXXXXX 指导老师: XXXXXX 日期: 201X.12.12机械工程试验教学中心实验1 一维搜索(黄金分割)法实验报告实验日期 201X 年 12 月 11 日报告日期 201X 年 12 月 12 日班级 XXXXX级机自XXXX班姓名 XXXXXX 学号 XXXXXXXXXXXXXXX1、实验目的○1了解黄金分割法的基本原理;○2熟悉matlab程序使用方法;○3学习上机调试、运行所编写的程序。
2、黄金分割法原理该法适用于[a,b]区间上单谷函数极小值问题。
在搜索区间[a,b]内按照0.618比例加入两点α1,α2,并计算其函数值。
α1,α2将区间分成三段,然后利用区间消去法,通过比较函数值大小,删除其中一段,使搜索区间缩短,在保留区间进行同样处理,直到搜索区间缩小到指定精度为止。
3、编制MATLAB优化程序○1编写函数文件,并命名为fx.m保存,程序代码如下:function f=fx(w)%f=w^2-10*w+36;%f=w^4-5*w^3+4*w^2-6*w+60;%f=((w+1)^4)*((w-2)^2);注:上述“%”后面分别为要求解的三个方程,求解该方程式把相应方程式前面的“%”删除,点击保存,并运行下面的hjf.m文件,输入相应的初始步长h0、初始点x0、收敛法则epsilan的值○2编写进退法程序文件,命名为ab1.m保存,程序代码如下:function [a,b]=ab1(h0,x0)h=h0;x1=x0;f1=fx(x1);x2=x1+h;f2=fx(x2);if f2>f1h=-h;x3=x1;f3=f1;x1=x2;f1=f2;x2=x3;f2=f3;endx3=x2+h;f3=fx(x3);while f2>=f3x1=x2;f1=f2;x2=x3;f2=f3;x3=x2+2*h;f3=fx(x3);endif h<0a=x3;b=x1;elsea=x1;b=x3;end○3编写黄金分割法程序文件,命名为hjfgf.m 保存,程序代码如下: function hjfclearh1 = input('h0=?');x1=input('x0=?');epsilan=input('epsilan=?');[a,b]=ab1(h1,x1);x1=a+0.382*(b-a);f1=fx(x1);x2=a+0.618*(b-a);f2=fx(x2);while abs(b-a)>epsilanif f1>f2a=x1;x1=x2;f1=f2;x2=a+0.618*(b-a);f2=fx(x2);elseb=x2;x2=x1;f2=f1;x1=a+0.382*(b-a);f1=fx(x1);endendxm=(a+b)/2;['Optimal result:',blanks(3),'xm=[',...num2str(xm),']',blanks(6),'fm=',num2str(fx(xm))]4、实验结果()3610min )12+-=t t t f结果: *t = 5.0001 =*f 11 (h0=0.3、x0=0、epsilan=0.001)()60645min )2234+-+-=t t t t t f结果: *t = 3.2795 =*f 22.659 (h0=0.3、x0=0、epsilan=0.001)()()()2421min )3-+=t t t f 结果: *t =__-0.99989__ =*f __1.4253e-015__ (h0=0.3、x0=0、epsilan=0.001)。
黄金分割法实验报告
实验一黄金分割法一、实验目的 1、加深对黄金分割法及其算法框图与步骤的理解。
2、培养学生独立编制、调试黄金分割法C语言程序的能力。
3、掌握常用优化方法程序的使用方法。
4、培养学生灵活运用优化设计方法解决实际工程问题的能力。
二、实验内容 1、编制调试黄金分割法C语言程序。
2、利用调试好的C语言程序进行实例计算。
3、根据实验结果写实验报告。
三、实验步骤 1、编制调制程序。
2、计算实例。
四、算法及框图 计算实例:被搜索函F(x)=x4-4x3-6x2-16x+4 步骤一:??matlab??⒉⒌?F(x)??兎?ㄅ?⒉?枽??ⅴ??洛?ㄞ?扟嫛兢????? 步骤二:???????侱?梃[x1,x2]; 步骤三:??煓摠⒕━??⒉??屲*p ①外推法部分的程序框图 ②黄金分割法部分的程序框图 ③外推法与黄金分割法合起来后的总程序 #include <stdio.h>#include <math.h>#define e 0.00001 /*设定黄金分割的精度值为为e=0.00001*/#define tt 0.00000001 /*设置外推法的最初步长为h=0.00000001*/float f(double x) /*定义被搜索函数f(x)*/{float y=pow(x,4)-4*pow(x,3)-6*pow(x,2)-16*x+4;return(y); /*返回函数计算值f(x)*/}finding(float *p1,float*p2) /*使用指针方式定义确定搜索区间的外推法函数finding( ) */{float x1=0,x2,x3,t,f1,f2,f3,h=tt;int n=0;x2=x1+h;f1=f(x1);f2=f(x2);if(f2>f1) {h=-h;t=x2;x2=x1;x1=t;} /*若f2>f1,则反向搜索*/x3=x2+h;while(f(x3)<f(x2)){ h=2*h;x1=x2;f1=f(x2);x2=x3;f2=f(x3);x3=x2+h;n=n+1;}if(x1>x3){t=x1;x1=x3;x3=t;}*p1=x1;*p2=x3; /*利用指针*p1、*p2向主函数返回搜索区间的始点a、终点b的值,即a=*p1=x1,b=*p2=x2 */return(n); /*向主函数返回使用外推法时的循环次数n */}gold(float *p) /*使用指针方式定义确定最小值点的黄金分割函数gold( ) */{float a,b,x1,x2,f1,f2;int n=0;finding(&a,&b); /*利用指针的方式,通过函数finding( )确定确定搜索区间的始点a、终点b 的值*/do{x1=a+0.382*(b-a);x2=a+0.618*(b-a);f1=f(x1);f2=f(x2);n=n+1;if(f1>f2) a=x1;else b=x2;}while((b-a)>e); /*通过黄金分割的方法缩小最优点所在的区间直到满足精度要求e为止*/*p=(a+b)/2; /*取最小区间的中点作为极小值点的数值*p */return(n); /*返回使用黄金分割法时迭代的次数n */}void main() /*主函数部分*/{float a,b,x,min;int n1,n2;n1=finding(&a,&b); /*利用指针方式,通过调用确定搜索区间的外推法函数finding( ),确定搜索区间的始点a、终点b的值,并确定使用外推法时的循环次数n1*/n2=gold(&x); /*利用指针方式,通过调用黄金分割函数gold( ),确定极小值点的数值x,并确定使用黄金分割法时迭代的次数n2*/min=f(x); /*通过调用被搜索函数f(),计算最小点的函数值min */printf("\n 被搜索函数是F(x)=x^4-4x^3-6x^2-16x+4,精度为e=0.00001");printf("\n 利用外推法确定的搜索区间是: [%f, %f]",a,b);printf("\n 用外推法确定搜索区间时的循环次数是: n1=%d 次",n1);printf("\n 在搜索区间内使用黄金分割法的迭代次数是: n2=%d 次",n2);printf("\n 产生极小值点是在: x=%f 处,并且极小值是: F(%f)=%f",x,x,min);printf("\n");} 程序运行结果: 五、实验结果分析: 从上面的程序运行结果和利用Matlab解出的结果相比较,利用外推法和黄金分割法求函数的最优解可以达到很高的精度值,和精确解的误差相差很小,并且这种方法对函数除要求“单谷”外不做其他要求,而且函数可以不连续,因此,该方法的适应面相当广。
基于Visual C 的黄金分割法程序设计实验报告
新疆农业大学机械交通学院实验报告基于Visual C 的黄金分割法程序设计一 、实验目的1. 加深对机械优化设计方法的基本理论和算法步骤的理解;2. 掌握最优化方法的基本概念、基本理论和基本方法,奠定最优化的理论基础;3. 能够熟练编制和调试最优化方法的程序,奠定解决实际中的优化问题的基础;二、实验设备和必备物品安装有Microsoft Visual C++ 6.0的软件的计算机。
三、实验项目及要求1、明确黄金分割法基本原理及适用范围;2、以12)(23-++=x x x x f 函数最小为目标,以x 为变量,变量)2,2(-∈x ,编写程序的流程图;3、编制Visual C 的黄金分割法的程序,并对所编制程序的结果进行校核。
四、实验内容1、简述实验基本原理及适用范围;在实际计算中,最常用的一维搜索试探方法是黄金分割法,又称作0.618法。
金分割法德的基本思想是:在搜索区间[]b a ,内适当插入两点1α、2α,并计算其函数值。
1α、2α将区间分成三段。
应用函数的单谷性质,通过函数值大小的比较,删去其中一段,使搜索区间得以缩短。
然后再在保留下来的区间上作同样的处置,如此迭代下去,使搜索区间无限缩小,从而得到极小点的数值近似解。
黄金分割法是建立在区间消去法原理基础上的试探方法,该方法适用于在[]b a ,区间上的任何单谷函数求极小值问题。
要求函数具有“单谷”特性外不作其它要求,甚至可以不连续。
因此,这种方法的适应面相当广。
此外,黄金分割法对插入点的要求:(1)要求插入点1α、2α 的位置相对于区间[]b a ,两端点具有对称性,即)()(21a b a a b b -+=--=λαλα (1)式中λ为待定常数。
(2)黄金分割法还要求在保留下来的区间内再插入一点所形成的区间新三段,与原来区间的三段具有相同的比例分布。
即每次缩小所得的新区间长度与缩小前区间长度之比(即:区间收缩率)为定值。
2、程序流程图二次函数的黄金分割法程序流程图如图1所示。
最优化理论与方法上机报告
最优化理论与方法上机报告班级:姓名:学号:1.黄金分割法黄金分割法又称0.618 法,其基本思想是试探点函数值的比较,使包含极小点的搜索区间不断缩小.该方法仅需计算函数值,适用范围广,使用方便.由于该方法思想简单,在此不给出具体算法流程,仅介绍思想和matlab实现的程序. 1.1 思想在搜索区间[a, b] 内插入点x1 , x2 ,其中,把[a, b] 区间分为了三段,比较 f ( x1 )与f ( x2 ) 的大小,f ( x1 ) >f ( x2 ) , 则x* Є[ x1 , b], 去掉[a, x1 ]; 若f ( x1 )≤ f (x2) , 则x* ?Є[a, x2 ], 去掉[ x2 , b] ,然后在余下的区间上根据对称原则再计算一个对称点的函数值,再重复上述操作,直到满足精度.1.2 实现及结果采用matlab 2011a 实现,命名为golden,具体程序见附录golden.m 文件. 下面给出程序运行结果,其中目标函数为: f ( x) =x1^2 - x1 + 6 ,精度采用默认:10^-6由f ( x) =x1^2 - x1 + 6,求导得f '(x)=2x1-1,易知x1=0.5为其极小点,可见程序正确。
2.牛顿法牛顿法也是一种经典的无约束优化方法,并且其收敛速度快,具有自适应的特点,至今仍受到人们的青睐.2.1 思想牛顿法的基本思想是用迭代点Xk 处的一阶导数(梯度)和二阶导数(Hesse 阵)对目标函数进行二次函数近似,然后把二次模型的极小点作为新的迭代点,并不断重复这一过程,直至达到精度.2.2 算法牛顿法的算法如下:Step1 取初始点x0 Є R n , 容许误差0<θ<1,令k:=0;Step2 计算gk =▽f ( xk ) .Step3 若||gk||≤θ,则停止迭代,取x* =xk ,否则,转下一步.Step4 计算H k =▽^2 f ( xk ), 并由Hk d =-gk , 求得dk =-Hk gk .Step5 令xk +1=xk +αdk , k :=k+1 , 转Step2.2.3 实现及结果采用matlab 2011a 实现,具体程序见附录Newton.m 文件. 下面以上机题第一题为例介绍具体使用方法: 上机题1的优化目标函数为, 仍然使用最速下降法中建立的func.m文件,在命令窗口中输入(加粗部分):X0=[1 2 3 4]’;Newton(@func,X0);即可按默认的精度10^-6 计算,若想改变精度,如10^-3 则输入:Newton(@func,X0,0.001);对应的结果分别如下图的(a)、(b)所示:牛顿法收敛速度快,正如上图(a)所示,达到10^-6 精度只需18 步,而最速下降法却需要366304 步,两者的收敛速度由此可见一斑,可谓有天壤之别!2.4 体会由于牛顿法收敛速度快,且人工求目标函数的梯度、Hesse 矩阵,有时较为繁杂,故算法实现时,实现了自动求梯度和Hesse 矩阵,这样便在程序的易用性和时间复杂度两者间得到了很好的折中.3.外点法外点法适合求解如下约束优化问题:但本次实验仅需求解如下约束优化问题:而且,等式约束也可以转化为不等式约束!记可行域为 D = {x Є R n | gi ( x) ≥0(i Є I )}.3.1 思想方法构造罚函数和增广目标函数其中M>0为惩罚因子,不难发现当xЄD 时,即x 为可行点时,T ( x, M ) =f ( x), 此时目标函数没有受到惩罚;当x D 时,T ( x, M ) >f ( x), 目标函数受到惩罚,M越大,受到的惩罚越重,当M 足够大时,要使f ( x) 取得极小,罚函数P( x) 应充分小,从而T ( x, M ) 的极小点充分逼近可行域D,这样求解一般约束优化问题就化为求解一系列无约束的优化问题min T ( x, M ) .3.2 算法外点法的算法如下:Step1 取初始点x0 ЄR n , 容许误差0<θ<1,惩罚因子M 1 >0 , r>1, 令k:=1.Step2 以Xk-1 为初始点求解子问题,设其极小点n 为xk .Step3 若Ǝj (1 ≤j ≤m), 使-g j ( xk ) >Є , 则令M k+1= rM k , k =k +1, 转Step2,否则停止迭代,取x* =xk .3.3 实现及结果采用matlab 2011a 实现,无约束优化采用牛顿法,即直接调用第一篇中的Newton函数,具体程序见附录EPM.m 文件. 程序中的Min=Newton(@augf,Xk,epsilon);是无约束优化函数的调用,参数augf为增广目标函数文件名,augf.m中还涉及到(调用)了两个函数:func.m和constrains.m,前者为目标函数文件,与前面的func.m一样,只是目标函数不同而已,后者为约束函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机械优化设计黄金分割法实验报告
1、黄金分割法基本思路:
黄金分割法适用于[a,b]区间上的任何单股函数求极小值问题,对函数除要求“单谷”外不做其他要求,甚至可以不连续。
因此,这种方法的适应面非常广。
黄金分割法也是建立在区间消去法原理基础上的试探方法,即在搜索区间[a,b]内适当插入两点a1,a2,并计算其函数值。
a1,a2将区间分成三段,应用函数的单谷性质,通过函数值大小的比较,删去其中一段,是搜索区间得以缩小。
然后再在保留下来的区间上作同样的处理,如此迭代下去,是搜索区间无限缩小,从而得到极小点的数值近似解。
2 黄金分割法的基本原理
一维搜索是解函数极小值的方法之一,其解法思想为沿某一已知方向求目标函数的极小值点。
一维搜索的解法很多,这里主要采用黄金分割法(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)<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]逐步缩小,直到满足预先给定的精度时,即获得一维优化问题的近似最优解。
黄金分割法原理如图1所示,
3 程序流程如下:
4 实验所编程序框图
开始
#include 《math.h》
#include 《stdio.h》
#define f(x) x*x+2*x
double calc(double *a,double *b,double e,int *n) { double x1,x2,s;
if(fabs(*b-*a)<=e)
s=f((*b+*a)/2);
else
{ x1=*b-0.618*(*b-*a);
x2=*a+0.618*(*b-*a);
if(f(x1)>f(x2))
*a=x1;
else
*b=x2;
*n=*n+1;
s=calc(a,b,e,n);
}
return s;
}
main()
{ double s,a,b,e;
int n=0;
scanf("%lf %lf %lf",&a,&b,&e);
s=calc(&a,&b,e,&n);
printf("a=%lf,b=%lf,s=%lf,n=%d\n",a,b,s,n); }
5 程序运行结果如下图:。