zoukankan      html  css  js  c++  java
  • 【MATLAB与机械设计】多维优化之梯度法(最速下降法)

    1,基本思路

    梯度法也称最速下降法。目标函数的梯度方向函数值上升最快,负梯度方向 是函数值下降最快的方向。因此以负梯度方向作为探索方向,来求目标函数的极小值。

    2,迭代公式

    在这里插入图片描述

    3,步长的选择

    a,任意选取只需要满足步长
    b,沿负梯度方向进行一维搜索,求解一维最优化问题的最优步长,即对目标函数求最小,以得到最优步长

    4,迭代步骤

    详见 https://wenku.baidu.com/view/a2aee7ee4afe04a1b071dee1.html

    5,MATLAB可执行代码

    function [k,x_min,f_min]=Gradient_method(f,x,exp)
    %% 程序说明
    %{
    该程序应用于多维无条件优化问题中的梯度下降法
    从数值迭代格式可以看出,构造一种算法的关键是如何确定一个有利的搜索方向。
    梯度方向是函数值上升最快的方向,负梯度方向是函数值下降最快的方向。
    
    变量说明:
        输入值部分
            f为目标函数,对于目标函数中自由变量的个数没有要求
            x为初值矩阵,要求在调用函数是必须为一行n列的形式,否则会导致后期维度出现错误
            exp为精度
        返回值部分
            k为迭代次数
            x_min为函数的局部极小值数列
            f_min为函数的局部极小值
    
    调用方法:
    clc
    clear
    syms x1 x2%所有的自由变量且必须由x1,x2,x3……表示
    x=[1,3];
    f=(x1-2)^2+2*(x2-1)^2;
    exp=0.0005;
    [k,x_min,f_min]=Gradient_method(f,x,exp) 
    
    %}
    %% 函数主体
    x_size=size(x,2);
    x_i= sym(zeros(1,x_size));
    %class(x_i)
    for i=1:x_size
        syms(['x' num2str(i)]);
        x_i(1,i)=['x' num2str(i)];
    end
    k=0;
    grad_f=gradient(f,x_i);
    while 1
        k=k+1;
    %求函数方向导数
    %grad_f=[diff(f,x1),diff(f,x2)];
    fz_d=subs(grad_f,x_i,x);
    %class(fz_d);
    fz_d=double(fz_d);
    %class(fz_d);
    fz_d1=norm(fz_d);
    s=fz_d/fz_d1;
    if fz_d1<exp
        x_min=x;
        f_min=subs(f,x_i,x_min);
        break;
    else
        %求最优步长
        syms a
        s=s';
        f_b=subs(f,x_i,x+a.*s);
        f_bd=diff(f_b,a);
        a=solve(f_bd==0,a);
        a=double(a);
        x=x+a*s;  
    end
    end
    end
    
  • 相关阅读:
    【BZOJ4621】Tc605 DP
    【BZOJ4624】农场种植 FFT
    【BZOJ4627】[BeiJing2016]回转寿司 SBT
    【BZOJ4631】踩气球 链表+线段树+堆
    Excel error 64-bit version of SSIS
    (转) bicabo Visual Studio 2012自动添加注释(如版权信息等)
    Integration Services 变量
    (转)SSIS_数据流转换(Union All&合并联接&合并)
    (转)SSIS处理导入数据时, 存在的更新, 不存在的插入
    (转)WPF学习资源整理
  • 原文地址:https://www.cnblogs.com/mach-pupil/p/12624349.html
Copyright © 2011-2022 走看看