porting hybrj1 to eigen

This commit is contained in:
Thomas Capricelli 2009-08-20 22:41:56 +02:00
parent 6027c4bedf
commit b423e640a6
3 changed files with 28 additions and 77 deletions

View File

@ -132,13 +132,13 @@ Scalar ei_enorm ( int n, const Scalar *x ){
#include "src/NonLinear/lmstr.h" #include "src/NonLinear/lmstr.h"
#include "src/NonLinear/lmdif1.h" #include "src/NonLinear/lmdif1.h"
#include "src/NonLinear/lmdif.h" #include "src/NonLinear/lmdif.h"
#include "src/NonLinear/hybrj1.h"
#include "src/NonLinear/hybrj.h" #include "src/NonLinear/hybrj.h"
#include "src/NonLinear/chkder.h" #include "src/NonLinear/chkder.h"
#include "src/NonLinear/MathFunctions.h" #include "src/NonLinear/MathFunctions.h"
#include "src/NonLinear/lmder1.h" #include "src/NonLinear/lmder1.h"
#include "src/NonLinear/lmstr1.h" #include "src/NonLinear/lmstr1.h"
#include "src/NonLinear/hybrd1.h" #include "src/NonLinear/hybrd1.h"
#include "src/NonLinear/hybrj1.h"
//@} //@}

View File

@ -74,25 +74,6 @@ int ei_hybrd(
} }
template<typename Functor, typename Scalar>
int ei_hybrj1(
Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
Scalar tol = ei_sqrt(epsilon<Scalar>())
)
{
int n = x.size();
int lwa = (n*(3*n+13))/2;
Matrix< Scalar, Dynamic, 1 > wa(lwa);
int ldfjac = n;
fvec.resize(n);
fjac.resize(ldfjac, n);
return hybrj1_template<Scalar>(Functor::f, 0, n, x.data(), fvec.data(), fjac.data(), ldfjac, tol, wa.data(), lwa);
}
template<typename Functor, typename Scalar> template<typename Functor, typename Scalar>
int ei_hybrj( int ei_hybrj(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,

View File

@ -1,63 +1,33 @@
template<typename Scalar> template<typename Functor, typename Scalar>
int hybrj1_template(minpack_funcder_nn fcn, void *p, int n, Scalar *x, Scalar * int ei_hybrj1(
fvec, Scalar *fjac, int ldfjac, Scalar tol, Matrix< Scalar, Dynamic, 1 > &x,
Scalar *wa, int lwa) Matrix< Scalar, Dynamic, 1 > &fvec,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
Scalar tol = ei_sqrt(epsilon<Scalar>())
)
{ {
/* Initialized data */ const int n = x.size();
int info, nfev, njev;
Matrix< Scalar, Dynamic, 1> R, qtf, diag;
const Scalar factor = 100.; /* check the input parameters for errors. */
if (n <= 0 || tol < 0.) {
/* System generated locals */ printf("ei_hybrd1 bad args : n,tol,...");
int fjac_dim1, fjac_offset, i__1; return 0;
/* Local variables */
int j, lr, mode, nfev, njev;
Scalar xtol;
int maxfev, nprint;
int info;
/* Parameter adjustments */
--fvec;
--x;
fjac_dim1 = ldfjac;
fjac_offset = 1 + fjac_dim1 * 1;
fjac -= fjac_offset;
--wa;
/* Function Body */
info = 0;
/* check the input parameters for errors. */
if (n <= 0 || ldfjac < n || tol < 0. || lwa < n * (n + 13) / 2) {
/* goto L20; */
return info;
} }
/* call hybrj. */ diag.setConstant(n, 1.);
info = ei_hybrj<Functor,Scalar>(
maxfev = (n + 1) * 100; x, fvec,
xtol = tol; nfev, njev,
mode = 2; fjac,
i__1 = n; R, qtf, diag,
for (j = 1; j <= i__1; ++j) { 2,
wa[j] = 1.; (n+1)*100,
/* L10: */ 100.,
} tol
nprint = 0; );
lr = n * (n + 1) / 2; return (info==5)?4:info;
info = hybrj(fcn, p, n, &x[1], &fvec[1], &fjac[fjac_offset], ldfjac, xtol, }
maxfev, &wa[1], mode, factor, nprint, &nfev, &njev, &wa[
n * 6 + 1], lr, &wa[n + 1], &wa[(n << 1) + 1], &wa[n * 3 + 1],
&wa[(n << 2) + 1], &wa[n * 5 + 1]);
if (info == 5) {
info = 4;
}
/* L20: */
return info;
/* last card of subroutine hybrj1. */
} /* hybrj1_ */