matlab code

profileA999
mypcgfun.m.docx

function [x,flag,relres,iter]=mypcgfun(Afun,b,tol,maxit,Mfun)

%Textbook page 133

%Mfun(r) solves M*z=r (i.e., compute z=M\r=M^{-1}r)

if(nargin<5)

Mfun=@(r) r; %no preconditioner

end

n=length(b);

x=zeros(n,1); %initial guess

r=b-Afun(x); r0=norm(r);

d=Mfun(r); z=d;

flag=1;relres=[];

for iter=1:maxit

Ad=Afun(d);

alf=r'*z/(d'*Ad);

x=x+alf*d;

r_old=r; r=r_old-alf*Ad;

relres=[relres;norm(r)/r0]; %store relative residuals

if(norm(r)/r0)<=tol

flag=0;break;

end

z_old=z; z=Mfun(r);

beta=r'*z/(r_old'*z_old);

d=z+beta*d;

end