资源简介

最优化算法 matlab 一维搜索 多维搜索

资源截图

代码片段和文件信息

function [x_kf_k]=conjugate_gradient(funx0eps)
%% Usage:[x_kf_k]=conjugate_gradient(‘x1^2+2*x2^2-4*x1-2*x1*x2‘[1;1]0.01)

x_k=x0;
l=length(x0);
f=inline(sym(fun));
% 每次新初始点处
g0=G(funx_k); %这里s_k是1*2矩阵
s_k=-g0;
k=0;

while 1
    % 精确一维搜索表达式,fun_v
    syms x;
    switch l
        case 2fun_v=f(x_k(1)+s_k(1)*xx_k(2)+s_k(2)*x);
        case 3fun_v=f(x_k(1)+s_k(1)*xx_k(2)+s_k(2)*xx_k(3)+s_k(3)*x);
        case 4fun_v=f(x_k(1)+s_k(1)*xx_k(2)+s_k(2)*xx_k(3)+s_k(3)*xx_k(4)+s_k(4)*x);
    end
    fun_vv=inline(fun_v);
    
    % 调用Newton法求最小lamda值
    c=Advance_Back(fun_v);
    result=Newton(fun_vvc);
    lamda=result(1);
    x_k=x_k+lamda*s_k;
    g1=G(funx_k);   %这里是k+1的梯度值
    
    norm_g1=norm(g1);
    if norm_g1        switch l
            case 2f_k=f(x_k(1)x_k(2));
            case 3f_k=f(x_k(1)x_k(2)x_k(3));
            case 4f_k=f(x_k(1)x_k(2)x_k(3)x_k(4));
        end
        return
    end
    
    u_k1=norm(g1)^2/norm(g0)^2;
    s_k=-g1+u_k1*s_k;
    k=k+1;
    g0=g1; %g1退化为g0
    
    if k==l-1
        %x_k=x_k; x0=x_k;
        g0=G(funx_k); %这里s_k是1*2矩阵
        s_k=-g0;
        k=0;
    end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 函数2,精确一维搜索Newton法
function x1=Newton(funx0) %x1可能是多个值
delta =0.01;
%% 求表达式的一阶导d1_f,二阶导d2_f
d1_f=inline(diff(sym(fun)));
d2_f=inline(diff(sym(fun)2));

%% 计算牛顿迭代公式
while 1
    d1_x0=d1_f(x0);
    d2_x0=d2_f(x0);
    err=abs(d1_x0);
    
    if err < delta    %判断此x0满不满足
        x1=x0;
        return
    end
    x0=x0-d1_x0/d2_x0;  %计算新x0
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 函数3,求梯度矩阵函数
function [Gradient_f]=G(funx);
%% 表达式中变量个数
l=length(x);
Gradient_f=zeros(l1);
%% 梯度矩阵(在x处一阶导)的值
for i=1:l
    % 循环求出梯度表达式
    x_i=[‘x‘num2str(i)];
    d=diff(sym(fun)x_i);    %对x(i)求梯度
    % 将xi替换为x(i)
    for k=1:l
        x_k=[‘x‘num2str(k)];
        x_k1=[‘x(‘num2str(k)‘)‘];
        d=strrep(char(d)x_kx_k1);
    end
    % 将该字符串写成内联函数,并将计算的值赋给Gradient_f矩阵对应的位置
    d_fun=inline(d);
    Gradient_f(i)=d_fun(x);
    
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 函数4,进退法确定牛顿搜索初始点
function c=Advance_Back(fun)

t0=0;
h=0.1;

%% 求函数表达式
f=inline(fun);
f_t0=f(t0);
t2=t0+h;
f_t2=f(t2);

if f_t2<=f_t0   %向正方探测
    t1=t0+h;
    f_t1=f(t1);
else            %向负方向探测
    h=-h;
    t1=t0+h;
    f_t1=f(t1);
end
%% 进退法计算
while 1
    if f_t1<=f_t0
        h=2*h;
        t2=t0;
        t0=t1;
        t1=t0+h;
        f_t1=f(t1);
    else
        if t1            a=t1;
            b=t2;
        else
            a=t2;
            b=t1;
        end
        c=(a+b)/2;
        return;
    end
end


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2012-12-04 13:20  算法程序\
     目录           0  2012-12-04 12:48  算法程序\实用最优化方法2\
     文件        3144  2012-12-04 15:03  算法程序\实用最优化方法2\DFP.m
     文件         810  2012-12-04 09:35  算法程序\实用最优化方法2\G.m
     文件        1399  2012-12-04 09:59  算法程序\实用最优化方法2\G_H.m
     文件        3075  2012-12-04 15:00  算法程序\实用最优化方法2\conjugate_gradient.m
     文件        3585  2012-12-04 15:02  算法程序\实用最优化方法2\damp_Newton.m
     文件        3201  2012-12-04 15:03  算法程序\实用最优化方法2\gradient_my.m
     目录           0  2012-12-04 13:18  算法程序\实用最优化算法\
     文件        1092  2012-12-04 13:09  算法程序\实用最优化算法\Advance_Back.m
     文件        1307  2012-12-04 13:11  算法程序\实用最优化算法\Bisect.m
     文件        1361  2012-12-04 13:12  算法程序\实用最优化算法\Golden_Slect.m
     文件        2003  2012-12-04 13:13  算法程序\实用最优化算法\Inaccuracy.m
     文件        1097  2012-12-04 13:15  算法程序\实用最优化算法\Newton.m
     文件        1117  2012-12-04 13:17  算法程序\实用最优化算法\Succeed_Fail.m
     文件       40960  2012-11-04 10:09  算法程序\实用最优化算法\测试记录.doc
     文件       25581  2012-11-04 10:09  算法程序\实用最优化算法\测试记录.docx

评论

共有 条评论