This commit is contained in:
Thomas Capricelli 2009-08-25 14:03:30 +02:00
parent d880e6f774
commit a736378331
3 changed files with 8 additions and 10 deletions

View File

@ -5,12 +5,13 @@ class HybridNonLinearSolverNumericalDiff
public: public:
HybridNonLinearSolverNumericalDiff(const FunctorType &_functor) HybridNonLinearSolverNumericalDiff(const FunctorType &_functor)
: functor(_functor) {} : functor(_functor) {}
int solve( int solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec, Matrix< Scalar, Dynamic, 1 > &fvec,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
Scalar tol = ei_sqrt(epsilon<Scalar>()) Scalar tol = ei_sqrt(epsilon<Scalar>())
); );
int solve( int solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec, Matrix< Scalar, Dynamic, 1 > &fvec,
@ -39,17 +40,17 @@ template<typename FunctorType, typename Scalar>
int HybridNonLinearSolverNumericalDiff<FunctorType,Scalar>::solve( int HybridNonLinearSolverNumericalDiff<FunctorType,Scalar>::solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec, Matrix< Scalar, Dynamic, 1 > &fvec,
Matrix< Scalar, Dynamic, Dynamic > &fjac,
Scalar tol Scalar tol
) )
{ {
const int n = x.size(); const int n = x.size();
int info, nfev=0; int info, nfev=0;
Matrix< Scalar, Dynamic, Dynamic > fjac;
Matrix< Scalar, Dynamic, 1> R, qtf, diag; Matrix< Scalar, Dynamic, 1> R, qtf, diag;
/* check the input parameters for errors. */ /* check the input parameters for errors. */
if (n <= 0 || tol < 0.) { if (n <= 0 || tol < 0.) {
printf("solve bad args : n,tol,..."); printf("HybridNonLinearSolver::solve() bad args : n,tol,...");
return 0; return 0;
} }

View File

@ -1,5 +1,4 @@
template<typename FunctorType, typename Scalar> template<typename FunctorType, typename Scalar>
class HybridNonLinearSolver class HybridNonLinearSolver
{ {
@ -7,19 +6,16 @@ public:
HybridNonLinearSolver(const FunctorType &_functor) HybridNonLinearSolver(const FunctorType &_functor)
: functor(_functor) {} : functor(_functor) {}
int solve( int solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec, Matrix< Scalar, Dynamic, 1 > &fvec,
Matrix< Scalar, Dynamic, Dynamic > &fjac, Matrix< Scalar, Dynamic, Dynamic > &fjac,
Scalar tol = ei_sqrt(epsilon<Scalar>()) Scalar tol = ei_sqrt(epsilon<Scalar>())
); );
int solve( int solve(
Matrix< Scalar, Dynamic, 1 > &x, Matrix< Scalar, Dynamic, 1 > &x,
Matrix< Scalar, Dynamic, 1 > &fvec, Matrix< Scalar, Dynamic, 1 > &fvec,
int &nfev, int &nfev, int &njev,
int &njev,
Matrix< Scalar, Dynamic, Dynamic > &fjac, Matrix< Scalar, Dynamic, Dynamic > &fjac,
Matrix< Scalar, Dynamic, 1 > &R, Matrix< Scalar, Dynamic, 1 > &R,
Matrix< Scalar, Dynamic, 1 > &qtf, Matrix< Scalar, Dynamic, 1 > &qtf,
@ -51,7 +47,7 @@ int HybridNonLinearSolver<FunctorType,Scalar>::solve(
/* check the input parameters for errors. */ /* check the input parameters for errors. */
if (n <= 0 || tol < 0.) { if (n <= 0 || tol < 0.) {
printf("ei_hybrd1 bad args : n,tol,..."); printf("HybridNonLinearSolver::solve() bad args : n,tol,...");
return 0; return 0;
} }

View File

@ -351,6 +351,7 @@ void testHybrd1()
{ {
int n=9, info; int n=9, info;
VectorXd x(n), fvec(n); VectorXd x(n), fvec(n);
MatrixXd fjac;
/* the following starting values provide a rough solution. */ /* the following starting values provide a rough solution. */
x.setConstant(n, -1.); x.setConstant(n, -1.);
@ -358,7 +359,7 @@ void testHybrd1()
// do the computation // do the computation
hybrd_functor functor; hybrd_functor functor;
HybridNonLinearSolverNumericalDiff <hybrd_functor,double> solver(functor); HybridNonLinearSolverNumericalDiff <hybrd_functor,double> solver(functor);
info = solver.solve(x, fvec); info = solver.solve(x, fvec, fjac);
// check return value // check return value
VERIFY( 1 == info); VERIFY( 1 == info);