目录


  • 目录
  • 题目
  • 解答
  • 建立函数文件ceshim
  • 这是调用的命令也可以写在m文件里
  • 输出结果
  • 题外话


题目

matlab 梯度下降求最小值 梯度下降法matlab求极值_迭代

解答

本文使用MATLAB作答

1. 建立函数文件ceshi.m

function [x1,y1,f_now,z] = ceshi(z1,z2)
%%%%%%%%%%%%%% 梯度下降法求函数局部极大值%%%%%%%%%%%%%%%%%%
%   函数:f(x,y)=
%   目的:求局部极大值和对应的极大值点坐标
%   方法:梯度下降法
%   理论:
%       方向导数:偏导数反应的是函数沿坐标轴方向的变化率,但许多物理现象告诉我们,只考虑函数沿坐标轴方向的变化率是不够的,有必要研究函数沿任一指定方向的变化率。
%       函数f(x,y)在点P0(x0,y0)可微分,那么函数在改点沿任一方向l的方向导数存在,其值为:f'x(x0,y0)*cos(α)+f'y(x0,y0)*cos(β),其中,cos(α),cos(β)是方向l的方向余弦。
%       梯   度:是与方向导数有关联的另一个概念,梯度是一个向量,表示为:'x(x0,y0)*i+f'y(x0,y0)*j。
%       关   系:
%               f'x(x0,y0)*cos(α)+f'y(x0,y0)*cos(β)
%               =grad f(x0,y0)*el
%               =|grad f(x0,y0)|*cos(θ),其中el=(cos(α),cos(β))是与方向l同方向的单位向量。
%       变化率:函数沿某个方向的变化率指的是函数值沿这个方向变化的快慢。
%       θ=0,el与梯度同向,函数增加最快,函数在这个方向的方向导数达到最大值,这个最大值就是梯度的模;
%       θ=π,el与梯度反向,函数减少最快,函数在这个方向的方向导数达到最小值;
%       θ=π/2,el与梯度方向正交,函数变化率为零。

x0 = z1;
y0 = z2;
f_now = exp((sin(y0) - 1)^2)*cos(x0) + (x0 - y0)^2 + exp((cos(x0) - 1)^2)*sin(y0);%求解函数的极大值点,先求其函数负值的极小值点
z=0;                     %用于记录循环次数
f_error = 1;             %f_error为迭代差值,作为判别标准
h = 1.0e-8;              %步长

while f_error>1.0e-8     %判定标准:1.前后两次的差>1.0e-8(选用);2.迭代次数达到XX次;

    if (x0<-5)||(x0>0)
        break;
    end
    if ((y0<-5)||(y0>0))
        break;
    end
    f_val = f_now;
    x1 = x0 + h * (2*x0 - 2*y0 - exp((sin(y0) - 1)^2)*sin(x0) - 2*exp((cos(x0) - 1)^2)*sin(x0)*sin(y0)*(cos(x0) - 1));
    y1 = y0 + h * (2*y0 - 2*x0 + exp((cos(x0) - 1)^2)*cos(y0) + 2*exp((sin(y0) - 1)^2)*cos(x0)*cos(y0)*(sin(y0) - 1));
    f_now = exp((sin(y1) - 1)^2)*cos(x1) + (x1 - y1)^2 + exp((cos(x1) - 1)^2)*sin(y1) ;
    f_error = f_now-f_val;
    x0 = x1;
    y0 = y1;
    z = z+1;
end

end

2. 这是调用的命令,也可以写在.m文件里

clear
clc
[x1,y1,f_out] = ceshi(-1,-2);
fprintf('%.3f\t',x1,y1,f_out); %f保留小数点后三位

3. 输出结果

0.000 -1.585 56.088

这是截图

matlab 梯度下降求最小值 梯度下降法matlab求极值_matlab 梯度下降求最小值_02

题外话

第一次发博客,开始进入计算机视觉领域,欢迎拍砖。