dynare/dynare++/sylv/matlab/gensylv.m

76 lines
3.1 KiB
Matlab

%
% GENSYLV solves the following matrix equation:
% A*X + [0 B]*X*kron(C,..,C) = D,
% where
% A ...... regular (n,n) matrix,
% [0 B] .. (n,n) matrix with a few first
% columns equal to zeros
% B ...... rectangular (n, nz) matrix with nz<=n
% C ...... regular (m,m) matrix, whose spectrum is
% within (-1, 1)
% kron(C,..,C)
% ...... Kronecker power of C of order 'order'
% D ..... rectangular (n, m^order) matrix.
%
% [err, X] = gensylv(order, A, B, C, D)
% returns err a scalar where 1 indicates failure, 0 indicates success
% and X as the solution, doesn't perform any checks
%
% [err, X, par] = gensylv(order, A, B, C, D)
% solves the system, and performs checks. 'par' is struct
% containing information about solution and error norms
% returned by the check. This is a list of the struct
% members, some of them may be missing in actual returned
% value:
% method = method used for solution recursive/iterative
% convergence_tol = convergence tolerance for iter. method
% max_num_iter = max number of steps for iter. method
% bs_norm = Bavely Stewart log10 norm for diagonalization
% converged = convergence status for iterative method
% iter_last_norm = residual norm of the last step of iterations
% num_iter = number of iterations performed
% f_err1 = norm 1 of abs. error C-V*F*inv(V)
% f_errI = norm Inf of abs. error C-V*F*inv(V)
% viv_err1 = norm 1 of abs. error I-V*inv(V)
% viv_errI = norm Inf of abs. error I-V*inv(V)
% ivv_err1 = norm 1 of abs. error I-inv(V)*V
% ivv_errI = norm Inf of abs. error I-inv(V)*V
% f_blocks = number of diagonal blocks of F
% f_largest = size of largest diagonal block in F
% f_zeros = number of off diagonal zeros in F
% f_offdiag = number of all offdiagonal elements in F
% rcondA1 = reciprocal cond 1 number of A
% rcondAI = reciprocal cond Inf number of A
% eig_min = minimum eigenvalue of vectorized system
% mat_err1 = rel. matrix 1 norm of A*X-[0 B]*X*kron(C,..,C)-D
% mat_errI = rel. matrix Inf norm of --"--
% mat_errF = rel. matrix Frobenius norm of --"--
% vec_err1 = rel. vector 1 norm of --"--
% vec_errI = rel. vector Inf norm of --"--
% cpu_time = CPU time needed for solution in CPU seconds
%
% $Header: /var/lib/cvs/dynare_cpp/sylv/matlab/gensylv.m,v 1.1.1.1 2004/06/04 13:01:13 kamenik Exp $
% Tag $Name: $
function [err, X, varargout] = gensylv(order, A, B, C, D)
% in Windows, ensure that aa_gensylv.dll is loaded, this prevents
% clearing the function and a successive Matlab crash
if strcmp('PCWIN', computer)
if ~ libisloaded('aa_gensylv')
loadlibrary('aa_gensylv', 'dummy');
end
end
% launch aa_gensylv
if nargout == 2
X = aa_gensylv(order, A, B, C, D);
elseif nargout == 3
[X, par] = aa_gensylv(order, A, B, C, D);
varargout(1) = {par};
else
error('Must have 2 or 3 output arguments.');
end
err = 0;