76 lines
3.1 KiB
Matlab
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;
|
|
|