From c7093a8385f37b8bd273db975d9f49d4c2745c55 Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Mon, 15 Mar 2010 16:02:07 +0100 Subject: [PATCH] second derivatives of jacobian w.r.t. parameters --- DynamicModel.cc | 37 ++++++++++++++++++++++++++++++++++++- DynamicModel.hh | 7 +++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/DynamicModel.cc b/DynamicModel.cc index c8cea732..efbb361c 100644 --- a/DynamicModel.cc +++ b/DynamicModel.cc @@ -2657,6 +2657,20 @@ DynamicModel::computeParamsDerivatives() jacobian_params_derivatives[make_pair(eq, make_pair(var, param))] = d2; } + for (second_derivatives_type::const_iterator it2 = jacobian_params_derivatives.begin(); + it2 != jacobian_params_derivatives.end(); it2++) + { + int eq = it2->first.first; + int var = it2->first.second.first; + int param1 = it2->first.second.second; + NodeID d1 = it2->second; + + NodeID d2 = d1->getDerivative(param); + if (d2 == Zero) + continue; + jacobian_params_second_derivatives[make_pair(eq, make_pair(var, make_pair(param1, param)))] = d2; + } + for (second_derivatives_type::const_iterator it2 = second_derivatives.begin(); it2 != second_derivatives.end(); it2++) { @@ -2750,9 +2764,30 @@ DynamicModel::writeParamsDerivativesFile(const string &basename) const paramsDerivsFile << ";" << endl; } + // Write jacobian second derivatives + paramsDerivsFile << "gpp = zeros(" << equation_number() << ", " << dynJacobianColsNbr << ", " + << symbol_table.param_nbr() << ", " << symbol_table.param_nbr() << ");" << endl; + + for (third_derivatives_type::const_iterator it = jacobian_params_second_derivatives.begin(); + it != jacobian_params_second_derivatives.end(); it++) + { + int eq = it->first.first; + int var = it->first.second.first; + int param1 = it->first.second.second.first; + int param2 = it->first.second.second.second; + NodeID d2 = it->second; + + int var_col = getDynJacobianCol(var) + 1; + int param1_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param1)) + 1; + int param2_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param2)) + 1; + + paramsDerivsFile << "gpp(" << eq+1 << ", " << var_col << ", " << param1_col << ", " << param2_col << ") = "; + d2->writeOutput(paramsDerivsFile, oMatlabDynamicModel, params_derivs_temporary_terms); + paramsDerivsFile << ";" << endl; + } // Write hessian derivatives - paramsDerivsFile << "gp = zeros(" << equation_number() << ", " << dynJacobianColsNbr << ", " + paramsDerivsFile << "hp = zeros(" << equation_number() << ", " << dynJacobianColsNbr << ", " << dynJacobianColsNbr << ", " << symbol_table.param_nbr() << ");" << endl; for (third_derivatives_type::const_iterator it = hessian_params_derivatives.begin(); diff --git a/DynamicModel.hh b/DynamicModel.hh index a06bff18..93fbc2f2 100644 --- a/DynamicModel.hh +++ b/DynamicModel.hh @@ -71,6 +71,13 @@ private: */ second_derivatives_type jacobian_params_derivatives; + //! Second derivatives of the jacobian w.r. to parameters + /*! First index is equation number, second is endo/exo/exo_det variable, and third and fourth are parameters. + Only non-null derivatives are stored in the map. + Variable and parameter indices are those of the getDerivID() method. + */ + third_derivatives_type jacobian_params_second_derivatives; + //! Derivatives of the hessian w.r. to parameters /*! First index is equation number, first and second are endo/exo/exo_det variable, and third is parameter. Only non-null derivatives are stored in the map.