levenberg_marquardt.cpp File Reference
#include <stdio.h>
#include "main.h"
#include <unsupported/Eigen/LevenbergMarquardt>
#include <Eigen/src/Core/util/DisableStupidWarnings.h>

Classes

struct  lmder_functor
 
struct  lmdif_functor
 
struct  chwirut2_functor
 
struct  misra1a_functor
 
struct  hahn1_functor
 
struct  misra1d_functor
 
struct  lanczos1_functor
 
struct  rat42_functor
 
struct  MGH10_functor
 
struct  BoxBOD_functor
 
struct  MGH17_functor
 
struct  MGH09_functor
 
struct  Bennett5_functor
 
struct  thurber_functor
 
struct  rat43_functor
 
struct  eckerle4_functor
 

Macros

#define LM_EVAL_COUNT_TOL   2
 

Functions

void testLmder1 ()
 
void testLmder ()
 
void testLmdif1 ()
 
void testLmdif ()
 
void testNistChwirut2 (void)
 
void testNistMisra1a (void)
 
void testNistHahn1 (void)
 
void testNistMisra1d (void)
 
void testNistLanczos1 (void)
 
void testNistRat42 (void)
 
void testNistMGH10 (void)
 
void testNistBoxBOD (void)
 
void testNistMGH17 (void)
 
void testNistMGH09 (void)
 
void testNistBennett5 (void)
 
void testNistThurber (void)
 
void testNistRat43 (void)
 
void testNistEckerle4 (void)
 
 EIGEN_DECLARE_TEST (levenberg_marquardt)
 

Macro Definition Documentation

◆ LM_EVAL_COUNT_TOL

#define LM_EVAL_COUNT_TOL   2

Function Documentation

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( levenberg_marquardt  )
1527  {
1528  // Tests using the examples provided by (c)minpack
1532  // CALL_SUBTEST(testLmstr1());
1533  // CALL_SUBTEST(testLmstr());
1535 
1536  // NIST tests, level of difficulty = "Lower"
1539 
1540  // NIST tests, level of difficulty = "Average"
1545 
1546  // // NIST tests, level of difficulty = "Higher"
1550  // CALL_SUBTEST(testNistMGH09());
1555 }
void testNistEckerle4(void)
Definition: levenberg_marquardt.cpp:1480
void testLmder1()
Definition: levenberg_marquardt.cpp:59
void testLmdif()
Definition: levenberg_marquardt.cpp:183
void testNistMGH10(void)
Definition: levenberg_marquardt.cpp:816
void testLmder()
Definition: levenberg_marquardt.cpp:86
void testNistBoxBOD(void)
Definition: levenberg_marquardt.cpp:905
void testNistRat43(void)
Definition: levenberg_marquardt.cpp:1390
void testNistBennett5(void)
Definition: levenberg_marquardt.cpp:1205
void testNistHahn1(void)
Definition: levenberg_marquardt.cpp:482
void testNistThurber(void)
Definition: levenberg_marquardt.cpp:1300
void testLmdif1()
Definition: levenberg_marquardt.cpp:154
void testNistMisra1a(void)
Definition: levenberg_marquardt.cpp:353
void testNistRat42(void)
Definition: levenberg_marquardt.cpp:737
void testNistMisra1d(void)
Definition: levenberg_marquardt.cpp:567
void testNistChwirut2(void)
Definition: levenberg_marquardt.cpp:274
void testNistMGH17(void)
Definition: levenberg_marquardt.cpp:999
void testNistLanczos1(void)
Definition: levenberg_marquardt.cpp:652
#define CALL_SUBTEST(FUNC)
Definition: main.h:382

References CALL_SUBTEST, testLmder(), testLmder1(), testLmdif(), testLmdif1(), testNistBennett5(), testNistBoxBOD(), testNistChwirut2(), testNistEckerle4(), testNistHahn1(), testNistLanczos1(), testNistMGH10(), testNistMGH17(), testNistMisra1a(), testNistMisra1d(), testNistRat42(), testNistRat43(), and testNistThurber().

◆ testLmder()

void testLmder ( )
86  {
87  const int m = 15, n = 3;
88  int info;
89  double fnorm, covfac;
90  VectorXd x;
91 
92  /* the following starting values provide a rough fit. */
93  x.setConstant(n, 1.);
94 
95  // do the computation
96  lmder_functor functor;
98  info = lm.minimize(x);
100 
101  // check return values
102  // VERIFY_IS_EQUAL(info, 1);
103  // VERIFY_IS_EQUAL(lm.nfev(), 6);
104  // VERIFY_IS_EQUAL(lm.njev(), 5);
105 
106  // check norm
107  fnorm = lm.fvec().blueNorm();
108  VERIFY_IS_APPROX(fnorm, 0.09063596);
109 
110  // check x
111  VectorXd x_ref(n);
112  x_ref << 0.08241058, 1.133037, 2.343695;
113  VERIFY_IS_APPROX(x, x_ref);
114 
115  // check covariance
116  covfac = fnorm * fnorm / (m - n);
117  internal::covar(lm.matrixR(), lm.permutation().indices()); // TODO : move this as a function of lm
118 
119  MatrixXd cov_ref(n, n);
120  cov_ref << 0.0001531202, 0.002869941, -0.002656662, 0.002869941, 0.09480935, -0.09098995, -0.002656662, -0.09098995,
121  0.08778727;
122 
123  // std::cout << fjac*covfac << std::endl;
124 
125  MatrixXd cov;
126  cov = covfac * lm.matrixR().topLeftCorner<n, n>();
127  VERIFY_IS_APPROX(cov, cov_ref);
128  // TODO: why isn't this allowed ? :
129  // VERIFY_IS_APPROX( covfac*fjac.topLeftCorner<n,n>() , cov_ref);
130 }
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
#define EIGEN_UNUSED_VARIABLE(var)
Definition: Macros.h:966
Performs non linear optimization over a non-linear function, using a variant of the Levenberg Marquar...
Definition: LevenbergMarquardt/LevenbergMarquardt.h:102
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
int * m
Definition: level2_cplx_impl.h:294
int info
Definition: level2_cplx_impl.h:39
void covar(Matrix< Scalar, Dynamic, Dynamic > &r, const VectorXi &ipvt, Scalar tol=std::sqrt(NumTraits< Scalar >::epsilon()))
Definition: LMcovar.h:23
list x
Definition: plotDoE.py:28
Definition: levenberg_marquardt.cpp:27

References Eigen::internal::covar(), EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, Eigen::PermutationMatrix< SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_ >::indices(), info, m, Eigen::LevenbergMarquardt< FunctorType_ >::matrixR(), Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, Eigen::LevenbergMarquardt< FunctorType_ >::permutation, VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testLmder1()

void testLmder1 ( )
59  {
60  int n = 3, info;
61 
62  VectorXd x;
63 
64  /* the following starting values provide a rough fit. */
65  x.setConstant(n, 1.);
66 
67  // do the computation
68  lmder_functor functor;
70  info = lm.lmder1(x);
72  // check return value
73  // VERIFY_IS_EQUAL(info, 1);
74  // VERIFY_IS_EQUAL(lm.nfev(), 6);
75  // VERIFY_IS_EQUAL(lm.njev(), 5);
76 
77  // check norm
78  VERIFY_IS_APPROX(lm.fvec().blueNorm(), 0.09063596);
79 
80  // check x
81  VectorXd x_ref(n);
82  x_ref << 0.08241058, 1.133037, 2.343695;
83  VERIFY_IS_APPROX(x, x_ref);
84 }

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::lmder1(), n, VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testLmdif()

void testLmdif ( )
183  {
184  const int m = 15, n = 3;
185  int info;
186  double fnorm, covfac;
187  VectorXd x(n);
188 
189  /* the following starting values provide a rough fit. */
190  x.setConstant(n, 1.);
191 
192  // do the computation
193  lmdif_functor functor;
194  NumericalDiff<lmdif_functor> numDiff(functor);
196  info = lm.minimize(x);
198 
199  // check return values
200  // VERIFY_IS_EQUAL(info, 1);
201  // VERIFY_IS_EQUAL(lm.nfev(), 26);
202 
203  // check norm
204  fnorm = lm.fvec().blueNorm();
205  VERIFY_IS_APPROX(fnorm, 0.09063596);
206 
207  // check x
208  VectorXd x_ref(n);
209  x_ref << 0.08241058, 1.133037, 2.343695;
210  VERIFY_IS_APPROX(x, x_ref);
211 
212  // check covariance
213  covfac = fnorm * fnorm / (m - n);
214  internal::covar(lm.matrixR(), lm.permutation().indices()); // TODO : move this as a function of lm
215 
216  MatrixXd cov_ref(n, n);
217  cov_ref << 0.0001531202, 0.002869942, -0.002656662, 0.002869942, 0.09480937, -0.09098997, -0.002656662, -0.09098997,
218  0.08778729;
219 
220  // std::cout << fjac*covfac << std::endl;
221 
222  MatrixXd cov;
223  cov = covfac * lm.matrixR().topLeftCorner<n, n>();
224  VERIFY_IS_APPROX(cov, cov_ref);
225  // TODO: why isn't this allowed ? :
226  // VERIFY_IS_APPROX( covfac*fjac.topLeftCorner<n,n>() , cov_ref);
227 }
Definition: NumericalDiff.h:35
Definition: levenberg_marquardt.cpp:132

References Eigen::internal::covar(), EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, Eigen::PermutationMatrix< SizeAtCompileTime, MaxSizeAtCompileTime, StorageIndex_ >::indices(), info, m, Eigen::LevenbergMarquardt< FunctorType_ >::matrixR(), Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, Eigen::LevenbergMarquardt< FunctorType_ >::permutation, VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testLmdif1()

void testLmdif1 ( )
154  {
155  const int n = 3;
156  int info;
157 
158  VectorXd x(n), fvec(15);
159 
160  /* the following starting values provide a rough fit. */
161  x.setConstant(n, 1.);
162 
163  // do the computation
164  lmdif_functor functor;
165  DenseIndex nfev;
168 
169  // check return value
170  // VERIFY_IS_EQUAL(info, 1);
171  // VERIFY_IS_EQUAL(nfev, 26);
172 
173  // check norm
174  functor(x, fvec);
175  VERIFY_IS_APPROX(fvec.blueNorm(), 0.09063596);
176 
177  // check x
178  VectorXd x_ref(n);
179  x_ref << 0.0824106, 1.1330366, 2.3436947;
180  VERIFY_IS_APPROX(x, x_ref);
181 }
EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex
Definition: Meta.h:75

References EIGEN_UNUSED_VARIABLE, info, n, VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistBennett5()

void testNistBennett5 ( void  )
1205  {
1206  const int n = 3;
1207  int info;
1208 
1209  VectorXd x(n);
1210 
1211  /*
1212  * First try
1213  */
1214  x << -2000., 50., 0.8;
1215  // do the computation
1216  Bennett5_functor functor;
1218  lm.setMaxfev(1000);
1219  info = lm.minimize(x);
1221 
1222  // check return value
1223  // VERIFY_IS_EQUAL(info, 1);
1224  // VERIFY_IS_EQUAL(lm.nfev(), 758);
1225  // VERIFY_IS_EQUAL(lm.njev(), 744);
1226  // check norm^2
1227  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.2404744073E-04);
1228  // check x
1229  VERIFY_IS_APPROX(x[0], -2.5235058043E+03);
1230  VERIFY_IS_APPROX(x[1], 4.6736564644E+01);
1231  VERIFY_IS_APPROX(x[2], 9.3218483193E-01);
1232  /*
1233  * Second try
1234  */
1235  x << -1500., 45., 0.85;
1236  // do the computation
1237  lm.resetParameters();
1238  info = lm.minimize(x);
1240 
1241  // check return value
1242  // VERIFY_IS_EQUAL(info, 1);
1243  // VERIFY_IS_EQUAL(lm.nfev(), 203);
1244  // VERIFY_IS_EQUAL(lm.njev(), 192);
1245  // check norm^2
1246  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.2404744073E-04);
1247  // check x
1248  VERIFY_IS_APPROX(x[0], -2523.3007865); // should be -2.5235058043E+03
1249  VERIFY_IS_APPROX(x[1], 46.735705771); // should be 4.6736564644E+01);
1250  VERIFY_IS_APPROX(x[2], 0.93219881891); // should be 9.3218483193E-01);
1251 }
Definition: levenberg_marquardt.cpp:1140

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, Eigen::LevenbergMarquardt< FunctorType_ >::resetParameters(), Eigen::LevenbergMarquardt< FunctorType_ >::setMaxfev(), VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistBoxBOD()

void testNistBoxBOD ( void  )
905  {
906  const int n = 2;
907  int info;
908 
909  VectorXd x(n);
910 
911  /*
912  * First try
913  */
914  x << 1., 1.;
915  // do the computation
916  BoxBOD_functor functor;
918  lm.setFtol(1.E6 * NumTraits<double>::epsilon());
919  lm.setXtol(1.E6 * NumTraits<double>::epsilon());
920  lm.setFactor(10);
921  info = lm.minimize(x);
923 
924  // check norm^2
925  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.1680088766E+03);
926  // check x
927  VERIFY_IS_APPROX(x[0], 2.1380940889E+02);
928  VERIFY_IS_APPROX(x[1], 5.4723748542E-01);
929 
930  // check return value
931  // VERIFY_IS_EQUAL(info, 1);
932  // VERIFY(lm.nfev() < 31); // 31
933  // VERIFY(lm.njev() < 25); // 25
934 
935  /*
936  * Second try
937  */
938  x << 100., 0.75;
939  // do the computation
940  lm.resetParameters();
941  lm.setFtol(NumTraits<double>::epsilon());
942  lm.setXtol(NumTraits<double>::epsilon());
943  info = lm.minimize(x);
945 
946  // check return value
947  // VERIFY_IS_EQUAL(info, 1);
948  // ++g_test_level;
949  // VERIFY_IS_EQUAL(lm.nfev(), 16 );
950  // VERIFY_IS_EQUAL(lm.njev(), 15 );
951  // --g_test_level;
952  VERIFY(lm.nfev() < 16 * LM_EVAL_COUNT_TOL);
953  VERIFY(lm.njev() < 15 * LM_EVAL_COUNT_TOL);
954  // check norm^2
955  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.1680088766E+03);
956  // check x
957  VERIFY_IS_APPROX(x[0], 2.1380940889E+02);
958  VERIFY_IS_APPROX(x[1], 5.4723748542E-01);
959 }
#define LM_EVAL_COUNT_TOL
Definition: levenberg_marquardt.cpp:25
#define VERIFY(a)
Definition: main.h:362
Definition: levenberg_marquardt.cpp:880
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, LM_EVAL_COUNT_TOL, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, Eigen::LevenbergMarquardt< FunctorType_ >::nfev, Eigen::LevenbergMarquardt< FunctorType_ >::njev, Eigen::LevenbergMarquardt< FunctorType_ >::resetParameters(), Eigen::LevenbergMarquardt< FunctorType_ >::setFactor(), Eigen::LevenbergMarquardt< FunctorType_ >::setFtol(), Eigen::LevenbergMarquardt< FunctorType_ >::setXtol(), VERIFY, VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistChwirut2()

void testNistChwirut2 ( void  )
274  {
275  const int n = 3;
277 
278  VectorXd x(n);
279 
280  /*
281  * First try
282  */
283  x << 0.1, 0.01, 0.02;
284  // do the computation
285  chwirut2_functor functor;
287  info = lm.minimize(x);
289 
290  // check return value
291  // VERIFY_IS_EQUAL(info, 1);
292  // VERIFY_IS_EQUAL(lm.nfev(), 10);
293  // VERIFY_IS_EQUAL(lm.njev(), 8);
294  // check norm^2
295  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.1304802941E+02);
296  // check x
297  VERIFY_IS_APPROX(x[0], 1.6657666537E-01);
298  VERIFY_IS_APPROX(x[1], 5.1653291286E-03);
299  VERIFY_IS_APPROX(x[2], 1.2150007096E-02);
300 
301  /*
302  * Second try
303  */
304  x << 0.15, 0.008, 0.010;
305  // do the computation
306  lm.resetParameters();
307  lm.setFtol(1.E6 * NumTraits<double>::epsilon());
308  lm.setXtol(1.E6 * NumTraits<double>::epsilon());
309  info = lm.minimize(x);
311 
312  // check return value
313  // VERIFY_IS_EQUAL(info, 1);
314  // VERIFY_IS_EQUAL(lm.nfev(), 7);
315  // VERIFY_IS_EQUAL(lm.njev(), 6);
316  // check norm^2
317  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.1304802941E+02);
318  // check x
319  VERIFY_IS_APPROX(x[0], 1.6657666537E-01);
320  VERIFY_IS_APPROX(x[1], 5.1653291286E-03);
321  VERIFY_IS_APPROX(x[2], 1.2150007096E-02);
322 }
Status
Definition: LevenbergMarquardt/LevenbergMarquardt.h:27
Definition: levenberg_marquardt.cpp:229

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, Eigen::LevenbergMarquardt< FunctorType_ >::resetParameters(), Eigen::LevenbergMarquardt< FunctorType_ >::setFtol(), Eigen::LevenbergMarquardt< FunctorType_ >::setXtol(), VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistEckerle4()

void testNistEckerle4 ( void  )
1480  {
1481  const int n = 3;
1482  int info;
1483 
1484  VectorXd x(n);
1485 
1486  /*
1487  * First try
1488  */
1489  x << 1., 10., 500.;
1490  // do the computation
1491  eckerle4_functor functor;
1493  info = lm.minimize(x);
1495 
1496  // check return value
1497  // VERIFY_IS_EQUAL(info, 1);
1498  // VERIFY_IS_EQUAL(lm.nfev(), 18);
1499  // VERIFY_IS_EQUAL(lm.njev(), 15);
1500  // check norm^2
1501  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.4635887487E-03);
1502  // check x
1503  VERIFY_IS_APPROX(x[0], 1.5543827178);
1504  VERIFY_IS_APPROX(x[1], 4.0888321754);
1505  VERIFY_IS_APPROX(x[2], 4.5154121844E+02);
1506 
1507  /*
1508  * Second try
1509  */
1510  x << 1.5, 5., 450.;
1511  // do the computation
1512  info = lm.minimize(x);
1514 
1515  // check return value
1516  // VERIFY_IS_EQUAL(info, 1);
1517  // VERIFY_IS_EQUAL(lm.nfev(), 7);
1518  // VERIFY_IS_EQUAL(lm.njev(), 6);
1519  // check norm^2
1520  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.4635887487E-03);
1521  // check x
1522  VERIFY_IS_APPROX(x[0], 1.5543827178);
1523  VERIFY_IS_APPROX(x[1], 4.0888321754);
1524  VERIFY_IS_APPROX(x[2], 4.5154121844E+02);
1525 }
Definition: levenberg_marquardt.cpp:1444

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistHahn1()

void testNistHahn1 ( void  )
482  {
483  const int n = 7;
484  int info;
485 
486  VectorXd x(n);
487 
488  /*
489  * First try
490  */
491  x << 10., -1., .05, -.00001, -.05, .001, -.000001;
492  // do the computation
493  hahn1_functor functor;
495  info = lm.minimize(x);
497 
498  // check return value
499  // VERIFY_IS_EQUAL(info, 1);
500  // VERIFY_IS_EQUAL(lm.nfev(), 11);
501  // VERIFY_IS_EQUAL(lm.njev(), 10);
502  // check norm^2
503  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.5324382854E+00);
504  // check x
505  VERIFY_IS_APPROX(x[0], 1.0776351733E+00);
506  VERIFY_IS_APPROX(x[1], -1.2269296921E-01);
507  VERIFY_IS_APPROX(x[2], 4.0863750610E-03);
508  VERIFY_IS_APPROX(x[3], -1.426264e-06); // shoulde be : -1.4262662514E-06
509  VERIFY_IS_APPROX(x[4], -5.7609940901E-03);
510  VERIFY_IS_APPROX(x[5], 2.4053735503E-04);
511  VERIFY_IS_APPROX(x[6], -1.2314450199E-07);
512 
513  /*
514  * Second try
515  */
516  x << .1, -.1, .005, -.000001, -.005, .0001, -.0000001;
517  // do the computation
518  info = lm.minimize(x);
520 
521  // check return value
522  // VERIFY_IS_EQUAL(info, 1);
523  // VERIFY_IS_EQUAL(lm.nfev(), 11);
524  // VERIFY_IS_EQUAL(lm.njev(), 10);
525  // check norm^2
526  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.5324382854E+00);
527  // check x
528  VERIFY_IS_APPROX(x[0], 1.077640); // should be : 1.0776351733E+00
529  VERIFY_IS_APPROX(x[1], -0.1226933); // should be : -1.2269296921E-01
530  VERIFY_IS_APPROX(x[2], 0.004086383); // should be : 4.0863750610E-03
531  VERIFY_IS_APPROX(x[3], -1.426277e-06); // shoulde be : -1.4262662514E-06
532  VERIFY_IS_APPROX(x[4], -5.7609940901E-03);
533  VERIFY_IS_APPROX(x[5], 0.00024053772); // should be : 2.4053735503E-04
534  VERIFY_IS_APPROX(x[6], -1.231450e-07); // should be : -1.2314450199E-07
535 }
Definition: levenberg_marquardt.cpp:398

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistLanczos1()

void testNistLanczos1 ( void  )
652  {
653  const int n = 6;
655 
656  VectorXd x(n);
657 
658  /*
659  * First try
660  */
661  x << 1.2, 0.3, 5.6, 5.5, 6.5, 7.6;
662  // do the computation
663  lanczos1_functor functor;
665  info = lm.minimize(x);
667 
668  // check return value
669  // VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeErrorTooSmall);
670  // VERIFY_IS_EQUAL(lm.nfev(), 79);
671  // VERIFY_IS_EQUAL(lm.njev(), 72);
672  // check norm^2
673  VERIFY(lm.fvec().squaredNorm() <= 1.44E-25);
674  // check x
675  VERIFY_IS_APPROX(x[0], 9.5100000027E-02);
676  VERIFY_IS_APPROX(x[1], 1.0000000001E+00);
677  VERIFY_IS_APPROX(x[2], 8.6070000013E-01);
678  VERIFY_IS_APPROX(x[3], 3.0000000002E+00);
679  VERIFY_IS_APPROX(x[4], 1.5575999998E+00);
680  VERIFY_IS_APPROX(x[5], 5.0000000001E+00);
681 
682  /*
683  * Second try
684  */
685  x << 0.5, 0.7, 3.6, 4.2, 4., 6.3;
686  // do the computation
687  info = lm.minimize(x);
689 
690  // check return value
691  // VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeErrorTooSmall);
692  // VERIFY_IS_EQUAL(lm.nfev(), 9);
693  // VERIFY_IS_EQUAL(lm.njev(), 8);
694  // check norm^2
695  VERIFY(lm.fvec().squaredNorm() <= 1.44E-25);
696  // check x
697  VERIFY_IS_APPROX(x[0], 9.5100000027E-02);
698  VERIFY_IS_APPROX(x[1], 1.0000000001E+00);
699  VERIFY_IS_APPROX(x[2], 8.6070000013E-01);
700  VERIFY_IS_APPROX(x[3], 3.0000000002E+00);
701  VERIFY_IS_APPROX(x[4], 1.5575999998E+00);
702  VERIFY_IS_APPROX(x[5], 5.0000000001E+00);
703 }
Definition: levenberg_marquardt.cpp:612

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, VERIFY, VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistMGH09()

void testNistMGH09 ( void  )
1089  {
1090  const int n = 4;
1091  int info;
1092 
1093  VectorXd x(n);
1094 
1095  /*
1096  * First try
1097  */
1098  x << 25., 39, 41.5, 39.;
1099  // do the computation
1100  MGH09_functor functor;
1102  lm.setMaxfev(1000);
1103  info = lm.minimize(x);
1105 
1106  // check norm^2
1107  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 3.0750560385E-04);
1108  // check x
1109  VERIFY_IS_APPROX(x[0], 0.1928077089); // should be 1.9280693458E-01
1110  VERIFY_IS_APPROX(x[1], 0.19126423573); // should be 1.9128232873E-01
1111  VERIFY_IS_APPROX(x[2], 0.12305309914); // should be 1.2305650693E-01
1112  VERIFY_IS_APPROX(x[3], 0.13605395375); // should be 1.3606233068E-01
1113  // check return value
1114  // VERIFY_IS_EQUAL(info, 1);
1115  // VERIFY(lm.nfev() < 510 ); // 490
1116  // VERIFY(lm.njev() < 400 ); // 376
1117 
1118  /*
1119  * Second try
1120  */
1121  x << 0.25, 0.39, 0.415, 0.39;
1122  // do the computation
1123  lm.resetParameters();
1124  info = lm.minimize(x);
1126 
1127  // check return value
1128  // VERIFY_IS_EQUAL(info, 1);
1129  // VERIFY_IS_EQUAL(lm.nfev(), 18);
1130  // VERIFY_IS_EQUAL(lm.njev(), 16);
1131  // check norm^2
1132  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 3.0750560385E-04);
1133  // check x
1134  VERIFY_IS_APPROX(x[0], 0.19280781); // should be 1.9280693458E-01
1135  VERIFY_IS_APPROX(x[1], 0.19126265); // should be 1.9128232873E-01
1136  VERIFY_IS_APPROX(x[2], 0.12305280); // should be 1.2305650693E-01
1137  VERIFY_IS_APPROX(x[3], 0.13605322); // should be 1.3606233068E-01
1138 }
Definition: levenberg_marquardt.cpp:1055

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, Eigen::LevenbergMarquardt< FunctorType_ >::resetParameters(), Eigen::LevenbergMarquardt< FunctorType_ >::setMaxfev(), VERIFY_IS_APPROX, and plotDoE::x.

◆ testNistMGH10()

void testNistMGH10 ( void  )
816  {
817  const int n = 3;
819 
820  VectorXd x(n);
821 
822  /*
823  * First try
824  */
825  x << 2., 400000., 25000.;
826  // do the computation
827  MGH10_functor functor;
829  info = lm.minimize(x);
831  // ++g_test_level;
832  // VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeReductionTooSmall);
833  // --g_test_level;
834  // was: VERIFY_IS_EQUAL(info, 1);
835 
836  // check norm^2
837  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7945855171E+01);
838  // check x
839  VERIFY_IS_APPROX(x[0], 5.6096364710E-03);
840  VERIFY_IS_APPROX(x[1], 6.1813463463E+03);
841  VERIFY_IS_APPROX(x[2], 3.4522363462E+02);
842 
843  // check return value
844 
845  // ++g_test_level;
846  // VERIFY_IS_EQUAL(lm.nfev(), 284 );
847  // VERIFY_IS_EQUAL(lm.njev(), 249 );
848  // --g_test_level;
849  VERIFY(lm.nfev() < 284 * LM_EVAL_COUNT_TOL);
850  VERIFY(lm.njev() < 249 * LM_EVAL_COUNT_TOL);
851 
852  /*
853  * Second try
854  */
855  x << 0.02, 4000., 250.;
856  // do the computation
857  info = lm.minimize(x);
859  // ++g_test_level;
860  // VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeReductionTooSmall);
861  // // was: VERIFY_IS_EQUAL(info, 1);
862  // --g_test_level;
863 
864  // check norm^2
865  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7945855171E+01);
866  // check x
867  VERIFY_IS_APPROX(x[0], 5.6096364710E-03);
868  VERIFY_IS_APPROX(x[1], 6.1813463463E+03);
869  VERIFY_IS_APPROX(x[2], 3.4522363462E+02);
870 
871  // check return value
872  // ++g_test_level;
873  // VERIFY_IS_EQUAL(lm.nfev(), 126);
874  // VERIFY_IS_EQUAL(lm.njev(), 116);
875  // --g_test_level;
876  VERIFY(lm.nfev() < 126 * LM_EVAL_COUNT_TOL);
877  VERIFY(lm.njev() < 116 * LM_EVAL_COUNT_TOL);
878 }
Definition: levenberg_marquardt.cpp:784

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, LM_EVAL_COUNT_TOL, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, Eigen::LevenbergMarquardt< FunctorType_ >::nfev, Eigen::LevenbergMarquardt< FunctorType_ >::njev, VERIFY, VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistMGH17()

void testNistMGH17 ( void  )
999  {
1000  const int n = 5;
1001  int info;
1002 
1003  VectorXd x(n);
1004 
1005  /*
1006  * First try
1007  */
1008  x << 50., 150., -100., 1., 2.;
1009  // do the computation
1010  MGH17_functor functor;
1012  lm.setFtol(NumTraits<double>::epsilon());
1013  lm.setXtol(NumTraits<double>::epsilon());
1014  lm.setMaxfev(1000);
1015  info = lm.minimize(x);
1017 
1018  // check norm^2
1019  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.4648946975E-05);
1020  // check x
1021  VERIFY_IS_APPROX(x[0], 3.7541005211E-01);
1022  VERIFY_IS_APPROX(x[1], 1.9358469127E+00);
1023  VERIFY_IS_APPROX(x[2], -1.4646871366E+00);
1024  VERIFY_IS_APPROX(x[3], 1.2867534640E-02);
1025  VERIFY_IS_APPROX(x[4], 2.2122699662E-02);
1026 
1027  // check return value
1028  // VERIFY_IS_EQUAL(info, 2); //FIXME Use (lm.info() == Success)
1029  // VERIFY(lm.nfev() < 700 ); // 602
1030  // VERIFY(lm.njev() < 600 ); // 545
1031 
1032  /*
1033  * Second try
1034  */
1035  x << 0.5, 1.5, -1, 0.01, 0.02;
1036  // do the computation
1037  lm.resetParameters();
1038  info = lm.minimize(x);
1040 
1041  // check return value
1042  // VERIFY_IS_EQUAL(info, 1);
1043  // VERIFY_IS_EQUAL(lm.nfev(), 18);
1044  // VERIFY_IS_EQUAL(lm.njev(), 15);
1045  // check norm^2
1046  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.4648946975E-05);
1047  // check x
1048  VERIFY_IS_APPROX(x[0], 3.7541005211E-01);
1049  VERIFY_IS_APPROX(x[1], 1.9358469127E+00);
1050  VERIFY_IS_APPROX(x[2], -1.4646871366E+00);
1051  VERIFY_IS_APPROX(x[3], 1.2867534640E-02);
1052  VERIFY_IS_APPROX(x[4], 2.2122699662E-02);
1053 }
Definition: levenberg_marquardt.cpp:961

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, Eigen::LevenbergMarquardt< FunctorType_ >::resetParameters(), Eigen::LevenbergMarquardt< FunctorType_ >::setFtol(), Eigen::LevenbergMarquardt< FunctorType_ >::setMaxfev(), Eigen::LevenbergMarquardt< FunctorType_ >::setXtol(), VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistMisra1a()

void testNistMisra1a ( void  )
353  {
354  const int n = 2;
355  int info;
356 
357  VectorXd x(n);
358 
359  /*
360  * First try
361  */
362  x << 500., 0.0001;
363  // do the computation
364  misra1a_functor functor;
366  info = lm.minimize(x);
368 
369  // check return value
370  // VERIFY_IS_EQUAL(info, 1);
371  // VERIFY_IS_EQUAL(lm.nfev(), 19);
372  // VERIFY_IS_EQUAL(lm.njev(), 15);
373  // check norm^2
374  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.2455138894E-01);
375  // check x
376  VERIFY_IS_APPROX(x[0], 2.3894212918E+02);
377  VERIFY_IS_APPROX(x[1], 5.5015643181E-04);
378 
379  /*
380  * Second try
381  */
382  x << 250., 0.0005;
383  // do the computation
384  info = lm.minimize(x);
386 
387  // check return value
388  // VERIFY_IS_EQUAL(info, 1);
389  // VERIFY_IS_EQUAL(lm.nfev(), 5);
390  // VERIFY_IS_EQUAL(lm.njev(), 4);
391  // check norm^2
392  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 1.2455138894E-01);
393  // check x
394  VERIFY_IS_APPROX(x[0], 2.3894212918E+02);
395  VERIFY_IS_APPROX(x[1], 5.5015643181E-04);
396 }
Definition: levenberg_marquardt.cpp:324

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistMisra1d()

void testNistMisra1d ( void  )
567  {
568  const int n = 2;
569  int info;
570 
571  VectorXd x(n);
572 
573  /*
574  * First try
575  */
576  x << 500., 0.0001;
577  // do the computation
578  misra1d_functor functor;
580  info = lm.minimize(x);
582 
583  // check return value
584  // VERIFY_IS_EQUAL(info, 1);
585  // VERIFY_IS_EQUAL(lm.nfev(), 9);
586  // VERIFY_IS_EQUAL(lm.njev(), 7);
587  // check norm^2
588  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6419295283E-02);
589  // check x
590  VERIFY_IS_APPROX(x[0], 4.3736970754E+02);
591  VERIFY_IS_APPROX(x[1], 3.0227324449E-04);
592 
593  /*
594  * Second try
595  */
596  x << 450., 0.0003;
597  // do the computation
598  info = lm.minimize(x);
600 
601  // check return value
602  // VERIFY_IS_EQUAL(info, 1);
603  // VERIFY_IS_EQUAL(lm.nfev(), 4);
604  // VERIFY_IS_EQUAL(lm.njev(), 3);
605  // check norm^2
606  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6419295283E-02);
607  // check x
608  VERIFY_IS_APPROX(x[0], 4.3736970754E+02);
609  VERIFY_IS_APPROX(x[1], 3.0227324449E-04);
610 }
Definition: levenberg_marquardt.cpp:537

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistRat42()

void testNistRat42 ( void  )
737  {
738  const int n = 3;
740 
741  VectorXd x(n);
742 
743  /*
744  * First try
745  */
746  x << 100., 1., 0.1;
747  // do the computation
748  rat42_functor functor;
750  info = lm.minimize(x);
752 
753  // check return value
754  // VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeReductionTooSmall);
755  // VERIFY_IS_EQUAL(lm.nfev(), 10);
756  // VERIFY_IS_EQUAL(lm.njev(), 8);
757  // check norm^2
758  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.0565229338E+00);
759  // check x
760  VERIFY_IS_APPROX(x[0], 7.2462237576E+01);
761  VERIFY_IS_APPROX(x[1], 2.6180768402E+00);
762  VERIFY_IS_APPROX(x[2], 6.7359200066E-02);
763 
764  /*
765  * Second try
766  */
767  x << 75., 2.5, 0.07;
768  // do the computation
769  info = lm.minimize(x);
771 
772  // check return value
773  // VERIFY_IS_EQUAL(info, LevenbergMarquardtSpace::RelativeReductionTooSmall);
774  // VERIFY_IS_EQUAL(lm.nfev(), 6);
775  // VERIFY_IS_EQUAL(lm.njev(), 5);
776  // check norm^2
777  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.0565229338E+00);
778  // check x
779  VERIFY_IS_APPROX(x[0], 7.2462237576E+01);
780  VERIFY_IS_APPROX(x[1], 2.6180768402E+00);
781  VERIFY_IS_APPROX(x[2], 6.7359200066E-02);
782 }
Definition: levenberg_marquardt.cpp:705

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistRat43()

void testNistRat43 ( void  )
1390  {
1391  const int n = 4;
1392  int info;
1393 
1394  VectorXd x(n);
1395 
1396  /*
1397  * First try
1398  */
1399  x << 100., 10., 1., 1.;
1400  // do the computation
1401  rat43_functor functor;
1403  lm.setFtol(1.E6 * NumTraits<double>::epsilon());
1404  lm.setXtol(1.E6 * NumTraits<double>::epsilon());
1405  info = lm.minimize(x);
1407 
1408  // check return value
1409  // VERIFY_IS_EQUAL(info, 1);
1410  // VERIFY_IS_EQUAL(lm.nfev(), 27);
1411  // VERIFY_IS_EQUAL(lm.njev(), 20);
1412  // check norm^2
1413  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7864049080E+03);
1414  // check x
1415  VERIFY_IS_APPROX(x[0], 6.9964151270E+02);
1416  VERIFY_IS_APPROX(x[1], 5.2771253025E+00);
1417  VERIFY_IS_APPROX(x[2], 7.5962938329E-01);
1418  VERIFY_IS_APPROX(x[3], 1.2792483859E+00);
1419 
1420  /*
1421  * Second try
1422  */
1423  x << 700., 5., 0.75, 1.3;
1424  // do the computation
1425  lm.resetParameters();
1426  lm.setFtol(1.E5 * NumTraits<double>::epsilon());
1427  lm.setXtol(1.E5 * NumTraits<double>::epsilon());
1428  info = lm.minimize(x);
1430 
1431  // check return value
1432  // VERIFY_IS_EQUAL(info, 1);
1433  // VERIFY_IS_EQUAL(lm.nfev(), 9);
1434  // VERIFY_IS_EQUAL(lm.njev(), 8);
1435  // check norm^2
1436  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 8.7864049080E+03);
1437  // check x
1438  VERIFY_IS_APPROX(x[0], 6.9964151270E+02);
1439  VERIFY_IS_APPROX(x[1], 5.2771253025E+00);
1440  VERIFY_IS_APPROX(x[2], 7.5962938329E-01);
1441  VERIFY_IS_APPROX(x[3], 1.2792483859E+00);
1442 }
Definition: levenberg_marquardt.cpp:1360

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, Eigen::LevenbergMarquardt< FunctorType_ >::resetParameters(), Eigen::LevenbergMarquardt< FunctorType_ >::setFtol(), Eigen::LevenbergMarquardt< FunctorType_ >::setXtol(), VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().

◆ testNistThurber()

void testNistThurber ( void  )
1300  {
1301  const int n = 7;
1302  int info;
1303 
1304  VectorXd x(n);
1305 
1306  /*
1307  * First try
1308  */
1309  x << 1000, 1000, 400, 40, 0.7, 0.3, 0.0;
1310  // do the computation
1311  thurber_functor functor;
1313  lm.setFtol(1.E4 * NumTraits<double>::epsilon());
1314  lm.setXtol(1.E4 * NumTraits<double>::epsilon());
1315  info = lm.minimize(x);
1317 
1318  // check return value
1319  // VERIFY_IS_EQUAL(info, 1);
1320  // VERIFY_IS_EQUAL(lm.nfev(), 39);
1321  // VERIFY_IS_EQUAL(lm.njev(), 36);
1322  // check norm^2
1323  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6427082397E+03);
1324  // check x
1325  VERIFY_IS_APPROX(x[0], 1.2881396800E+03);
1326  VERIFY_IS_APPROX(x[1], 1.4910792535E+03);
1327  VERIFY_IS_APPROX(x[2], 5.8323836877E+02);
1328  VERIFY_IS_APPROX(x[3], 7.5416644291E+01);
1329  VERIFY_IS_APPROX(x[4], 9.6629502864E-01);
1330  VERIFY_IS_APPROX(x[5], 3.9797285797E-01);
1331  VERIFY_IS_APPROX(x[6], 4.9727297349E-02);
1332 
1333  /*
1334  * Second try
1335  */
1336  x << 1300, 1500, 500, 75, 1, 0.4, 0.05;
1337  // do the computation
1338  lm.resetParameters();
1339  lm.setFtol(1.E4 * NumTraits<double>::epsilon());
1340  lm.setXtol(1.E4 * NumTraits<double>::epsilon());
1341  info = lm.minimize(x);
1343 
1344  // check return value
1345  // VERIFY_IS_EQUAL(info, 1);
1346  // VERIFY_IS_EQUAL(lm.nfev(), 29);
1347  // VERIFY_IS_EQUAL(lm.njev(), 28);
1348  // check norm^2
1349  VERIFY_IS_APPROX(lm.fvec().squaredNorm(), 5.6427082397E+03);
1350  // check x
1351  VERIFY_IS_APPROX(x[0], 1.2881396800E+03);
1352  VERIFY_IS_APPROX(x[1], 1.4910792535E+03);
1353  VERIFY_IS_APPROX(x[2], 5.8323836877E+02);
1354  VERIFY_IS_APPROX(x[3], 7.5416644291E+01);
1355  VERIFY_IS_APPROX(x[4], 9.6629502864E-01);
1356  VERIFY_IS_APPROX(x[5], 3.9797285797E-01);
1357  VERIFY_IS_APPROX(x[6], 4.9727297349E-02);
1358 }
Definition: levenberg_marquardt.cpp:1253

References EIGEN_UNUSED_VARIABLE, Eigen::LevenbergMarquardt< FunctorType_ >::fvec, info, Eigen::LevenbergMarquardt< FunctorType_ >::minimize(), n, Eigen::LevenbergMarquardt< FunctorType_ >::resetParameters(), Eigen::LevenbergMarquardt< FunctorType_ >::setFtol(), Eigen::LevenbergMarquardt< FunctorType_ >::setXtol(), VERIFY_IS_APPROX, and plotDoE::x.

Referenced by EIGEN_DECLARE_TEST().