0.618法的matlab实现
- 格式:doc
- 大小:213.00 KB
- 文档页数:4
《Matlab与通信仿真》实验指导书(下)通信基础教研室上课时间:学年第学期系部:班级:姓名:班内序号:指导教师:实验课程成绩:目录实验一MATLAB基础实验 (1)实验一成绩实验二绘图和确知信号分析实验 (8)实验二成绩实验三随机信号与数字基带实验 (15)实验三成绩实验四模拟调制实验 (24)实验四成绩实验五模拟信号数字传输实验(一) (32)实验五成绩实验六模拟信号数字传输实验(二) (41)实验六成绩实验七数字频带传输系统实验 (47)实验七成绩实验八通信系统仿真综合实验 (57)实验八成绩实验一 MATLAB 基础实验一、实验目的● 了解MATLAB 程序设计语言的基本特点,熟悉MATLAB 软件运行环境 ● 掌握创建、保存、打开m 文件及函数的方法● 掌握变量等有关概念,具备初步的将一般数学问题转化为对应的计算机模型并进行处理 的能力二、实验内容及步骤1.在Command Window 里面计算①(358)510++÷⨯;②sin(3)π③123456789A ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦,789456123B ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦,计算:,,\,/C A B D A B A C C B =⨯=+; ④3 1.247.5 6.6 3.15.4 3.4 6.1D ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦,求1',,D D D -; ⑤12345678i i Z i i ++⎡⎤=⎢⎥++⎣⎦,输入复数矩阵;2.建立.m 文件,用for 循环语句生成10×10的矩阵A :12102311101119⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦,将A 矩阵进行水平和垂直翻转得到矩阵B 和C 。
将A 矩阵的前5行,5列变成0并赋值给D 。
3.建立.m 文件,随机产生一个50×50的矩阵,元素值为从0到255,要求用0和255对该矩阵进行标记,元素值大于128的标记为255,元素值小于128的标记为0。
[设计]罚函数法MATLAB程序一、进退法、0.618法、Powell法、罚函数法的Matlab程序设计罚函数法(通用)function y=ff(x,k)y=-17.86*0.42*x(1)/(0.8+0.42*x(1))*(1-exp(-2*(0.8+0.42*x(1))/3))*exp(-1.6)*x(2)-22.99*x(1)/(0.8+x(1))*(1-exp(-2*(0.8+x(1))/3))*x(3)+k*(x(2)-(1.22*10^2*(9517.8*exp(-1.6-2*0.42*x(1)/3)*x(2)+19035.6*exp(-2*x(1)/3)*x(3)))/(1.22*10^2+9517.8*exp(-1.6-2*0.42*x(1)/3)*x(2)+19035.6*exp(-2*x(1)/3)*x(3)))^2+k*(x(3)-exp(-0.8-2*x(1)/3)*x(3)-exp(-2.4-2*0.42*x(1)/3)*x(2))^2; % 主函数,参数包括未知数的个数n,惩罚因子q,惩罚因子增长系数k,初值x0,以及允许的误差r function G=FHS(x0,q,k,n,r,h,a) l=1;while (l)x=powell(x0,n,q,r(1),h,a); %调用powell函数g(1)=ff1(x),g(2)=ff2(x) . . . g(p)=ffp(x); %调用不等式约束函数,将其值%存入数组gh(1)=hh1(x),h(2)=hh2(x) . . . h(t)=hht(x); %调用等式约束函数,将其值%存入数组hfor i=1:pif g(i)<rfor j=1:tif abs(h(j))<r(2)continue;elsebreak;endendelsebreak;endendif (i==p)&(j==t) %如果所有约束条件的值都在允许的范围内就结束 %搜索,否则加大惩罚力度继续搜索l=0;elsex0=x;q=k*q;endendG=x%powell算法,用于寻找无约束最优值点function powel=powell(x0,n,q,r,h,a)d=eye(n); %n个线性无关的初始搜索方向k=1;kk=1;xx(1,1:n)=x0;while (kk)y(1,1:n)=xx(k,1:n);for j=1:ns(j)=HJ(y(j,1:n),d(j,1:n),q); %调用0.618算法y(j+1,1:n)=y(j,1:n)+s(j).*d(j,1:n);endd(n+1,1:n)=y(n+1,1:n)-y(1,1:n);if (norm(d(n+1,1:n),2)<r)kk=0;break;elseww=0;m=1;for i=1:ngg=ff(y(i,1:n),q)-ff(y(i+1,1:n),q);if (gg>=ww)m=i;endendcha=ff(y(1,1:n),q)-2*ff(y(n+1,1:n),q)+ff(2*y(n+1,1:n)-y(1,1:n),q); cha1=2*(ff(y(m,1:n),q)-ff(y(m+1,1:n),q));if (cha<cha1)s(n+1)=HJ(y(n+1,1:n),h,a,d(n+1,1:n),q)xx(k+1,1:2)=y(n+1,1:n)+s(n+1).*d(n+1,1:n)for j=m+1:nd(j,1:n)=d(j+1,1:n);endk=k+1;elsexx(k+1,1:n)=y(n+1,1:n);k=k+1;endendendpowel=y(n+1,1:n)function w=HJ(x0,h,d,dd,q) %0.618算法[a,b]=JTF(x0,h,d,dd,q); %调用进退法算法,确定范围r=0.618;r1=a+(1-r)*(b-a);r2=a+r*(b-a);y1=ff(x0+r1.*dd,q);y2=ff(x0+r2.*dd,q);k=1;while (abs(r1-r2)>=0.1)if y1<y2b=r2;r2=r1;y2=y1;r1=a+(1-r)*(b-a);y1=ff(x0+r1.*dd,q);elsea=r1;r1=r2;y1=y2;r2=a+r*(b-a);y2=ff(x0+r2.*dd,q);endendw=(r1+r2)/2%进退法function [a,b]=JTF(x0,h,d,dd,q) r0=0;y0=ff(x0+r0.*dd,q);k=0;l=1;while (l)r1=r0+h;y1=ff(x0+r1.*dd,q);if y1<y0h=d*h;r=r0;r0=r1;y0=y1;elseif k==0;h=-h;r=r0;elsel=0;break;endendk=k+1;enda=min(r,r1);b=max(r,r1);二、进退法、0.618法的C语言程序设计例1 设f(x)=x^2-2*x+4 ,试确定初始搜索区间,并输出迭代次数main(){int n=0;float t,h,a,b,c,d,f1,f2;printf(“t,h:”);scanf(“%f,%f”,&t,&h);f1=t*t-2*t+4;if((t+h)*(t+h)-2*(t+h)+4<=f1) {c=t+h;f2=c*c-2*c+4;} else {h=-h;c=t+h; f2=c*c-2*c+4;} while(f2<=f1){h=2*h;d=t;t=c;f1=f2;c=t+h; f2=c*c-2*c+4;n=n+1;}if(c<=d){a=c;b=d;}else{a=d;b=c;}printf(“[a,b]=[%.2f,%f]\n”,a,b); printf(“n=%d\n”,n);}运行情况如下:(1)t,h:0,0.05[a,b]=[0.35,1.55]n=4(2) t,h:-1.0,0.02[a,b]=[0.26,4.10]n=7(3)t,h:-100,0.01[a,b]=[-59.05,63.83]n=13例2 用0.618法求f(x)=8x^3-2*x^2-7*x+3 的局部最优解(允许误差ε=0.0001 ,初始点设为x0=0 ,初始步长h=1 (#include“math.h”float f(x)float x;float y;{y=((8.0*x-2.0)*x-7.0)*x+3.0;return(y);}main(){int n=0;float t,h,a,b,c,d,x0,f0,f1,f2,fc,fd;printf(“t,h:”);scanf(“%f,%f”,&t,&h);f1=f(t);if (f(t+h)<=f1)c=t+h;else{h=-h;c=t+h;}f2=f(c);while(f2<=f1){d=t;t=c;f1=f2;c=t+h;f2=f(c);} if(c<=d){a=c;b=d;}else{a=d;b=c;}c=a+0.382*(b-a);fc=f(c);d=a+0.618*(b-a);fd=f(d);do{if (fc>=fd) {a=c;c=d;fc=fd;d=a+0.618*(b-a); fd=f(d);} else {b=d;d=c;fd=fc;c=a+0.382*(b-a);fc=f(c);}n++;}while (b-a>0.0001);x0=(a+b)/2.0;f0=f(x0);pintf(“n=%d,x0=%7.4f,f0=%7.4f\n”,n,x0,f0); } 运行情况如下:t,h:0,1.0n=21,xo=0.6298,f0=-0.2034(。
《最优化方法》实验报告实验序号:01 实验项目名称:线性规划及MATLAB应用《最优化方法》实验报告实验序号:02 实验项目名称:0.618黄金分割法的应用结果分析:根据以上结果可知,在区间[0,3]上,函数g(x)=x^3-2*x+1的最小值点在x=0.9271处,此时最小值为0。
第二题:P50 例题3.1程序:function [t,f]=golden3(a,b) %黄金分割函数的m文件t2=a+0.382*(b-a);f2=2*(t2)^2-(t2)-1;t1=a+0.618*(b-a); %按照黄金分割点赋值,更准确可直接算f1=2*(t1)^2-(t1)-1;while abs(t1-t2)>0.16; %判定是否满足精度if f1<f2a=t2;t2=t1;f2=f1;t1=a+0.618*(b-a);f1=2*(t1)^2-(t1)-1;elseb=t1;t1=t2;f1=f2;t2=a+0.382*(b-a);f2=2*(t2)^2-(t2)-1;endendt=(t1+t2)/2; %满足条件取区间中间值输出第四题:P64 T3程序:function [t,d]=newtow2(t0)t0=2.5;t=t0-(4*(t0)^3-12*(t0)^2-12*(t0)-16)/(12*(t0)^2-24*(t0)-12);k=1;T(1)=t;while abs(t-t0)>0.000005t0=t;t=t0-(4*(t0)^3-12*(t0)^2-12*(t0)-16)/(12*(t0)^2-24*(t0)-12); k=k+1;T(k)=t;endt1=t0;d=(t1)^4-4*(t1)^3-6*(t1)^2-16*(t1)+4;kTend运行结果:当x(0)=2.5当x(0)=3四.实验小结:1.通过这次实验,加深了对0.618法的理解。
2.在学习0.618法的过程中,又巩固了倒数、求解函数值等相关知识。
0.618法的实例研究:一、算法理论黄金分割法是用于一元函数)(x f 在确定的初始区间],[b a 内搜索极小点a '的一种方法。
它是优化计算中的经典算法,以算法简单、效果明显而著称,是许多优化算法的基础。
但它只适用于某个区间上的凸函数。
其基本思想是:依照“去坏留好”原则,对称原则,以及等比收缩原则来逐步缩小搜索范围。
0.618法适用于单峰区间函数,即所在区间],[b a 上。
具体的说,对于单峰函数,只需选择两个试探点,即在区间],[b a 中取点)(382.01a b a x -+=,)(618.02a b a x -+=,且21x x <,就可以将包含极小点*x 的区间缩短。
事实上,必有:若)()(21x f x f >,则],[1*b x x ∈;若)()(21x f x f ≤,则],[2*x a x ∈。
根据单峰函数这个性质,就可以不断迭代缩小包含极小点的区间。
若进行k 次迭代后,有],[*k k b a x ∈,那么我们在区间],[k k b a 取两个试探点)(382.01a b a x -+=,)(618.02a b a x -+=,且21x x <,计算)(),(21x f x f 的值。
如果)()(21x f x f =,令b x a x ==21,,那么计算||b a -,如果ξ≤-||b a (ξ为所给的精度),则*2x b a =+;如果 )()(21x f x f >,令11x a k =+,k k b b =+1;如果)()(21x f x f <,令k k a a =+1,21x b k =+,如此继续。
这样每次可将搜索区间缩小0.328倍或者0.618倍,直至缩为一点。
黄金分割原理如图1所示,其中618.0=K ,区间长度为L 。
该算法为收敛速度很快的一种搜索方法。
图1.二、算法框图三、算法程序用10xf,区间为]8,2[,e取0.01为例x=x-)(2+7用C语言编程程序如下:#include <stdio.h>#include <math.h>#include <stdlib.h>#define f(x) x*x-7*x+10double 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;printf("Please input left boundary right boundary precision:\n"); scanf("%lf%lf%lf",&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);}四、算法实现方程为10xx=xf,区间是]8,2[,精度是0.01。
最优化方法实验报告(1)最优化方法实验报告Numerical Linear Algebra And Its Applications学生所在学院:理学院学生所在班级:计算数学10-1学生姓名:甘纯指导教师:单锐教务处2013年5月实验一实验名称:熟悉matlab基本功能实验时间: 2013年05月10日星期三实验成绩:一、实验目的:在本次实验中,通过亲临使用MATLAB,对该软件做一全面了解并掌握重点内容。
二、实验内容:1. 全面了解MATLAB系统2. 实验常用工具的具体操作和功能实验二实验名称:一维搜索方法的MATLAB实现实验时间: 2013年05月10日星期三实验成绩:一、实验目的:通过上机利用Matlab数学软件进行一维搜索,并学会对具体问题进行分析。
并且熟悉Matlab软件的实用方法,并且做到学习与使用并存,增加学习的实际动手性,不再让学习局限于书本和纸上,而是利用计算机学习来增加我们的学习兴趣。
二、实验背景:(一)0.618法(黄金分割法),它是一种基于区间收缩的极小点搜索算法,当用进退法确定搜索区间后,我们只知道极小点包含于搜索区间内,但是具体哪个点,无法得知。
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 kk k k k k k k k a b b a b a λλμμ+++++++=??=??=??=+-?转步骤(5)(4)置11111110.382*()k k k k k k k k k k a a b a b a μμλλ+++++++=??=??=??=+-?转步骤(5)(5)令1k k =+,转步骤(2)。
1、阐述黄金分割的基本思路及原理基本思路:黄金分割法适用于[a,b]区间上的任何单股函数求极小值问题,对函数除要求”单峰”外不做其他要求,甚至可以不连续.因此,这种方法的适应面非常广,黄金分割法也是建立在区间消去法原理基础上的试探方法,即在搜索区间[a,b 内适当插入两点a1,a2,并计算其函数值。
a1,a2将区间分成三段,应用函数的单峰性质,通过函数值大小的比较,删除其中一段,是搜索区间得以缩小。
然后再在保留下来的区间上作同样的处理,如此迭代下去,是搜索区间无限缩小,从而得到极小值的数值近似解。
基本原理:在单谷区间],[b a 内适当插入两点21,t t ,由此把区间],[b a 分为三段,然后再通过比较这两点函数值的大小,就可以确定是删去最左端还是最右端,或者同时删去左右两端保留中间段.如此继续下去可将单谷区间无缩小. 基本原理:所谓黄金分割就是将一线段分为两段时,要求整段长L 与较长段x 的比值正好等于较长段x 与较短段x L -的比值(如图所示),即xL xx L -= 于是有022=-+L Lx x ,解出其正根L L x 618.0215≈-=. 由此可见长段的长度应为全长的618.0倍,而短段的长度应为全长的382.0倍.因为古代的人们认为按618.0的比率来分割线段时最协调,胜似黄金,故称之为黄金分割. 2、黄金分割的算法步骤.(1)给定初始区间],[11b a ,精度要求0>ε。
令)(382.01111a b a -+=λ,)(618.01111a b a -+=μ,并计算)(1λf 与)(1μf 。
令1:=k 。
(2)若ε<-k k a b ,停止,且2kk a b x +=。
否则,当)()(k k f f μλ>时,转3;当)()(k k f f μλ≤时,转4。
(3)令k k k k k k b b a μλλ===+++111,,,)(618.01111++++-+=k k k k a b a μ,计算)(1+k f μ,令1:+=k k ,转2。
1.用进退法确定f(x)=x 2-7x+10的初始搜索区间.设x 0=0,h 0=1. 解:()()000()10,()0+1(1)40f x f f x h f f ==+===,因为000f x f x h >+()(),搜索成功,步长加倍;计算0000023 031 32f x h h f x h f f ++=+=+⨯==-()()()(), 因为00003f x h f x h +>+()(),搜索成功,步长加倍; 计算00000347 071 710f x h h f x h f f ++=+=+⨯==()()()(), 因为00003 7f x h f x h +<+()(),搜索失败,停止迭代;得到初始搜索区间为[]][0000, 71[,7]a b x h x h =++=,。
function [a, b]=jtf(varargin) if numel(varargin)<1 h0=input(' h0= ' ); x0=input(' x0= ' ); fx=@(x)x^2-7*x+10; elseinput_num= cell2mat (varargin(1, 1:2)); h0=input_num(1) ; x0=input_num(2) ; fx=varargin{3}; endh=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; endh=2*h;x3=x2+h;f3=fx(x3); while f2>=f3x1=x2;f1=f2;x2=x3;f2=f3; h=2*h;x3=x2+h;f3=fx(x3); end if h<0a=x3;b=x1; elsea=x1;b=x3; endresult=[a,b]MATLAB 程序运行结果: h0= 1 x0= 0 result =1 72.用0.618法求函数f(x)=x 2-7x+10的最优解.已知初始搜索区间为[2,8],精度为0.4。
黄金分割法求极小的MATLAB程序function [x,y] = goldmin(f, a ,b ,tol, maxsearch)if nargin<5, maxsearch=500; endif nargin<4, tol=1e-6; end;golden=0.6180339887498949025257; % golden=(sqrt(5)-1)/2x=b-(b-a)*golden; % x是离端点a较近的试探点y=feval(f,x); % 求x的函数值yfor k=1:maxsearch % 作最大叠代次数为maxsearch的循环。
h=b-a; % h是区间长(当b<a时是负的)if abs(h)<tol, return; end%区间长度小于tol 时退出d=a+h*golden;yd=feval(f,d); % d是离d较近的试探点,求d的函数值ydif y>=yd %当离a 较近点x的函数值y大于等于离a较远的点d的函数值yd时。
a=x; %去掉含a的一段区间,以离a 较近点x作为新区间的端点ax=d; %将d作为离新区间的点a端点较近的点。
y=yd; % 其函数值yd作为x点的函数值。
else%当离a 较近点x的函数值y小于离b较近的点d的函数值yd时。
去掉含% 端点b的一段区间,得区间[a,d],但由于现在x离d点较近,所以b=a; %令a 为端点ba=d; 令d为端点aendenderror('iteration exceeds the limitation');Fibonacci法求极小的MATLAB程序function [x,y] = Fibo(f,a,b,n)% F2=round(sqrt(5)*(0.5*(1+sqrt(5)))^(n+1)*0.2);F1=round(sqrt(5)*(0.5*(1+sqrt(5)))^(n)*0.2); F1=.44721359549995793928*1.6180339887498949025^n; F2=F1*1.6180339887498949025;F1=round(F1); F2=round(F2);h=(b-a)/F2;% 均分区间x=b-h*F1; % x 是离端点a 较近的试探点y=feval(f,x);% 求x 的函数值yfor k=1:n-2 % 循环F0=F1; F1=F2-F0; F2=F0;d=b-h*F1; yd=feval(f,d);% d 是离b 较近的试探点, 求d 的函数值ydif y>=yd% 当离a 较近点x的函数值y 大于等于离a 较远的点d 的函数值yd 时.a=x; % 去掉含端点a 的一段区间,以离a 较近点x 作为新区间的端点ax=d; % 将d 作为离新区间的端点a 较近的点.y=yd;% 其函数值yd 作为x 点的函数值.else % 当离a 较近的点x 的函数值y 小于离b 较近的点d 的函数值yd 时.%去掉含端点b 的一段区间, 得区间[a,d], 但由于现在x 离d 点较近, 所以b=a; % 令a 为端点ba=d; % 令d 为端点ah=-h;% 因交换端点, 步长应改号.endend1。
黄金分割法黄金分割法也叫0.618法,它是一种基于区间收缩的极小值点搜索算法,当用进退法确定搜索区间后,我们只知道极小值点包含于搜索区间内,但是具体是哪个点,无法得知。
1. 算法原理黄金分割法的思想很直接,既然极小值点包含于搜索区间内,那么可以不断地缩小搜索区间,就可以使搜索区间的端点逼近到极小值点。
[]a,b 为搜索区间,黄金分割法首先根据黄金比例产生两个内点12,x x 。
120.382*()0.618*()x a b a x a b a =+-=+-然后根据()1f x ,()2f x 的大小关系来重新选择搜索区间。
(1) 若()()12f x f x <,则搜索区间变为1[,]x b ;(2) 若()()12f x f x >,则搜索区间变为2[,]a x 。
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 ff λμ>时转步骤(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) 置11111110.382*()k k k k k kk k k k a a b a b a μμλλ+++++++=⎧⎪=⎪⎨=⎪⎪=+-⎩转步骤(5) (5) 令1k k =+,转步骤(2)。
3. 算法的MATLAB 实现在MATLAB 中编程实现黄金分割法的函数为:min HJ 。
功能:用黄金分割法求解一维函数的极值。
调用格式:[,min ]min (,,,)x f HJ f a b eps =其中,f :为目标函数;a :极值区间的左端点;b :极值区间的右端点;e p s :精度;x :目标函数取最小值时的自变量值;m i n f :目标函数的最小值。
实验报告
实验题目: 0.618法的MATLAB实现学生姓名:
学号:
实验时间: 2013-5-13
一.实验名称: 0.618法求解单峰函数极小点
二.实验目的及要求:
1. 了解并熟悉0.618法的方法原理, 以及它的MATLAB 实现.
2. 运用0.618法解单峰函数的极小点.
三.实验内容:
1. 0.618法方法原理:
定理: 设f 是区间],[b a 上的单峰函数, ] ,[ ,)2()1(b a x x ∈, 且)2()1(x x <. 如果)()()2()1(x f x f >, 则对每一个],[)1(x a x ∈, 有)()()2(x f x f >; 如果)()()2()1(x f x f ≤,
则对每一个] ,[)
2(b x x ∈, 有)()()1(x f x f ≥. 根据上述定理, 只需选择两个试探点, 就可将包含极小点的区间缩短. 事实上, 必有 如果)()()2()1(x
f x f >, 则],[)1(b x x ∈; 如果)()()
2()1(x f x f ≤, 则][)2(x a x ,∈. 0.618 法的基本思想是, 根据上述定理, 通过取试探点使包含极小点的区间(不确定区间)不断缩短, 当区间长度小到一定程度时, 区间上各点的函数值均接近极小值, 因此任意一点都可作为极小点的近似.
0.618 法计算试探点的公式:
).
(618.0),(382.0k k k k k k k k a b a a b a -+=-+=μλ 2. 0.618法的算法步骤:
①置初始区间],[11b a 及精度要求0>L , 计算试探点1λ和1μ, 计算函数值)(1λf 和)(1μf . 计算公式是
).(618.0 ),(382.011111111a b a a b a -+=-+=μλ
令1=k .
②若L a b k k <-, 则停止计算. 否则, 当)()(k k f f μλ>时, 转步骤③; 当)()(k k f f μλ≤时, 转步骤④.
③置k k a λ=+1, k k b b =+1, k k μλ=+1,)(618.01111++++-+=k k k k a b a μ, 计算函数值)(1+k f μ, 转步骤⑤.
④置k k a a =+1, k k b μ=+1, k k λμ=+1,)(382.01111++++-+=k k k k a b a λ, 计算函数值)(1+k f λ, 转步骤⑤.
⑤置1:+=k k , 返回步骤②.
四.实验流程图及其MATLAB 实现:
1. 流程图:
2. 代码及数值算例:
(1) 程序源代码:
function [x,k]=GSe(f,a,b,delta)
% 0.618法求解单峰函数极小点
f=inline(f);
N=10000;
for k=1:N
m=a+0.382*(b-a);
n=a+0.618*(b-a);
if f(m)>f(n)
a=m;
m=n;
else b=n;
n=m;
end
if abs(b-a)<delta
x=0.5*(b+a);break ;
end
end
(2) 数值算例:
12def )(min 2--x x x f ,
初始区间]1,1[],[11-=b a , 精度16.0≤L .
(i) 键入命令:
>> [x,k]=GSe('2*x^2-x-1',-1,1,0.16)
(ii) 运行结果:
x =
0.2229
k =
6
五.总结:
0.618法(黄金分割法)适用于单峰函数, 故应先确定目标函数的单峰区间, 方可进行迭代计算. 但单峰区间不是很明显就能确定, 故可用进退法寻找并确定单峰区间.
六.参考文献:
陈宝林 编著《最优化 理论与算法》 清华大学出版社 2005年10月第2版。