31 using namespace
Input::Type;
35 return Record(
"PadeApproximant",
"Record with an information about pade approximant parameters.")
38 "Polynomial degree of the nominator of Pade approximant.")
40 "Polynomial degree of the nominator of Pade approximant")
45 Input::register_class< PadeApproximant, Input::Record >(
"PadeApproximant") +
81 OLD_ASSERT(matrix.n_rows == matrix.n_cols,
"Matrix is not square.");
83 unsigned int size = matrix.n_rows;
86 arma::mat nominator_matrix(size, size),
87 denominator_matrix(size, size);
89 nominator_matrix.fill(0);
90 denominator_matrix.fill(0);
101 matrix = nominator_matrix * inv(denominator_matrix);
105 unsigned int denominator_degree,
112 for(
unsigned int i = 1; i < factorials.size(); i++)
113 factorials[i] = factorials[i-1]*i;
117 for(
int j = nominator_degree; j >= 0; j--)
120 (double)(factorials[nominator_degree + denominator_degree - j] * factorials[nominator_degree])
121 / (factorials[nominator_degree + denominator_degree] * factorials[j] * factorials[nominator_degree - j]);
124 for(
int i = denominator_degree; i >= 0; i--)
126 if(i % 2 == 0) sign = 1;
else sign = -1;
127 denominator_coefs[i] = sign *
128 (double)(factorials[nominator_degree + denominator_degree - i] * factorials[denominator_degree])
129 / (factorials[nominator_degree + denominator_degree] * factorials[i] * factorials[denominator_degree - i]);
134 const arma::mat& input_matrix,
137 arma::mat identity = arma::eye(input_matrix.n_rows, input_matrix.n_cols);
140 for(
int i = coefs.size()-1; i >= 0; i--)
142 polynomial_matrix = coefs[i] * identity + (polynomial_matrix * input_matrix);
This class implements the Pade approximation of exponential function.
arma::mat system_matrix_
the square matrix of ODE system
void approximate_matrix(arma::mat &matrix)
int nominator_degree_
Degree of the polynomial in the nominator.
void compute_exp_coefs(unsigned int nominator_degree, unsigned int denominator_degree, std::vector< double > &nominator_coefs, std::vector< double > &denominator_coefs)
Evaluates nominator and denominator coeficients of PadeApproximant for exponencial function...
void update_solution(arma::vec &init_vector, arma::vec &output_vec) override
Updates solution of the ODEs system.
int denominator_degree_
Degree of the polynomial in the denominator.
Global macros to enhance readability and debugging, general constants.
static Input::Type::Abstract & get_input_type()
PadeApproximant()
Hide default constructor.
static const Input::Type::Record & get_input_type()
#define START_TIMER(tag)
Starts a timer with specified tag.
static const int registrar
Registrar of class to factory.
bool step_changed_
flag is true if the step has been changed
void evaluate_matrix_polynomial(arma::mat &polynomial_matrix, const arma::mat &input_matrix, const std::vector< double > &coefs)
Evaluates the matrix polynomial by Horner scheme.
~PadeApproximant(void)
Destructor.
double step_
the step of the numerical method
arma::mat solution_matrix_
Solution matrix .
#define FLOW123D_FORCE_LINK_IN_CHILD(x)