zoukankan      html  css  js  c++  java
  • 最速下降法+Matlab代码

    算法原理

    to-do

    Matlab代码

    clc; clear;
    
    f = @(x) x(1).^2+2*x(1)*x(2)+3*x(2).^2; %待求函数,x1,x2,x3...
    % f = @(x) x(1).^2+2*x(2).^2;
    paraNum = 2; %函数参数的个数,x1,x2,x3...的个数
    x0 = [3,3]; %初始值
    tol = 1e-5; %迭代容忍度
    flag = inf; %结束条件
    error = []; %函数变化
    
    while flag > tol
        p = g(f,x0,paraNum); %列向量
        f2 = @(a) f(x0-a*p');
        buChang = argmin(f2); %求步长,line search:argmin function
        x1 = x0-buChang*p';
        flag = norm(x1-x0);
        error = [error,flag];
        x0 = x1;
    end
    plot(0:length(error)-1,error)
    
    function [f_grad] = g(f,x0,paraNum)
    temp = sym('x',[1,paraNum]);
    f1=f(temp);
    Z = gradient(f1);
    f_grad = double(subs(Z,temp,x0));
    end
    
    function [x] = argmin(f)
    %求步长
    t = 0;
    options = optimset('Display','off');
    [x,~] = fminunc(f,t,options);
    end
    

    代码问题

    1. Matlab符号运算,耗时
    2. 最速下降法的步长使用line-search,耗时

    代码改进

    clc; clear;
    
    f = @(x) x(1).^2+2*x(1)*x(2)+3*x(2).^2; %待求函数,x1,x2,x3...
    % f = @(x) x(1).^2+2*x(2).^2;
    paraNum = 2; %函数参数的个数,x1,x2,x3...的个数
    x0 = [3,3]; %初始值
    tol = 1e-3; %迭代容忍度
    flag = inf; %结束条件
    error = []; %函数变化
    
    while flag > tol
    % for i =1:1
        p = g(f,x0,paraNum); %列向量    
        if norm(p) < tol
                buChang = 0;
        else
            buChang = argmin(f,x0,p,paraNum); %求步长,line search:argmin function
        end
        x1 = x0-buChang.*p';
        flag = norm(x1-x0);
        error = [error,flag];
        x0 = x1;
    end
    plot(0:length(error)-1,error)
    
    function [f_grad] = g(f,x0,paraNum)
    temp = sym('x',[1,paraNum]);
    f1=f(temp);
    Z = gradient(f1);
    f_grad = double(subs(Z,temp,x0));
    end
    
    % function [x] = argmin(f,paraNum)
    % %求步长
    % t = zeros(1,paraNum);
    % options = optimset('Display','off');
    % [x,~] = fminunc(f,t,options);
    % end
    
    function [x] = argmin(f,x0,p,num)
    % 求步长
    % for i=1:paraNum
    %     syms(['x',num2str(i)]);
    % end
    temp = sym('x',[1,num]);
    f1=f(x0 - temp.*p');
    for i = 1:num
        temp(i) = diff(f1,temp(i));
    end
    jieGuo = solve(temp);
    jieGuo = struct2cell(jieGuo);
    x = zeros(1,num);
    for i = 1:num
        x(i) = double(jieGuo{i});
    end
    end
    
  • 相关阅读:
    一篇图看清Java中的各种Queue
    使用尾递归计算阶乘
    使用 Sonar 检测代码质量
    jsessionid 导致重定向404的问题
    Java8之——简洁优雅的Lambda表达式
    支付宝手机网站支付开发指引
    Intellij Idea 编辑器使用之 安装、破解 版本15.0.1
    虚拟机启动linux系统报错,此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态
    META-INF文件夹是干啥的,META-INF文件夹的作用, META-INF文件夹能删吗
    一道Integer面试题引发的对Integer的探究
  • 原文地址:https://www.cnblogs.com/kexve/p/11737898.html
Copyright © 2011-2022 走看看