2 #define chkder_log10e 0.43429448190325182765
3 #define chkder_factor 100.
9 template<
typename Scalar>
11 const Matrix< Scalar, Dynamic, 1 > &x,
12 const Matrix< Scalar, Dynamic, 1 > &fvec,
13 const Matrix< Scalar, Dynamic, Dynamic > &fjac,
14 Matrix< Scalar, Dynamic, 1 > &xp,
15 const Matrix< Scalar, Dynamic, 1 > &fvecp,
17 Matrix< Scalar, Dynamic, 1 > &err
20 typedef DenseIndex Index;
22 const Scalar eps =
sqrt(NumTraits<Scalar>::epsilon());
23 const Scalar epsf = chkder_factor * NumTraits<Scalar>::epsilon();
24 const Scalar epslog = chkder_log10e *
log(eps);
27 const Index m = fvec.size(), n = x.size();
32 for (Index j = 0; j < n; ++j) {
33 temp = eps *
abs(x[j]);
42 for (Index j = 0; j < n; ++j) {
46 err += temp * fjac.col(j);
48 for (Index i = 0; i < m; ++i) {
50 if (fvec[i] != 0. && fvecp[i] != 0. &&
abs(fvecp[i] - fvec[i]) >= epsf *
abs(fvec[i]))
51 temp = eps *
abs((fvecp[i] - fvec[i]) / eps - err[i]) / (
abs(fvec[i]) +
abs(fvecp[i]));
53 if (temp > NumTraits<Scalar>::epsilon() && temp < eps)
54 err[i] = (chkder_log10e *
log(temp) - epslog) / epslog;