梯度下降法求解函數極大值-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

這是截圖
計算結果

題外話

第一次發博客,開始涉足計算機視覺領域,歡迎拍磚。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM