13 #ifndef EIGEN_NUMERICAL_DIFF_H
14 #define EIGEN_NUMERICAL_DIFF_H
18 enum NumericalDiffMode {
35 template<
typename _Functor, NumericalDiffMode mode=Forward>
39 typedef _Functor Functor;
40 typedef typename Functor::Scalar Scalar;
41 typedef typename Functor::InputType InputType;
42 typedef typename Functor::ValueType ValueType;
43 typedef typename Functor::JacobianType JacobianType;
45 NumericalDiff(Scalar _epsfcn=0.) : Functor(), epsfcn(_epsfcn) {}
46 NumericalDiff(
const Functor& f, Scalar _epsfcn=0.) : Functor(f), epsfcn(_epsfcn) {}
51 template<
typename T0,
typename T1>
52 NumericalDiff(
const T0& a0,
const T1& a1) : Functor(a0, a1), epsfcn(0) {}
53 template<
typename T0,
typename T1,
typename T2>
54 NumericalDiff(
const T0& a0,
const T1& a1,
const T2& a2) : Functor(a0, a1, a2), epsfcn(0) {}
57 InputsAtCompileTime = Functor::InputsAtCompileTime,
58 ValuesAtCompileTime = Functor::ValuesAtCompileTime
64 int df(
const InputType& _x, JacobianType &jac)
const
69 const typename InputType::Index n = _x.size();
74 val1.resize(Functor::values());
75 val2.resize(Functor::values());
81 Functor::operator()(x, val1); nfev++;
91 for (
int j = 0; j < n; ++j) {
92 h = eps * internal::abs(x[j]);
99 Functor::operator()(x, val2);
102 jac.col(j) = (val2-val1)/h;
106 Functor::operator()(x, val2); nfev++;
108 Functor::operator()(x, val1); nfev++;
110 jac.col(j) = (val2-val1)/(2*h);
127 #endif // EIGEN_NUMERICAL_DIFF_H