线性搜索方法

线性搜索方法

0.618法

0.618

function [ x_opt , y_opt , stepNum, t] = f618( f,a,b,Theta_error )
%   0.618法又称黄金分割法
% 输入函数名f,迭代初始区间[a,b],和精度Theta_error
% 输出最优点,最优解,迭代次数,和计算时间

tic ; % 开始计时
err = b - a; % 初始迭代误差
stepNum = 0; % 初始迭代次数

lamda = a + 0.382*(b-a);
mu = a + 0.618*(b-a);

flamda = feval(f,lamda);
fmu = feval(f,mu);
P=0;%指示flamda,fmu大小比较,P=0,flamda大
while (err > Theta_error)

    if flamda > fmu
        P=0;
        a = lamda;

        lamda = mu;

        flamda = feval(f,mu);
        mu = a+0.618*(b-a);     
        fmu = feval(f,mu);        
    else
        P=1;
        b = mu;
        mu = lamda;
        fmu = flamda;
        lamda =a + 0.382*(b-a);
        flamda = feval(f,lamda);
    end
    
    err = b - a; % 更新误差
    stepNum = stepNum + 1;
end

if P==0
    x_opt = mu;% 最优点
else
    x_opt = lamda;
end

y_opt=feval(f,x_opt);%最优解
t = toc;  % 计时结束
end

Fibonacci 法

在这里插入图片描述
在这里插入图片描述

function [ x_opt , k , t] = Fibonacci ( f,a,b,Theta_error)
%k迭代次数
tic ;
%% 计算Fibonacci数组,确定计算次数n
F=[1 1];%Fibonacci数组
n = 3;
tau = (b-a)/Theta_error;
Fn=F(n-1)+F(n-2);
while (Fn<tau) % 当Fn < (b-a)/detle 时
    F=[F Fn];
    n=n+1; 
    Fn=F(n-1)+F(n-2);
end
F=[F Fn];

%% 迭代
err = b - a;
k = 0;
while (err > Theta_error)
    k = k + 1;
    lamda = a + F(n-k-1)/F(n-k+1)*(b-a);
    mu = a + F(n-k)/F(n-k+1)*(b-a); 
    %lamda、mu已自动更新,只需更新a和b
    if f(mu) >= f(lamda)
        b = mu;
    else
        a = lamda;
    end
    % 更新误差
    err = b - a; 
end
    x_opt = (lamda+mu)/2 ;
%     y_opt = f(x_opt);
    t = toc;        
end

二分法

在这里插入图片描述

function [ x_opt , stepNum , t ] = dichotomy( df, A , B, Theta_error)

% df:函数的导数df(x)
%默认A<B

tic;
stepNum = 0; 

a=min(A,B);
b=max(A,B);
err = b-a; 
% tau=Theta_error/(b-a);
% nmax=ceil(-log2(tau));%满足精度要求的最多迭代次数
while (err > Theta_error ) 
    stepNum = stepNum + 1;
    c = (a+b)/2; %区间中点
        
    if df(c) == 0
        x_opt = c;
        break;
    elseif df(c) > 0
        b = c;
    else
        a = c;
    end
    err = b - a; %精度误差
end
x_opt = c;
t = toc;
end


牛顿法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

function [ x_opt , stepNum, t] =  newton(f,x0,Theta_error)
%   牛顿法
% 只适用于一元函数f

tic ;
syms x; 

%避免与外部函数冲突,f的导数命名为Df
Df = diff(f(x));%f的导数
G = diff(Df);%f的二阶导数
% 开始迭代

xk= x0; % 迭代点初始化
err = inf;
stepNum = 0;
gk=inf;
xk_1=x0;%上一步xk初始化
while (err>Theta_error || abs(gk>Theta_error))
%当||gk||<=epsilon,停止迭代,未知因素导致gk不会无限趋于0,故加上当迭代点xk几乎不变时停止迭代
    
    stepNum = stepNum + 1;
    
Gk=double(subs(G,x,xk));
% subs将函数字符串中的x变为xk,并将类型转换为double型
    gk=double(subs(Df,x,xk))
    
    %dk=-Gk^(-1)gk 步长
    dk = -1/Gk*gk; 

    fun=@(alpha) f(xk)+alpha*dk*gk+1/2*(alpha*dk)^2*Gk;
    %fun为f(xk+alpha*dk),alpha为步长因子,用二次taylor展开近似
    alphak = fminunc(fun,1); % 解方程求最优alpha,设初始值为1
    xk = xk + alphak*dk;
    %更新误差
    err = abs(xk_1-xk);
    xk_1 = xk;
end
    x_opt = xk;
    t = toc;
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值