15#ifndef B2NUMERICAL_DIFFERENTIATION_H_
16#define B2NUMERICAL_DIFFERENTIATION_H_
52template <
typename FUNCTION,
typename T,
typename T1>
54 FUNCTION& f,
const double x, std::vector<T>& res,
int derivative_order = 1,
55 int approximation_order = 2,
int first_nonzero_derivative_order = 0,
double h = 0);
69template <
typename FUNCTION,
typename T,
typename T1>
71 FUNCTION& f,
const double x, std::vector<T>& res,
int derivative_order = 1,
72 int approximation_order = 2,
int first_nonzero_derivative_order = 0,
double h = 0);
78template <
typename FUNCTION,
typename T,
typename T1>
80 FUNCTION& f,
const double x, std::vector<T>& res,
int derivative_order,
81 int approximation_order,
int first_nonzero_derivative_order,
double h) {
82 std::vector<std::vector<double> > a(res.size());
83 for (
unsigned int i = 0; i != res.size(); ++i) {
85 derivative_order + i, first_nonzero_derivative_order, approximation_order, a[i]);
90 const double inv_h = 1 / h;
91 const double inv_h_l = std::pow(inv_h, derivative_order);
92 for (
unsigned int j = 1; j <= a.back().size() - 1; ++j) {
95 bool b_r1_m_r2 =
false;
96 bool b_r1_p_r2 =
false;
97 double inv_h_li = inv_h_l;
98 for (
unsigned int i = 0; i != res.size(); ++i, inv_h_li *= inv_h) {
99 if (j >= a[i].size()) {
continue; }
100 if ((derivative_order + i) % 2 == 0) {
105 res[i] += (inv_h_li * a[i][j]) * r1_p_r2;
111 res[i] += (inv_h_li * a[i][j]) * r1_m_r2;
116 double inv_h_li = inv_h_l;
117 for (
unsigned int i = 0; i != res.size(); ++i, inv_h_li *= inv_h) {
118 if (a[i].empty()) {
continue; }
125 res[i] += (inv_h_li * a[i][0]) * r1;
131template <
typename FUNCTION,
typename T,
typename T1>
133 FUNCTION& f,
const double x, std::vector<T>& res,
int derivative_order,
134 int approximation_order,
int first_nonzero_derivative_order,
double h) {
135 std::vector<std::vector<double> > a(res.size());
136 for (
unsigned int i = 0; i != res.size(); ++i) {
138 derivative_order + i, first_nonzero_derivative_order, approximation_order, a[i]);
141 derivative_order + res.size() + approximation_order - first_nonzero_derivative_order;
143 const double inv_h = 1 / h;
144 const double inv_h_l = std::pow(inv_h, derivative_order);
145 for (
int j = 0; j <= max_m; ++j) {
147 double inv_h_li = inv_h_l;
148 for (
unsigned int i = std::max(0,
int(res.size()) + j - 1 - max_m); i != res.size();
149 ++i, inv_h_li *= inv_h) {
155 res[i] += (inv_h_li * a[i][j]) * r;
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32
void forward_numerical_differentiation(FUNCTION &f, const double x, std::vector< T > &res, int derivative_order=1, int approximation_order=2, int first_nonzero_derivative_order=0, double h=0)
Definition b2numerical_differentiation.H:132
void get_central_coefficient(int l, int z, int p, std::vector< double > &a)
Definition b2numerical_differentiation.C:1996
void central_numerical_differentiation(FUNCTION &f, const double x, std::vector< T > &res, int derivative_order=1, int approximation_order=2, int first_nonzero_derivative_order=0, double h=0)
Definition b2numerical_differentiation.H:79
void get_forward_coefficient(int l, int z, int p, std::vector< double > &a)
Definition b2numerical_differentiation.C:1982