| |
| template<typename FunctorType, typename Scalar> |
| int ei_fdjac2( |
| const FunctorType &Functor, |
| Matrix< Scalar, Dynamic, 1 > &x, |
| Matrix< Scalar, Dynamic, 1 > &fvec, |
| Matrix< Scalar, Dynamic, Dynamic > &fjac, |
| Scalar epsfcn) |
| { |
| /* Local variables */ |
| Scalar h, temp; |
| int iflag; |
| |
| /* Function Body */ |
| const Scalar epsmch = epsilon<Scalar>(); |
| const int n = x.size(); |
| const Scalar eps = ei_sqrt((std::max(epsfcn,epsmch))); |
| Matrix< Scalar, Dynamic, 1 > wa(fvec.size()); |
| |
| for (int j = 0; j < n; ++j) { |
| temp = x[j]; |
| h = eps * ei_abs(temp); |
| if (h == 0.) { |
| h = eps; |
| } |
| x[j] = temp + h; |
| iflag = Functor(x, wa); |
| if (iflag < 0) |
| return iflag; |
| x[j] = temp; |
| fjac.col(j) = (wa-fvec)/h; |
| } |
| return iflag; |
| } |
| |