aboutsummaryrefslogtreecommitdiffhomepage
path: root/unsupported/Eigen/src/NonLinear/fdjac2.h
blob: bc3a821067e6b52c999bb604eb10b579694336d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

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,
        Matrix< Scalar, Dynamic, 1 >  &wa)
{
    /* 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)));

    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.f(x, wa);
        if (iflag < 0)
            return iflag;
        x[j] = temp;
        fjac.col(j) = (wa-fvec)/h;
    }
    return iflag;
}