1 / 6
文档名称:

进退法.pdf

格式:pdf   大小:125KB   页数:6页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

进退法.pdf

上传人:鼠标 2023/6/1 文件大小:125 KB

下载得到文件列表

进退法.pdf

相关文档

文档介绍

文档介绍:该【进退法】是由【鼠标】上传分享,文档一共【6】页,该文档可以免费在线阅读,需要了解更多关于【进退法】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。进退法?1.?算法原理?进退法是用来确定搜索区间(包含极小值点的区间)的算法,其理论依据是:f(x)为单谷函数(只有一个极值点),且[a,b]为其极小值点的一个搜索区间,对于任意x,x?[a,b],如果,则[a,x]为极小值的搜索区间,如果,12f?x1??f?x2?2f?x1??f?x2?则[x,b]为极小值的搜索区间。?1因此,在给定初始点x,及初始搜索步长的情况下,首先以初始步长向前搜索一步,0h计算fx?h。??0?(1)?如果?f?x0??f?x0?h?则可知搜索区间为[x,x?h],其中x待求,为确定x,后退一步计算f(x??h),?00为缩小系数,且?,直接找到合适的?*,使得?*,从而确定搜索0??1f(x0?h)?f?x0?区间[x??*h,x?h]。?00(2)?如果fx?fx?h??0??0?则可知搜索区间为[x,x],其中待求,为确定,前进一步计算f(x??h),?为0xx0放大系数,且?,知道找到合适的?*,使得?*,从而确定搜索?1f?x0?h??f(x0?h)区间[x,x??*h]。?002.?算法步骤?用进退法求一维无约束问题minf(x),x?R的搜索区间(包含极小值点的区间)的基本算法步骤如下:?(1)?给定初始点x(0),初始步长h,令h?h,x(1)?x(0),;?00k?0(2)?令x(4)?x(1)?h,置k?k?1;?(3)?若f?x(4)??f?x(1)?,则转步骤(4),否则转步骤(5);?(4)?令x(2)?x(1),x(1)?x(4),f?x(2)??f?x(1)?,f?x(1)??f?x(4)?,令h?2h,转步骤(2);?(5)?若k?1,则转步骤(6)否则转步骤(7);?(6)?令h??h,x(2)?x(4),f?x(2)??f?x(4)?,转步骤(2);?(7)?令x(3)?x(2),x(2)?x(1),x(1)?x(4),停止计算,极小值点包含于区间[x(1),x(3)]或[x(3),x(1)]?3.?算法的MATLAB实现?在MATLAB中编程实现的进退函数为:minJT?功能:用进退法求解一维函数的极值区间。?调用格式:[minx,maxx]?minJT(f,x0,h0,eps)?其中,f:目标函数;???????x0:初始点;???????h0:初始步长;???????eps:精度;???????minx:目标函数取包含极值的区间左端点;???????maxx:目标函数取包含极值的区间又端点。?进退法的MATLAB程序代码如下:?functon?[minx,maxx]=minJT(f,x0,h0,eps)?%目标函数:f;?%初始点:x0;?%初始步长:h0;?%精度:eps;?%目标函数取包含极值的区间左端点:minx;?%目标函数取包含极值的区间又端点:maxx;?format?long;?if?nargin==3?????eps=-6;?end?x1=x0;?k=0;?h=h0;?while?1?????x4=x1+h;??%试探步?????k=k+1;?????f4=subs(f,findsym(f),x4);?????f1=subs(f,findsym(f),x1);?????if?f4f2=f1;?????????f1=f4;?????????h=2*h;????%加大步长?????else?????????????if?k==1?????????????????h=-h;???%反向搜索?????????????????x2=x4;?????????????????f2=f4;?????????????else?????????????????x3=x2;?????????????????x2=x1;?????????????????x1=x4;?????????????????break;?????????????end?????end?end?minx=min(x1,x3);?maxx=x1+x3-minx;?format?short;??例:?取初始点为0,,用进退法求函数f(t)?(t2?1)2?(t?1)2?3?t4?t2?2t?5的极值区间。?解:在MATLAB命令窗口中输入:?syms?t;?f=t^4-t^2-2*t+5;?[x1,x2]=minJT(f,0,)??所得结果为:?x1?=????????????????x2=x1;??????????x1=x4;?x2?=???由上面的结果可知f(t)的极值点在区间[,]内。进退法?%进退法,(天津大学出版社)。?%?author:?liuxi?BIT?%[left?righ为t]下单峰区间,y为函数,x为函数y的变量,x0为初始点(默认为0),step(>0)为初始步长()?function?[left?right]?=?jintuifa(y,x,x0,step)?if?nargin==3当%只有三个参数时,????s?tep=;?end?if?nargin==2????x?0=0;%当只有两个参数时,默认设置初始点为0????s?tep=;?end?f0=subs(y,{x},{x0});%step1?求f(x0)?将函数y中变量x替换为x0?x1=x0+step;%step2?f1=subs(y,{x},{x1});?if?(f1<=f0)%step3?step4????s?tep=2*step;????x?2=x1+step;????f?2=subs(y,{x},{x2});????w?hile(f1>f2)??????x?0??=x1;?x1=x2;??????f?0?=?f1;?f1=f2;??????s?t?e?p=2*step;??????x?2??=x1+step;??????f?2?=?subs(y,{x},{x2});????e?nd????l?eft=x0????r?ight=x2?else%step5?step6????s?tep=2*step;????x?2=x1-step;????f?2=subs(y,{x},{x2});w?hile(f0>f2)??????x?1??=x0;?x0=x2;??????f?1?=?f0;?f0=f2;??????s?t?e?p=2*step;??????x?2??=x1-step;??????f?2?=?subs(y,{x},{x2});????e?nd????l?eft=x2;right=x1;?end?进退法?%进退法?functon?[a,b]=JTF(x0,h,d,dd,q)???r0=0;????y?0=f(x0+r0.*dd,q);????k?=0;????l=?1;????w?hile?(l)??????r1?=?r?0+h;??????y?1?=?f(x0+r1.*dd,q);??????if???y?1h??=d??*?h?;???????r?=?r?0?;??if?nargin==3%μ±??ó?D??è?y????2r?0??ê=?yr?ê1?;±?£???è?éè??2?3¤??????step=;???????y?0?=?y?1?;??end??????e?ls?e??if?nargin==2???????i?f??k=?=?0?;?????x0=0;%μ±??óDá??????2???ê?y?ê?±h?£=?-??h??;???è???éè??3?ê?μ??a0?????h=;?????????r?=?r?0?;?????end???????e?l?s?e???f0=subs(y,{x},{x0});??%??s?te?p??1l?=??0?;ó??f?(x?0?)????oˉêyy?D±?á?xì????ax0?x1=x0+h;%step2?????????b?r?e?a?k?;???f1=subs(y,{x},{x1});???????e?n?d????if?(f1<=f0)%step3?st?e?p?4??e?n?d???????h=2*h;??????k?=?k?+1;?????x2=x1+h;????e?nd?????f2=subs(y,{x},{x2});?????a?=??m?in(r,r1);?????while(f1>f2)??????b?=?m?ax(r,r1);??????????x0=x1;?x1=x2;?????????f0=f1;?f1=f2;进?退法????????h=2*h;?function?[left?right]?=?jintuifa(y,x,x0,h)?????????x2=x1+h;?????????f2=subs(y,{x},{x2});?????end?????left=x0?????right=x2?else%step5?step6?????h=2*h;?????x2=x1-h;?????f2=subs(y,{x},{x2});?????while(f0>f2)?????????x1=x0;?x0=x2;?????????f1=f0;?f0=f2;?????????h=2*h;?????????x2=x1-h;?????????f2=subs(y,{x},{x2});?????end?????left=x2;right=x1;?end