function [Q, H] = arnoldi(A, u, m) % ARNOLDI Arnoldi iteration for Krylov subspaces. % Input: % A square matrix (n by n) % u initial vector % m number of iterations % Output: % Q orthonormal basis of Krylov space (n by m+1) % H upper Hessenberg matrix, A*Q(:,1:m)=Q*H (m+1 by m) % n = length(A); Q = zeros(n,m+1); H = zeros(m+1,m); Q(:,1) = u/norm(u); for j = 1:m % Find the new direction that extends the Krylov subspace. v = A*Q(:,j); % Remove the projections onto the previous vectors. for i = 1:j H(i,j) = Q(:,i)'*v; v = v - H(i,j)*Q(:,i); end % Normalize and store the new basis vector. H(j+1,j) = norm(v); Q(:,j+1) = v/H(j+1,j); end end