共轭梯度法MATLAB程序
%conjugate gradient methods
%method:FR,PRP,HS,DY,CD,WYL,LS
%精确线搜索,梯度终止准则
function [ m,k,d,a,X,g1,fv] conjgradme G,b,c,X,e,method
if nargin 6 error '输入参数必须为6' ;
end
n length G ;
if n 2
format long e %rat
syms x1 x2
f 1/2*[x1,x2]*G*[x1;x2]+b'*[x1;x2]+c;
g [diff f,x1 ;diff f,x2 ];
g1 subs subs g,x1,X 1,1 ,x2,X 2,1 ;
d -g1;
a - d'*g1 / d'*G*d ;% a - X :,1 '*G*d+b'*d / d'*G*d ; a g1 :,1 '*g1 :,1 / d :,1 '*G*d :,1 ;
X :,2 X :,1 +a*d;
g1 [g1 subs subs g,x1,X 1,2 ,x2,X 2,2 ];
m1 norm g1 :,1 ;
m norm g1 :,2 ;
i 2;
k zeros 1 ;
switch method case 'FR' while m e k i-1 m/m1 ^2; d :,i -g1 :,i +k i-1 *d :,i-1 ; a i - d :,i '*g1 :,i / d :,i '*G*d :,i ; %a1 i - X :,i '*G*d :,i +b'*d :,i / d :,i '*G*d :,i ;a i g1 :,i '*g1 :,i / d :,i '*G*d :,i ; X :,i+1 X :,i +a i *d :,i ; g1 [g1 subs subs g,x1,X 1,i+1 ,x2,X 2,i+1 ]; m1 m; m norm g1 :,i+1 ; i i+1; end case 'PRP' while m e k i-1 g1 :,i '* g1 :,i -g1 :,i-1 / norm g1 :,i-1 ^2; d :,i -g1 :,i +k i-1 *d :,i-1 ; a i - d :,i '*g1 :,i / d :,i '*G*d :,i ; X :,i+1 X :,i +a i *d :,i ; g1 [g1 subs subs g,x1,X 1,i+1 ,x2,X 2,i+1 ]; m norm g1 :,i+1 ; i i+1; end case 'HS' while m e k i-1 g1 :,i '* g1 :,i -g1 :,i-1 / d :,i-1 '* g1 :,i -g1 :,i-1 ; d :,i -g1 :,i +k i-1 *d :,i-1 ; a i - d :,i '*g1 :,i / d :,i '*G*d :,i ; X :,i+1 X :,i +a i *d :,i ; g1 [g1 subs subs g,x1,X 1,i+1 ,x2,X 2,i+1 ]; m norm g1 :,i+1 ; i i+1; end case 'DY' while m e k i-1 g1 :,i '*g1 :,i / d :,i-1 '* g1 :,i -g1 :,i-1 ; d :,i -g1 :,i +k i-1 *d :,i-1 ; a i - d :,i '*g1 :,i / d :,i '*G*d :,i ; X :,i+1 X :,i +a i *d :,i ; g1 [g1 subs subs g,x1,X 1,i+1 ,x2,X 2,i+1 ]; m norm g1 :,i+1 ; i i+1; end case 'LS' while m e k i-1 g1 :,i '* g1 :,i -g1 :,i-1 / d :,i-1 '* -g1 :,i-1 ; d :,i -g1 :,i +k i-1 *d :,i-1 ; a i - d :,i '*g1 :,i / d :,i '*G*d :,i ; %a i - X :,i '*G*d :,i +b'*d :,i / d :,i '*G*d :,i ; X :,i+1 X :,i +a i *d :,i ; g1 [g1 subs subs g,x1,X 1,i+1 ,x2,X 2,i+1 ]; m norm g1 :,i+1 ; i i+1; end