function x=fsxsteep(f,e,a,b)
% fsxsteep函數(shù) 最速下降法![[轉(zhuǎn)載]matlab最速下降法 梯度下降算法 matlab](http://img.aihuau.com/images/01111101/01101043t012acd1e7cf845797a.png)
% x=fsxsteep(f,e,a,b)為輸入函數(shù) f為函數(shù) e為允許誤差 (a,b)為初始點(diǎn);
% fsx TJPU 2008.6.15
x1=a;x2=b;
Q=fsxhesse(f,x1,x2);
x0=[x1 x2]';
fx1=diff(f,'x1'); %對x1求偏導(dǎo)數(shù)
fx2=diff(f,'x2'); %對x2求偏導(dǎo)數(shù)
g=[fx1 fx2]'; %梯度
g1=subs(g); %把符號變量轉(zhuǎn)為數(shù)值
d=-g1;
while (abs(norm(g1))>=e)
t=(-d)'*d/((-d)'*Q*d);t=(-d)'*d/((-d)'*Q*d); %求搜索方向
x0=x0-t*g1; %搜索到的點(diǎn)
v=x0;
a=[1 0]*x0;
b=[0 1]*x0;
x1=a;
x2=b;
g1=subs(g);
d=-g1;
end;
x=v;
function x=fsxhesse(f,a,b)
% fsxhesse函數(shù) 求函數(shù)的hesse矩陣;
% 本程序僅是簡單的求二次函數(shù)的hesse矩陣??;
% x=fsxhesse(f)為輸入函數(shù) f為二次函數(shù) x1,x2為自變量;
% fsx TJPU 2008.6.15
x1=a;x2=b;
fx=diff(f,'x1'); %求f對x1偏導(dǎo)數(shù)
fy=diff(f,'x2'); %求f對x2偏導(dǎo)數(shù)
fxx=diff(fx,'x1'); %求二階偏導(dǎo)數(shù) 對x1再對x1
fxy=diff(fx,'x2'); %求二階偏導(dǎo)數(shù) 對x1再對x2
fyx=diff(fy,'x1'); %求二階偏導(dǎo)數(shù) 對x2再對x1
fyy=diff(fy,'x2'); %求二階偏導(dǎo)數(shù) 對x2再對x2
fxx=subs(fxx); %將符號變量轉(zhuǎn)化為數(shù)值
fxy=subs(fxy);
fyx=subs(fyx);
fyy=subs(fyy);
x=[fxx,fxy;fyx,fyy]; %求hesse矩陣
syms x1 x2;
X=[x1,x2];
fx=X(1)^2+2*X(2)^2;
z=fsxsteep(fx,0.001,1,1)
原文鏈接:http://blog.163.com/greatboy@126/blog/static/5786079120107185130807/
愛華網(wǎng)



