eigenize lmder + some other small fixes

This commit is contained in:
Thomas Capricelli
2009-08-09 05:07:59 +02:00
parent a6625f22d4
commit 50c192961c
2 changed files with 129 additions and 91 deletions

View File

@@ -36,6 +36,7 @@ int ei_hybrd1(
{
int lwa = (x.size()*(3*x.size()+13))/2;
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > wa(lwa);
fvec.resize(x.size());
return hybrd1(Functor::f, 0, x.size(), x.data(), fvec.data(), tol, wa.data(), lwa);
}
@@ -44,14 +45,16 @@ template<typename Functor, typename Scalar>
int ei_lmder1(
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > &x,
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > &fvec,
VectorXi &ipvt,
Scalar tol = Eigen::ei_sqrt(Eigen::machine_epsilon<Scalar>())
)
{
int lwa = 5*x.size()+fvec.size();
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > wa(lwa);
VectorXi ipvt(x.size());
int ldfjac = fvec.size();
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > wa(lwa);
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > fjac(ldfjac, x.size());
ipvt.resize(x.size());
return lmder1 (
Functor::f, 0,
fvec.size(), x.size(), x.data(), fvec.data(),
@@ -62,5 +65,50 @@ int ei_lmder1(
);
}
template<typename Functor, typename Scalar>
int ei_lmder(
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > &x,
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > &fvec,
int &nfev,
int &njev,
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > &fjac,
VectorXi &ipvt,
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > &wa1,
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > &diag,
int mode=1,
double factor = 100.,
int maxfev = 400,
Scalar ftol = Eigen::ei_sqrt(Eigen::machine_epsilon<Scalar>()),
Scalar xtol = Eigen::ei_sqrt(Eigen::machine_epsilon<Scalar>()),
Scalar gtol = Scalar(0.),
int nprint=0
)
{
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 >
qtf(x.size()),
wa2(x.size()), wa3(x.size()),
wa4(fvec.size());
int ldfjac = fvec.size();
ipvt.resize(x.size());
wa1.resize(x.size());
fjac.resize(ldfjac, x.size());
diag.resize(x.size());
return lmder (
Functor::f, 0,
fvec.size(), x.size(), x.data(), fvec.data(),
fjac.data() , ldfjac,
ftol, xtol, gtol,
maxfev,
diag.data(), mode,
factor,
nprint,
&nfev, &njev,
ipvt.data(),
qtf.data(),
wa1.data(), wa2.data(), wa3.data(), wa4.data()
);
}
#endif // EIGEN_NONLINEAR_MATHFUNCTIONS_H