Class deriv_eqi (o2scl)¶
-
template<class func_t = funct, class vec_t = boost::numeric::ublas::vector<double>>
class o2scl::deriv_eqi : public o2scl::deriv_base<funct>¶ Derivatives for equally-spaced abscissas.
This is an implementation of the formulas for equally-spaced abscissas as indicated below. The level of approximation is specified in set_npoints(). The value of \( p \times h \) can be specified in
xoff
(default is zero).- Idea for Future:
Finish the second and third derivative formulas.
Note
Uncertainties are not computed and the code for second and third derivatives is unfinished.
Note
The derivatives given, for example, from the five-point formula can sometimes be more accurate than computing the derivative from the interpolation class. This is especially true near the boundaries of the interpolated region.
Two-point formula (note that this is independent of p).
\[ f^{\prime}(x_0+p h)=\frac{1}{h}\left[ f_{1}-f_{0} \right] \]Three-point formula from Abramowitz and Stegun\[ f^{\prime}(x_0+p h)=\frac{1}{h}\left[ \frac{2p-1}{2}f_{-1}-2 p f_{0}+\frac{2p+1}{2}f_{1}\right] \]Four-point formula from Abramowitz and Stegun\[ f^{\prime}(x_0+p h)=\frac{1}{h}\left[ -\frac{3 p^2-6 p+2}{6}f_{-1} +\frac{3 p^2-4 p -1}{2}f_{0} -\frac{3 p^2-2 p-2}{2}f_{1} +\frac{3 p^2-1}{6}f_{2} \right] \]Five-point formula from Abramowitz and Stegun\[\begin{split}\begin{eqnarray*} f^{\prime}(x_0+p h)&=&\frac{1}{h}\left[ \frac{2 p^3-3 p^2-p+1}{12}f_{-2} -\frac{4 p^3-3p^2-8p+4}{6}f_{-1} \right. \\ && \left. +\frac{2p^3-5p}{2}f_{0} -\frac{4p^3+3p^2-8p-4}{6}f_{1} \right. \\ && \left. +\frac{2p^3+3p^2-p-1}{12}f_{2} \right] \end{eqnarray*}\end{split}\]The relations above can be confined to give formulas for second derivative formulas: Three-point formula
\[ f^{\prime}(x_0+p h)=\frac{1}{h^2} \left[f_{-1}-2 f_0+f_1\right] \]Four-point formula:\[ f^{\prime}(x_0+p h)=\frac{1}{2 h^2} \left[\left(1-2p\right)f_{-1}-\left(1-6p\right)f_0 -\left(1+6p\right)f_1+\left(1+2p\right)f_2\right] \]Five-point formula:\[ f^{\prime}(x_0+p h)=\frac{1}{4 h^2} \left[\left(1-2p\right)^2f_{-2} +\left(8p-16 p^2\right)f_{-1} -\left(2-24 p^2\right)f_0 -\left(8p+16p^2\right)f_1 +\left(1+2p\right)^2 f_2\right] \]Six-point formula:\[\begin{split}\begin{eqnarray*} f^{\prime}(x_0+p h)&=&\frac{1}{12 h^2}\left[ \left(2-10p+15 p^2-6p^3\right)f_{-2} +\left(3+14p-57p^2+30p^3\right)f_{-1} \right. \\ && \left. +\left(-8+20p+78 p^2-60p^3\right)f_0 +\left(-2-44p-42p^2+60p^3\right)f_1 \right. \\ && \left. +\left(6+22p+3p^2-30p^3\right)f_2 +\left(-1-2p+3p^2+6p^3\right)f_3 \right] \end{eqnarray*}\end{split}\]Seven-point formula:\[\begin{split}\begin{eqnarray*} f^{\prime}(x_0+p h)&=&\frac{1}{36 h^2}\left[ \left(4-24p+48p^2-36p^3+9p^4\right)f_{-3} +\left(12+12p-162p^2+180p^3-54p^4\right)f_{-2} \right. \\ && \left. +\left(-15+120p+162p^2-360p^3+135p^4\right)f_{-1} -4\left(8+48p-3p^2-90p^3+45p^4\right)f_0 \right. \\ && \left. +3\left(14+32p-36p^2-60p^3+45p^4\right)f_1 +\left(-12-12p+54p^2+36p^3-54p^4\right)f_2 \right. \\ && \left. +\left(1-6p^2+9p^4\right)f_3 \right] \end{eqnarray*}\end{split}\]Public Functions
-
inline deriv_eqi()¶
-
inline int set_npoints(int npoints)¶
Set the number of points to use for first derivatives (default 5)
Acceptable values are 2-5 (see above).
-
inline int set_npoints2(int npoints)¶
Set the number of points to use for second derivatives (default 5)
Acceptable values are 3-5 (see above).
-
inline virtual int deriv_err(double x, func_t &func, double &dfdx, double &err)¶
Calculate the first derivative of
func
w.r.t. x.
-
inline virtual int deriv2_err(double x, func_t &func, double &dfdx, double &err)¶
Calculate the second derivative of
func
w.r.t. x.
-
inline virtual int deriv3_err(double x, func_t &func, double &dfdx, double &err)¶
Calculate the third derivative of
func
w.r.t. x.
-
inline double deriv_vector(double x, double x0, double dx, size_t nx, const vec_t &y)¶
Calculate the derivative at
x
given an array.This calculates the derivative at
x
given a function specified in an arrayy
of sizenx
with equally spaced abscissas. The first abscissa should be given asx0
and the distance between adjacent abscissas should be given asdx
. The valuex
need not be one of the abscissas (i.e. it can lie in between an interval). The appropriate offset is calculated automatically.
-
inline double deriv2_vector(double x, double x0, double dx, size_t nx, const vec_t &y)¶
Calculate the second derivative at
x
given an array.This calculates the second derivative at
x
given a function specified in an arrayy
of sizenx
with equally spaced abscissas. The first abscissa should be given asx0
and the distance between adjacent abscissas should be given asdx
. The valuex
need not be one of the abscissas (i.e. it can lie in between an interval). The appropriate offset is calculated automatically.
-
inline double deriv3_vector(double x, double x0, double dx, size_t nx, const vec_t &y)¶
Calculate the third derivative at
x
given an array.This calculates the third derivative at
x
given a function specified in an arrayy
of sizenx
with equally spaced abscissas. The first abscissa should be given asx0
and the distance between adjacent abscissas should be given asdx
. The valuex
need not be one of the abscissas (i.e. it can lie in between an interval). The appropriate offset is calculated automatically.
-
inline int deriv_vector(size_t nv, double dx, const vec_t &y, vec_t &dydx)¶
Calculate the derivative of an entire array.
Right now this uses np=5.
Todo
In deriv_eqi::deriv_vector(): generalize to other values of npoints.
-
inline virtual const char *type()¶
Return string denoting type (“deriv_eqi”)
Protected Functions
-
inline virtual int deriv_err_int(double x, funct &func, double &dfdx, double &err)¶
Calculate the first derivative of
func
w.r.t. x and the uncertainty.This function doesn’t do anything, and isn’t required for this class since it computes higher-order derivatives directly.
-
inline double deriv_vector3(double x, double x0, double dx, size_t nx, const vec_t &y, size_t ix)¶
Three-point first derivative for arrays.
-
inline double deriv_vector4(double x, double x0, double dx, size_t nx, const vec_t &y, size_t ix)¶
Four-point first derivative for arrays.
Protected Attributes
-
double (deriv_eqi::* cp)(double x, double p, func_t &func)¶
Pointer to the first derivative function.
-
double (deriv_eqi::* cap)(double x, double x0, double dx, size_t nx, const vec_t &y, size_t ix)¶
Pointer to the first derivative for arrays function.
-
double (deriv_eqi::* c2p)(double x, double p, func_t &func)¶
Pointer to the second derivative function.
-
double (deriv_eqi::* c2ap)(double x, double x0, double dx, size_t nx, const vec_t &y, size_t ix)¶
Pointer to the second derivative for arrays function.