28 #ifndef EIGEN_NUMERICAL_DIFF_H
29 #define EIGEN_NUMERICAL_DIFF_H
33 enum NumericalDiffMode {
50 template<
typename _Functor, NumericalDiffMode mode=Forward>
54 typedef _Functor Functor;
55 typedef typename Functor::Scalar Scalar;
56 typedef typename Functor::InputType InputType;
57 typedef typename Functor::ValueType ValueType;
58 typedef typename Functor::JacobianType JacobianType;
60 NumericalDiff(Scalar _epsfcn=0.) : Functor(), epsfcn(_epsfcn) {}
61 NumericalDiff(
const Functor& f, Scalar _epsfcn=0.) : Functor(f), epsfcn(_epsfcn) {}
66 template<
typename T0,
typename T1>
67 NumericalDiff(
const T0& a0,
const T1& a1) : Functor(a0, a1), epsfcn(0) {}
68 template<
typename T0,
typename T1,
typename T2>
69 NumericalDiff(
const T0& a0,
const T1& a1,
const T1& a2) : Functor(a0, a1, a2), epsfcn(0) {}
72 InputsAtCompileTime = Functor::InputsAtCompileTime,
73 ValuesAtCompileTime = Functor::ValuesAtCompileTime
79 int df(
const InputType& _x, JacobianType &jac)
const
84 const typename InputType::Index n = _x.size();
85 const Scalar eps = internal::sqrt(((std::max)(epsfcn,NumTraits<Scalar>::epsilon() )));
89 val1.resize(Functor::values());
90 val2.resize(Functor::values());
96 Functor::operator()(x, val1); nfev++;
106 for (
int j = 0; j < n; ++j) {
107 h = eps * internal::abs(x[j]);
114 Functor::operator()(x, val2);
117 jac.col(j) = (val2-val1)/h;
121 Functor::operator()(x, val2); nfev++;
123 Functor::operator()(x, val1); nfev++;
125 jac.col(j) = (val2-val1)/(2*h);
142 #endif // EIGEN_NUMERICAL_DIFF_H