MATLAB无约束多维极值——最速下降法

一、算法原理

1、首先了解一个概念,什么式无约束最优化。

无约束优化问题就是在x∈R^n的范围内,找到一点x*,使得f(x*)<f(x)对于任意x∈R^n都成立。点x*就是全局最优解。

其一般形式为        min[f(x)] ,x∈R^n。

2、假设函数为f(x),最速下降法通过给定一个初始点xk,选择xk处的负梯度方向为最速下降方向,然后进行线搜索来确定步长。

其迭代公式为:x(k+1)=xk-a*gradient(f)/norm(gradient(f)),

其中a为步长,∇f(xk)=gradient(f)/norm(gradient(f))为梯度。

步长a要满足,f(x(k+1))=min(f(x(k+1))

3、算法步骤,整个步骤分为两大部分:按照迭代公式的循环迭代,步长a的确定。

我们以二维极值问题f=x1.^2+25*x2.^2,为例。

(1)给定初始点[2 2],和迭代精度tol(可设置为默认值);

(2)求其梯度∇f(xk)=gradient(f)/norm(gradient(f));

(3)带入迭代公式x(k+1)=xk-a*gradient(f)/norm(gradient(f))

(4)步长的确定,将上一步的迭代公式代入f=x1.^2+25*x2.^2,对其求导,导数为零点的a就式最佳步长。

(5)将求得的步长a带入迭代公式,判断||梯度值||是否满足精度要求,不满足要求更新当前梯度值,,继续求步长。不断循环,直至满足要求。

二、MATLAB程序

clc
clear
f=@(x1,x2) x1.^2+25*x2.^2;
[x,result]=Min_TD(f,[2;2]);
function [x,result]=Min_TD(f,x0,tol)%f为匿名函数句柄,x0为初始点,tol为精度
if nargin == 2
    tol=1e-6;
end
x01=x0(1);
x02=x0(2);
f_sym=sym(f); %将匿名函数转化为符号函数
%% F_td为计算梯度值  f_td为了计算当前梯度值
F_td=matlabFunction(gradient(f_sym));%计算该函数梯度,并取得梯度函数句柄
f_td=F_td(x01,x02); %计算当前的梯度值
d_k=-f_td/norm(f_td);%下降方向
%% 寻找最佳迭代步长 alfa
while norm(f_td) > tol %当前梯度值不满足要求
    syms alfa
    x1=x0(:)+alfa*d_k;%将这个点带入迭代表达式,求alfa 
    x11=x1(1);
    x12=x1(2);
    fx1=f(x11,x12);%计算x1带入后的原函数表达式
    d_x1=diff(fx1);%对原函数表达是式求导
    d_alfa=double(solve(d_x1));%求解表达式为0时的alfa(导数为零时的点为极小值点)
    
    x0=x0(:)+d_alfa*d_k;%进行迭代
    x01=x0(1);
    x02=x0(2);
    f_td=F_td(x01,x02);%当前梯度值
    if norm(f_td) < tol %满足要求,退出
        break;
    end
    d_k=-f_td/norm(f_td);%否则,继续迭代
end
x=x0;
result=f(x(1),x(2));
end

 

 

 

 

 

 

  • 9
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值