Select Git revision
dynare_solve.m
dynare_solve.m 6.90 KiB
function [x,info] = dynare_solve(func,x,options,varargin)
% function [x,info] = dynare_solve(func,x,options,varargin)
% proposes different solvers
%
% INPUTS
% func: name of the function to be solved
% x: guess values
% options: struct of Dynare options
% varargin: list of arguments following jacobian_flag
%
% OUTPUTS
% x: solution
% info=1: the model can not be solved
%
% SPECIAL REQUIREMENTS
% none
% Copyright (C) 2001-2015 Dynare Team
%
% This file is part of Dynare.
%
% Dynare is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% Dynare is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
% jacobian_flag=1: jacobian given by the 'func' function
% jacobian_flag=0: jacobian obtained numerically
jacobian_flag = options.jacobian_flag;
% Set tolerance parameter depending the the caller function.
stack = dbstack;
if strcmp(stack(2).file,'simulation_core.m')
tolf = options.dynatol.f;
else
tolf = options.solve_tolf;
end
info = 0;
nn = size(x,1);
% checking initial values
if jacobian_flag
[fvec,fjac] = feval(func,x,varargin{:});
if any(any(isinf(fjac) | isnan(fjac)))
[infrow,infcol]=find(isinf(fjac) | isnan(fjac));
M=evalin('base','M_'); %get variable names from workspace
fprintf('\nSTEADY: The Jacobian contains Inf or NaN. The problem arises from: \n\n')
display_problematic_vars_Jacobian(infrow,infcol,M,x,'static','STEADY: ')
error('An element of the Jacobian is not finite or NaN')
end
else
fvec = feval(func,x,varargin{:});
fjac = zeros(nn,nn) ;
end
i = find(~isfinite(fvec));
if ~isempty(i)
disp(['STEADY: numerical initial values or parameters incompatible with the following' ...
' equations'])
disp(i')