function x_tilde = conjugate_gradient(A,b,x0) n = size(A)(2); if(nargin == 2) x_tilde = zeros(n,1); else x_tilde = x0; endif residue_old = b - A*x_tilde; conjugate_direction = residue_old; for i=1:n A_conjugate_direction = A*conjugate_direction; size_residue_old = residue_old'*residue_old; alpha = (size_residue_old)/(conjugate_direction'*A_conjugate_direction); x_tilde = x_tilde + alpha*conjugate_direction; residue_new = residue_old - alpha*A_conjugate_direction; if(residue_new'*residue_new <10e-6) break endif beta = (residue_new'*residue_new)/(size_residue_old); conjugate_direction = residue_new + beta*conjugate_direction; residue_old = residue_new; endfor endfunction