0001 function [x,status]=bicgstab(func,b,x,tole,kmax,varargin) 0002 status = 0; 0003 r=b-feval(func,x,varargin{:}); 0004 rh_0 = r; 0005 rh = r; 0006 rho_0 = 1; 0007 alpha = 1; 0008 w = 1; 0009 v = 0; 0010 p = 0; 0011 k = 0; 0012 rho_1 = rh_0'*r; 0013 tolr = tole*norm(b); 0014 0015 while norm(r) > tolr & k < kmax 0016 k = k+1; 0017 beta = (rho_1/rho_0)*(alpha/w); 0018 p = r+beta*(p-w*v); 0019 v = feval(func,p,varargin{:}); 0020 alpha = rho_1/(rh_0'*v); 0021 r = r-alpha*v; 0022 t = feval(func,r,varargin{:}); 0023 w = (t'*r)/(t'*t); 0024 rho_0 = rho_1; 0025 rho_1 = -w*(rh_0'*t); 0026 x = x+alpha*p+w*r; 0027 r = r-w*t; 0028 end 0029 if k == kmax 0030 status = 1; 0031 warning(sprintf('BICSTABN didn''t converge after %d iterations: norm(r) = %g',kmax,norm(r))); 0032 end