Mercurial > matrix-functions
view mftoolbox/sqrtm_pulay.m @ 0:8f23314345f4 draft
Create local repository for matrix toolboxes. Step #0 done.
author | Antonio Pino Robles <data.script93@gmail.com> |
---|---|
date | Wed, 06 May 2015 14:56:53 +0200 |
parents | |
children |
line wrap: on
line source
function [X,k] = sqrtm_pulay(A,D) %SQRTM_PULAY Matrix square root by Pulay iteration. % [X,K] = SQRTM_PULAY(A,D) computes the principal square root of the % matrix A using the Pulay iteration with diagonal matrix D % (default: D = DIAG(DIAG(A))). D must have positive diagonal entries. % K is the number of iterations. % Note: this iteration is linearly converent and converges only when % SQRTM(D) sufficiently well approximates SQRTM(A). if nargin < 2, D = diag(diag(A)); end if any(diag(D)<0) || ~isreal(D) error('D must have positive, real diagonal.') end n = length(A); dhalf = sqrt(diag(D)); Dhalf = diag(dhalf); B = zeros(n); maxit = 50; tol = mft_tolerance(A); for k = 1:maxit Bold = B; B = (A - D - Bold^2) ./ (dhalf(:,ones(1,n)) + dhalf(:,ones(1,n))'); X = Dhalf + B; reldiff = norm(B - Bold,inf)/norm(X,inf); if reldiff <= tol, return, end end error('Not converged after %2.0f iterations', maxit)