gusucode.com > symbolic工具箱matlab源码程序 > symbolic/@sym/sqrtm.m

    function [X,resnorm] = sqrtm(A)
%SQRTM   Matrix square root.
%   X = SQRTM(A) produces a matrix X such that X*X = A and the
%   eigenvalues of X are the square roots of the eigenvalues of A.
% 
%   [X, resnorm] = sqrtm(A) also returns the residual, 
%   norm(A-X^2,'fro')/norm(A,'fro'). 
% 
%   Example: 
%      A = sym([2, -2, 0; -1, 3, 0; -1/3, 5/3, 2]);
%      X = sqrtm(A);
%      simplify(X*X-A)
%
%      syms a; 
%      A = [4, 1; a, 2];
%      X = sqrtm(A);
%      simplify(X*X-A)
%
%   See also EXPM, SYM/EXPM.

%   Copyright 2012 MathWorks, Inc.

A = privResolveArgs(A);
Asym = formula(A{1});

if size(Asym,1) ~= size(Asym,2)
    error(message('symbolic:sym:sqrtm:MatrixMustBeSquare'));
end

if any(reshape(~isfinite(Asym),[],1))
   error(message('symbolic:sym:InputMustNotContainNaNOrInf'));
end

if isempty(Asym) 
    X = sym([]);
    if nargout == 2
        resnorm = sym([]);
    end
else
    X = mupadmex('symobj::sqrtm',Asym.s);
    if nargout == 2
        if isscalar(X) && strcmp(char(X),'FAIL')
            resnorm = sym('FAIL');
        else
            resnorm = norm(Asym-X^2,'fro')/norm(Asym,'fro');
        end
    end
end

X = privResolveOutput(X, A{1});