Class deriv_eqi (o2scl)¶
-
template<class func_t = funct, class vec_t = boost::numeric::ublas::vector<double>>
class 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.
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}\]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.
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
funcw.r.t. x.
-
inline virtual int deriv2_err(double x, func_t &func, double &dfdx, double &err)¶
Calculate the second derivative of
funcw.r.t. x.
-
inline virtual int deriv3_err(double x, func_t &func, double &dfdx, double &err)¶
Calculate the third derivative of
funcw.r.t. x.
-
inline double deriv_vector(double x, double x0, double dx, size_t nx, const vec_t &y)¶
Calculate the derivative at
xgiven an array.This calculates the derivative at
xgiven a function specified in an arrayyof sizenxwith equally spaced abscissas. The first abscissa should be given asx0and the distance between adjacent abscissas should be given asdx. The valuexneed 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
xgiven an array.This calculates the second derivative at
xgiven a function specified in an arrayyof sizenxwith equally spaced abscissas. The first abscissa should be given asx0and the distance between adjacent abscissas should be given asdx. The valuexneed 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
xgiven an array.This calculates the third derivative at
xgiven a function specified in an arrayyof sizenxwith equally spaced abscissas. The first abscissa should be given asx0and the distance between adjacent abscissas should be given asdx. The valuexneed 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
funcw.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.