• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

【MATLAB与机械设计】多维优化之梯度法(最速下降法)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap