matlab一维搜索,用进退法确定搜索区间

一维搜索是优化算法的基础部分。搜索极小值首先要确定搜索区间,最常用的区间搜索就是进退法。根据进退法的本意,我重新优化了进退法搜索算法。如果有什么不对的地方,请网友们提出来。

function [a,b]=searchInterval(f,x0,h,t)
% Function:
%        searchInterval
% Input:
%        f: function;
%        x0: initial point;
%        h:step;
%        t :t>1;
% Output:
%        [a,b]: interval;
% Call: (none)
%
%----------------------------------------
% Principle:
% Application:
% Attention:
% Example:
% >>> f=@(t)t^4-t^2-2*t+5;
% >>> [a,b]=searchInterval(f,0,0.1)
% a =
%     0.3000
% b =
%     1.5000
% See also
%----------------------------------------
% Designer: William Song
% Date: 26-Apr-2015
% Path: D:\MATLAB\mywork\numerical\searchInterval.m

if nargin<=3,t=2;
    if nargin<=2,h=1;
        if nargin<=1,x0=0;
        end
    end
end

y0=f(x0);
x=x0+h;
y=f(x);
if y>y0,
    h=-h;         % x0,x<-x,x0
    x0=x;         % y0<-y;
    x=x0+h;
    y=f(x);       % y<y0
    h=t*h;
    xx=x0;x0=x;y0=y; % xx,x0,x<-x0,x,x-th0
    x=x0+h;
    y=f(x);
end
while y<=y0,       % in the case y==y0
    h=t*h;
    xx=x0;x0=x;y0=y;
    x=x0+h;
    y=f(x);
end
a=min(xx,x);b=max(xx,x);



下面是通常采用的算法。其实这个算法有一个小毛病,那就是第一次出现y=y0时,会报错。比较一下是不是做到了优化。

function [a,b]=searchInterval(f,x0,h,t)
% Function:
%        searchInterval
% Input:
%        f: function;
%        x0: initial point;
%        h:step;
%        t :t>1;
% Output:
%        [a,b]: interval;
% Call: (none)
% 
%----------------------------------------
% Principle: 
% Application: 
% Attention: 
% Example: 
% >>> f=@(x)x^3-2*x+1;
% >>> [a,b]=searchInterval(f)
% a =
%      0
% b =
%      3
% See also 
%----------------------------------------
% Designer: William Song
% Date: 26-Apr-2015
% Path: D:\MATLAB\mywork\numerical\searchInterval.m

if nargin<=3,t=2;
    if nargin<=2,h=1;
        if nargin<=1,x0=0;
        end
    end
end

y0=f(x0);k=0;
while 1
    x=x0+h;
    y=f(x);
    if y<y0,
        h=t*h;
        xx=x0;x0=x;y0=y;
        k=k+1;
    else
        if k==0,
            h=-h;
            x0=x;y0=y;
            k=k+1;
        else
            a=min(xx,x);b=max(xx,x);return;
        end
    end
end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值