9 #include <unsupported/Eigen/NonLinearOptimization> 16 #define LM_EVAL_COUNT_TOL 4/3 18 int fcn_chkder(
const VectorXd &x, VectorXd &fvec, MatrixXd &fjac,
int iflag)
23 assert(15 == fvec.size());
24 assert(3 == x.size());
25 double tmp1, tmp2, tmp3, tmp4;
26 static const double y[15]={1.4e-1, 1.8e-1, 2.2e-1, 2.5e-1, 2.9e-1, 3.2e-1, 3.5e-1,
27 3.9e-1, 3.7e-1, 5.8e-1, 7.3e-1, 9.6e-1, 1.34, 2.1, 4.39};
34 for (i=0; i<15; i++) {
38 if (i >= 8) tmp3 = tmp2;
39 fvec[i] = y[i] - (x[0] + tmp1/(x[1]*tmp2 + x[2]*tmp3));
42 for (i = 0; i < 15; i++) {
50 if (i >= 8) tmp3 = tmp2;
51 tmp4 = (x[1]*tmp2 + x[2]*tmp3); tmp4=tmp4*tmp4;
53 fjac(i,1) = tmp1*tmp2/tmp4;
54 fjac(i,2) = tmp1*tmp3/tmp4;
64 VectorXd x(n), fvec(m), xp, fvecp(m), err;
70 x << 9.2e-1, 1.3e-1, 5.4e-1;
81 VectorXd fvec_ref(m), fvecp_ref(m), err_ref(m);
83 -1.181606, -1.429655, -1.606344,
84 -1.745269, -1.840654, -1.921586,
85 -1.984141, -2.022537, -2.468977,
86 -2.827562, -3.473582, -4.437612,
87 -6.047662, -9.267761, -18.91806;
89 -7.724666e-09, -3.432406e-09, -2.034843e-10,
90 2.313685e-09, 4.331078e-09, 5.984096e-09,
91 7.363281e-09, 8.53147e-09, 1.488591e-08,
92 2.33585e-08, 3.522012e-08, 5.301255e-08,
93 8.26666e-08, 1.419747e-07, 3.19899e-07;
95 0.1141397, 0.09943516, 0.09674474,
96 0.09980447, 0.1073116, 0.1220445,
101 VERIFY_IS_APPROX(fvec, fvec_ref);
102 VERIFY_IS_APPROX(fvecp, fvecp_ref);
103 VERIFY_IS_APPROX(err, err_ref);
107 template<
typename _Scalar,
int NX=Dynamic,
int NY=Dynamic>
117 typedef Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime>
JacobianType;
136 double tmp1, tmp2, tmp3;
137 static const double y[15] = {1.4e-1, 1.8e-1, 2.2e-1, 2.5e-1, 2.9e-1, 3.2e-1, 3.5e-1,
138 3.9e-1, 3.7e-1, 5.8e-1, 7.3e-1, 9.6e-1, 1.34, 2.1, 4.39};
140 for (
int i = 0; i <
values(); i++)
144 tmp3 = (i>=8)? tmp2 : tmp1;
145 fvec[i] = y[i] - (x[0] + tmp1/(x[1]*tmp2 + x[2]*tmp3));
150 int df(
const VectorXd &x, MatrixXd &fjac)
const 152 double tmp1, tmp2, tmp3, tmp4;
153 for (
int i = 0; i <
values(); i++)
157 tmp3 = (i>=8)? tmp2 : tmp1;
158 tmp4 = (x[1]*tmp2 + x[2]*tmp3); tmp4 = tmp4*tmp4;
160 fjac(i,1) = tmp1*tmp2/tmp4;
161 fjac(i,2) = tmp1*tmp3/tmp4;
174 x.setConstant(n, 1.);
178 LevenbergMarquardt<lmder_functor> lm(functor);
182 VERIFY_IS_EQUAL(info, 1);
183 VERIFY_IS_EQUAL(lm.nfev, 6);
184 VERIFY_IS_EQUAL(lm.njev, 5);
187 VERIFY_IS_APPROX(lm.fvec.blueNorm(), 0.09063596);
191 x_ref << 0.08241058, 1.133037, 2.343695;
192 VERIFY_IS_APPROX(x, x_ref);
199 double fnorm, covfac;
203 x.setConstant(n, 1.);
207 LevenbergMarquardt<lmder_functor> lm(functor);
208 info = lm.minimize(x);
211 VERIFY_IS_EQUAL(info, 1);
212 VERIFY_IS_EQUAL(lm.nfev, 6);
213 VERIFY_IS_EQUAL(lm.njev, 5);
216 fnorm = lm.fvec.blueNorm();
217 VERIFY_IS_APPROX(fnorm, 0.09063596);
221 x_ref << 0.08241058, 1.133037, 2.343695;
222 VERIFY_IS_APPROX(x, x_ref);
225 covfac = fnorm*fnorm/(m-n);
228 MatrixXd cov_ref(n,n);
230 0.0001531202, 0.002869941, -0.002656662,
231 0.002869941, 0.09480935, -0.09098995,
232 -0.002656662, -0.09098995, 0.08778727;
237 cov = covfac*lm.fjac.topLeftCorner<n,n>();
238 VERIFY_IS_APPROX( cov, cov_ref);
249 double temp, temp1, temp2;
251 assert(fvec.size()==n);
254 temp = (3. - 2.*x[k])*x[k];
256 if (k) temp1 = x[k-1];
258 if (k != n-1) temp2 = x[k+1];
259 fvec[k] = temp - temp1 - 2.*temp2 + 1.;
263 int df(
const VectorXd &x, MatrixXd &fjac)
266 assert(fjac.rows()==n);
267 assert(fjac.cols()==n);
272 fjac(k,k) = 3.- 4.*x[k];
273 if (k) fjac(k,k-1) = -1.;
274 if (k != n-1) fjac(k,k+1) = -2.;
288 x.setConstant(n, -1.);
292 HybridNonLinearSolver<hybrj_functor> solver(functor);
293 info = solver.hybrj1(x);
296 VERIFY_IS_EQUAL(info, 1);
297 VERIFY_IS_EQUAL(solver.nfev, 11);
298 VERIFY_IS_EQUAL(solver.njev, 1);
301 VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08);
307 -0.5706545, -0.6816283, -0.7017325,
308 -0.7042129, -0.701369, -0.6918656,
309 -0.665792, -0.5960342, -0.4164121;
310 VERIFY_IS_APPROX(x, x_ref);
320 x.setConstant(n, -1.);
325 HybridNonLinearSolver<hybrj_functor> solver(functor);
326 solver.diag.setConstant(n, 1.);
327 solver.useExternalScaling =
true;
328 info = solver.solve(x);
331 VERIFY_IS_EQUAL(info, 1);
332 VERIFY_IS_EQUAL(solver.nfev, 11);
333 VERIFY_IS_EQUAL(solver.njev, 1);
336 VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08);
342 -0.5706545, -0.6816283, -0.7017325,
343 -0.7042129, -0.701369, -0.6918656,
344 -0.665792, -0.5960342, -0.4164121;
345 VERIFY_IS_APPROX(x, x_ref);
354 double temp, temp1, temp2;
357 assert(fvec.size()==n);
360 temp = (3. - 2.*x[k])*x[k];
362 if (k) temp1 = x[k-1];
364 if (k != n-1) temp2 = x[k+1];
365 fvec[k] = temp - temp1 - 2.*temp2 + 1.;
377 x.setConstant(n, -1.);
381 HybridNonLinearSolver<hybrd_functor> solver(functor);
382 info = solver.hybrd1(x);
385 VERIFY_IS_EQUAL(info, 1);
386 VERIFY_IS_EQUAL(solver.nfev, 20);
389 VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08);
393 x_ref << -0.5706545, -0.6816283, -0.7017325, -0.7042129, -0.701369, -0.6918656, -0.665792, -0.5960342, -0.4164121;
394 VERIFY_IS_APPROX(x, x_ref);
404 x.setConstant(n, -1.);
408 HybridNonLinearSolver<hybrd_functor> solver(functor);
409 solver.parameters.nb_of_subdiagonals = 1;
410 solver.parameters.nb_of_superdiagonals = 1;
411 solver.diag.setConstant(n, 1.);
412 solver.useExternalScaling =
true;
413 info = solver.solveNumericalDiff(x);
416 VERIFY_IS_EQUAL(info, 1);
417 VERIFY_IS_EQUAL(solver.nfev, 14);
420 VERIFY_IS_APPROX(solver.fvec.blueNorm(), 1.192636e-08);
425 -0.5706545, -0.6816283, -0.7017325,
426 -0.7042129, -0.701369, -0.6918656,
427 -0.665792, -0.5960342, -0.4164121;
428 VERIFY_IS_APPROX(x, x_ref);
437 double tmp1, tmp2, tmp3;
438 static const double y[15]={1.4e-1, 1.8e-1, 2.2e-1, 2.5e-1, 2.9e-1, 3.2e-1, 3.5e-1,
439 3.9e-1, 3.7e-1, 5.8e-1, 7.3e-1, 9.6e-1, 1.34, 2.1, 4.39};
441 assert(15==fvec.size());
444 for (
int i=0; i<15; i++)
448 tmp3 = (i>=8)? tmp2 : tmp1;
449 fvec[i] = y[i] - (x[0] + tmp1/(x[1]*tmp2 + x[2]*tmp3));
456 assert(jac_row.size()==x.size());
457 double tmp1, tmp2, tmp3, tmp4;
462 tmp3 = (i>=8)? tmp2 : tmp1;
463 tmp4 = (x[1]*tmp2 + x[2]*tmp3); tmp4 = tmp4*tmp4;
465 jac_row[1] = tmp1*tmp2/tmp4;
466 jac_row[2] = tmp1*tmp3/tmp4;
479 x.setConstant(n, 1.);
483 LevenbergMarquardt<lmstr_functor> lm(functor);
487 VERIFY_IS_EQUAL(info, 1);
488 VERIFY_IS_EQUAL(lm.nfev, 6);
489 VERIFY_IS_EQUAL(lm.njev, 5);
492 VERIFY_IS_APPROX(lm.fvec.blueNorm(), 0.09063596);
496 x_ref << 0.08241058, 1.133037, 2.343695 ;
497 VERIFY_IS_APPROX(x, x_ref);
508 x.setConstant(n, 1.);
512 LevenbergMarquardt<lmstr_functor> lm(functor);
513 info = lm.minimizeOptimumStorage(x);
516 VERIFY_IS_EQUAL(info, 1);
517 VERIFY_IS_EQUAL(lm.nfev, 6);
518 VERIFY_IS_EQUAL(lm.njev, 5);
521 fnorm = lm.fvec.blueNorm();
522 VERIFY_IS_APPROX(fnorm, 0.09063596);
526 x_ref << 0.08241058, 1.133037, 2.343695;
527 VERIFY_IS_APPROX(x, x_ref);
537 double tmp1,tmp2,tmp3;
538 static const double y[15]={1.4e-1,1.8e-1,2.2e-1,2.5e-1,2.9e-1,3.2e-1,3.5e-1,3.9e-1,
539 3.7e-1,5.8e-1,7.3e-1,9.6e-1,1.34e0,2.1e0,4.39e0};
542 assert(fvec.size()==15);
549 if (i >= 8) tmp3 = tmp2;
550 fvec[i] = y[i] - (x[0] + tmp1/(x[1]*tmp2 + x[2]*tmp3));
561 VectorXd x(n), fvec(15);
564 x.setConstant(n, 1.);
569 info = LevenbergMarquardt<lmdif_functor>::lmdif1(functor, x, &nfev);
572 VERIFY_IS_EQUAL(info, 1);
573 VERIFY_IS_EQUAL(nfev, 26);
577 VERIFY_IS_APPROX(fvec.blueNorm(), 0.09063596);
581 x_ref << 0.0824106, 1.1330366, 2.3436947;
582 VERIFY_IS_APPROX(x, x_ref);
590 double fnorm, covfac;
594 x.setConstant(n, 1.);
598 NumericalDiff<lmdif_functor> numDiff(functor);
599 LevenbergMarquardt<NumericalDiff<lmdif_functor> > lm(numDiff);
600 info = lm.minimize(x);
603 VERIFY_IS_EQUAL(info, 1);
604 VERIFY_IS_EQUAL(lm.nfev, 26);
607 fnorm = lm.fvec.blueNorm();
608 VERIFY_IS_APPROX(fnorm, 0.09063596);
612 x_ref << 0.08241058, 1.133037, 2.343695;
613 VERIFY_IS_APPROX(x, x_ref);
616 covfac = fnorm*fnorm/(m-n);
619 MatrixXd cov_ref(n,n);
621 0.0001531202, 0.002869942, -0.002656662,
622 0.002869942, 0.09480937, -0.09098997,
623 -0.002656662, -0.09098997, 0.08778729;
628 cov = covfac*lm.fjac.topLeftCorner<n,n>();
629 VERIFY_IS_APPROX( cov, cov_ref);
637 static const double m_x[54];
638 static const double m_y[54];
644 assert(fvec.size()==54);
645 for(i=0; i<54; i++) {
647 fvec[i] =
exp(-b[0]*x)/(b[1]+b[2]*x) - m_y[i];
651 int df(
const VectorXd &
b, MatrixXd &fjac)
654 assert(fjac.rows()==54);
655 assert(fjac.cols()==3);
656 for(
int i=0; i<54; i++) {
658 double factor = 1./(b[1]+b[2]*x);
659 double e =
exp(-b[0]*x);
660 fjac(i,0) = -x*e*factor;
661 fjac(i,1) = -e*factor*factor;
662 fjac(i,2) = -x*e*factor*factor;
667 const double chwirut2_functor::m_x[54] = { 0.500E0, 1.000E0, 1.750E0, 3.750E0, 5.750E0, 0.875E0, 2.250E0, 3.250E0, 5.250E0, 0.750E0, 1.750E0, 2.750E0, 4.750E0, 0.625E0, 1.250E0, 2.250E0, 4.250E0, .500E0, 3.000E0, .750E0, 3.000E0, 1.500E0, 6.000E0, 3.000E0, 6.000E0, 1.500E0, 3.000E0, .500E0, 2.000E0, 4.000E0, .750E0, 2.000E0, 5.000E0, .750E0, 2.250E0, 3.750E0, 5.750E0, 3.000E0, .750E0, 2.500E0, 4.000E0, .750E0, 2.500E0, 4.000E0, .750E0, 2.500E0, 4.000E0, .500E0, 6.000E0, 3.000E0, .500E0, 2.750E0, .500E0, 1.750E0};
668 const double chwirut2_functor::m_y[54] = { 92.9000E0 ,57.1000E0 ,31.0500E0 ,11.5875E0 ,8.0250E0 ,63.6000E0 ,21.4000E0 ,14.2500E0 ,8.4750E0 ,63.8000E0 ,26.8000E0 ,16.4625E0 ,7.1250E0 ,67.3000E0 ,41.0000E0 ,21.1500E0 ,8.1750E0 ,81.5000E0 ,13.1200E0 ,59.9000E0 ,14.6200E0 ,32.9000E0 ,5.4400E0 ,12.5600E0 ,5.4400E0 ,32.0000E0 ,13.9500E0 ,75.8000E0 ,20.0000E0 ,10.4200E0 ,59.5000E0 ,21.6700E0 ,8.5500E0 ,62.0000E0 ,20.2000E0 ,7.7600E0 ,3.7500E0 ,11.8100E0 ,54.7000E0 ,23.7000E0 ,11.5500E0 ,61.3000E0 ,17.7000E0 ,8.7400E0 ,59.2000E0 ,16.3000E0 ,8.6200E0 ,81.0000E0 ,4.8700E0 ,14.6200E0 ,81.7000E0 ,17.1700E0 ,81.3000E0 ,28.9000E0 };
684 LevenbergMarquardt<chwirut2_functor> lm(functor);
685 info = lm.minimize(x);
688 VERIFY_IS_EQUAL(info, 1);
689 VERIFY_IS_EQUAL(lm.nfev, 10);
690 VERIFY_IS_EQUAL(lm.njev, 8);
692 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.1304802941E+02);
694 VERIFY_IS_APPROX(x[0], 1.6657666537E-01);
695 VERIFY_IS_APPROX(x[1], 5.1653291286E-03);
696 VERIFY_IS_APPROX(x[2], 1.2150007096E-02);
701 x<< 0.15, 0.008, 0.010;
703 lm.resetParameters();
704 lm.parameters.ftol = 1.E6*NumTraits<double>::epsilon();
705 lm.parameters.xtol = 1.E6*NumTraits<double>::epsilon();
706 info = lm.minimize(x);
709 VERIFY_IS_EQUAL(info, 1);
710 VERIFY_IS_EQUAL(lm.nfev, 7);
711 VERIFY_IS_EQUAL(lm.njev, 6);
713 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.1304802941E+02);
715 VERIFY_IS_APPROX(x[0], 1.6657666537E-01);
716 VERIFY_IS_APPROX(x[1], 5.1653291286E-03);
717 VERIFY_IS_APPROX(x[2], 1.2150007096E-02);
724 static const double m_x[14];
725 static const double m_y[14];
729 assert(fvec.size()==14);
730 for(
int i=0; i<14; i++) {
731 fvec[i] = b[0]*(1.-
exp(-b[1]*m_x[i])) - m_y[i] ;
735 int df(
const VectorXd &
b, MatrixXd &fjac)
738 assert(fjac.rows()==14);
739 assert(fjac.cols()==2);
740 for(
int i=0; i<14; i++) {
741 fjac(i,0) = (1.-
exp(-b[1]*m_x[i]));
742 fjac(i,1) = (b[0]*m_x[i]*
exp(-b[1]*m_x[i]));
747 const double misra1a_functor::m_x[14] = { 77.6E0, 114.9E0, 141.1E0, 190.8E0, 239.9E0, 289.0E0, 332.8E0, 378.4E0, 434.8E0, 477.3E0, 536.8E0, 593.1E0, 689.1E0, 760.0E0};
748 const double misra1a_functor::m_y[14] = { 10.07E0, 14.73E0, 17.94E0, 23.93E0, 29.61E0, 35.18E0, 40.02E0, 44.82E0, 50.76E0, 55.05E0, 61.01E0, 66.40E0, 75.47E0, 81.78E0};
764 LevenbergMarquardt<misra1a_functor> lm(functor);
765 info = lm.minimize(x);
768 VERIFY_IS_EQUAL(info, 1);
769 VERIFY_IS_EQUAL(lm.nfev, 19);
770 VERIFY_IS_EQUAL(lm.njev, 15);
772 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.2455138894E-01);
774 VERIFY_IS_APPROX(x[0], 2.3894212918E+02);
775 VERIFY_IS_APPROX(x[1], 5.5015643181E-04);
782 info = lm.minimize(x);
785 VERIFY_IS_EQUAL(info, 1);
786 VERIFY_IS_EQUAL(lm.nfev, 5);
787 VERIFY_IS_EQUAL(lm.njev, 4);
789 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.2455138894E-01);
791 VERIFY_IS_APPROX(x[0], 2.3894212918E+02);
792 VERIFY_IS_APPROX(x[1], 5.5015643181E-04);
798 static const double m_x[236];
801 static const double m_y[236] = { .591E0 , 1.547E0 , 2.902E0 , 2.894E0 , 4.703E0 , 6.307E0 , 7.03E0 , 7.898E0 , 9.470E0 , 9.484E0 , 10.072E0 , 10.163E0 , 11.615E0 , 12.005E0 , 12.478E0 , 12.982E0 , 12.970E0 , 13.926E0 , 14.452E0 , 14.404E0 , 15.190E0 , 15.550E0 , 15.528E0 , 15.499E0 , 16.131E0 , 16.438E0 , 16.387E0 , 16.549E0 , 16.872E0 , 16.830E0 , 16.926E0 , 16.907E0 , 16.966E0 , 17.060E0 , 17.122E0 , 17.311E0 , 17.355E0 , 17.668E0 , 17.767E0 , 17.803E0 , 17.765E0 , 17.768E0 , 17.736E0 , 17.858E0 , 17.877E0 , 17.912E0 , 18.046E0 , 18.085E0 , 18.291E0 , 18.357E0 , 18.426E0 , 18.584E0 , 18.610E0 , 18.870E0 , 18.795E0 , 19.111E0 , .367E0 , .796E0 , 0.892E0 , 1.903E0 , 2.150E0 , 3.697E0 , 5.870E0 , 6.421E0 , 7.422E0 , 9.944E0 , 11.023E0 , 11.87E0 , 12.786E0 , 14.067E0 , 13.974E0 , 14.462E0 , 14.464E0 , 15.381E0 , 15.483E0 , 15.59E0 , 16.075E0 , 16.347E0 , 16.181E0 , 16.915E0 , 17.003E0 , 16.978E0 , 17.756E0 , 17.808E0 , 17.868E0 , 18.481E0 , 18.486E0 , 19.090E0 , 16.062E0 , 16.337E0 , 16.345E0 ,
802 16.388E0 , 17.159E0 , 17.116E0 , 17.164E0 , 17.123E0 , 17.979E0 , 17.974E0 , 18.007E0 , 17.993E0 , 18.523E0 , 18.669E0 , 18.617E0 , 19.371E0 , 19.330E0 , 0.080E0 , 0.248E0 , 1.089E0 , 1.418E0 , 2.278E0 , 3.624E0 , 4.574E0 , 5.556E0 , 7.267E0 , 7.695E0 , 9.136E0 , 9.959E0 , 9.957E0 , 11.600E0 , 13.138E0 , 13.564E0 , 13.871E0 , 13.994E0 , 14.947E0 , 15.473E0 , 15.379E0 , 15.455E0 , 15.908E0 , 16.114E0 , 17.071E0 , 17.135E0 , 17.282E0 , 17.368E0 , 17.483E0 , 17.764E0 , 18.185E0 , 18.271E0 , 18.236E0 , 18.237E0 , 18.523E0 , 18.627E0 , 18.665E0 , 19.086E0 , 0.214E0 , 0.943E0 , 1.429E0 , 2.241E0 , 2.951E0 , 3.782E0 , 4.757E0 , 5.602E0 , 7.169E0 , 8.920E0 , 10.055E0 , 12.035E0 , 12.861E0 , 13.436E0 , 14.167E0 , 14.755E0 , 15.168E0 , 15.651E0 , 15.746E0 , 16.216E0 , 16.445E0 , 16.965E0 , 17.121E0 , 17.206E0 , 17.250E0 , 17.339E0 , 17.793E0 , 18.123E0 , 18.49E0 , 18.566E0 , 18.645E0 , 18.706E0 , 18.924E0 , 19.1E0 , 0.375E0 , 0.471E0 , 1.504E0 , 2.204E0 , 2.813E0 , 4.765E0 , 9.835E0 , 10.040E0 , 11.946E0 , 12.596E0 ,
803 13.303E0 , 13.922E0 , 14.440E0 , 14.951E0 , 15.627E0 , 15.639E0 , 15.814E0 , 16.315E0 , 16.334E0 , 16.430E0 , 16.423E0 , 17.024E0 , 17.009E0 , 17.165E0 , 17.134E0 , 17.349E0 , 17.576E0 , 17.848E0 , 18.090E0 , 18.276E0 , 18.404E0 , 18.519E0 , 19.133E0 , 19.074E0 , 19.239E0 , 19.280E0 , 19.101E0 , 19.398E0 , 19.252E0 , 19.89E0 , 20.007E0 , 19.929E0 , 19.268E0 , 19.324E0 , 20.049E0 , 20.107E0 , 20.062E0 , 20.065E0 , 19.286E0 , 19.972E0 , 20.088E0 , 20.743E0 , 20.83E0 , 20.935E0 , 21.035E0 , 20.93E0 , 21.074E0 , 21.085E0 , 20.935E0 };
808 assert(fvec.size()==236);
809 for(
int i=0; i<236; i++) {
810 double x=m_x[i], xx=x*x, xxx=xx*x;
811 fvec[i] = (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) / (1.+b[4]*x+b[5]*xx+b[6]*xxx) - m_y[i];
816 int df(
const VectorXd &
b, MatrixXd &fjac)
819 assert(fjac.rows()==236);
820 assert(fjac.cols()==7);
821 for(
int i=0; i<236; i++) {
822 double x=m_x[i], xx=x*x, xxx=xx*x;
823 double fact = 1./(1.+b[4]*x+b[5]*xx+b[6]*xxx);
827 fjac(i,3) = xxx*fact;
828 fact = - (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) * fact * fact;
831 fjac(i,6) = xxx*fact;
836 const double hahn1_functor::m_x[236] = { 24.41E0 , 34.82E0 , 44.09E0 , 45.07E0 , 54.98E0 , 65.51E0 , 70.53E0 , 75.70E0 , 89.57E0 , 91.14E0 , 96.40E0 , 97.19E0 , 114.26E0 , 120.25E0 , 127.08E0 , 133.55E0 , 133.61E0 , 158.67E0 , 172.74E0 , 171.31E0 , 202.14E0 , 220.55E0 , 221.05E0 , 221.39E0 , 250.99E0 , 268.99E0 , 271.80E0 , 271.97E0 , 321.31E0 , 321.69E0 , 330.14E0 , 333.03E0 , 333.47E0 , 340.77E0 , 345.65E0 , 373.11E0 , 373.79E0 , 411.82E0 , 419.51E0 , 421.59E0 , 422.02E0 , 422.47E0 , 422.61E0 , 441.75E0 , 447.41E0 , 448.7E0 , 472.89E0 , 476.69E0 , 522.47E0 , 522.62E0 , 524.43E0 , 546.75E0 , 549.53E0 , 575.29E0 , 576.00E0 , 625.55E0 , 20.15E0 , 28.78E0 , 29.57E0 , 37.41E0 , 39.12E0 , 50.24E0 , 61.38E0 , 66.25E0 , 73.42E0 , 95.52E0 , 107.32E0 , 122.04E0 , 134.03E0 , 163.19E0 , 163.48E0 , 175.70E0 , 179.86E0 , 211.27E0 , 217.78E0 , 219.14E0 , 262.52E0 , 268.01E0 , 268.62E0 , 336.25E0 , 337.23E0 , 339.33E0 , 427.38E0 , 428.58E0 , 432.68E0 , 528.99E0 , 531.08E0 , 628.34E0 , 253.24E0 , 273.13E0 , 273.66E0 ,
837 282.10E0 , 346.62E0 , 347.19E0 , 348.78E0 , 351.18E0 , 450.10E0 , 450.35E0 , 451.92E0 , 455.56E0 , 552.22E0 , 553.56E0 , 555.74E0 , 652.59E0 , 656.20E0 , 14.13E0 , 20.41E0 , 31.30E0 , 33.84E0 , 39.70E0 , 48.83E0 , 54.50E0 , 60.41E0 , 72.77E0 , 75.25E0 , 86.84E0 , 94.88E0 , 96.40E0 , 117.37E0 , 139.08E0 , 147.73E0 , 158.63E0 , 161.84E0 , 192.11E0 , 206.76E0 , 209.07E0 , 213.32E0 , 226.44E0 , 237.12E0 , 330.90E0 , 358.72E0 , 370.77E0 , 372.72E0 , 396.24E0 , 416.59E0 , 484.02E0 , 495.47E0 , 514.78E0 , 515.65E0 , 519.47E0 , 544.47E0 , 560.11E0 , 620.77E0 , 18.97E0 , 28.93E0 , 33.91E0 , 40.03E0 , 44.66E0 , 49.87E0 , 55.16E0 , 60.90E0 , 72.08E0 , 85.15E0 , 97.06E0 , 119.63E0 , 133.27E0 , 143.84E0 , 161.91E0 , 180.67E0 , 198.44E0 , 226.86E0 , 229.65E0 , 258.27E0 , 273.77E0 , 339.15E0 , 350.13E0 , 362.75E0 , 371.03E0 , 393.32E0 , 448.53E0 , 473.78E0 , 511.12E0 , 524.70E0 , 548.75E0 , 551.64E0 , 574.02E0 , 623.86E0 , 21.46E0 , 24.33E0 , 33.43E0 , 39.22E0 , 44.18E0 , 55.02E0 , 94.33E0 , 96.44E0 , 118.82E0 , 128.48E0 ,
838 141.94E0 , 156.92E0 , 171.65E0 , 190.00E0 , 223.26E0 , 223.88E0 , 231.50E0 , 265.05E0 , 269.44E0 , 271.78E0 , 273.46E0 , 334.61E0 , 339.79E0 , 349.52E0 , 358.18E0 , 377.98E0 , 394.77E0 , 429.66E0 , 468.22E0 , 487.27E0 , 519.54E0 , 523.03E0 , 612.99E0 , 638.59E0 , 641.36E0 , 622.05E0 , 631.50E0 , 663.97E0 , 646.9E0 , 748.29E0 , 749.21E0 , 750.14E0 , 647.04E0 , 646.89E0 , 746.9E0 , 748.43E0 , 747.35E0 , 749.27E0 , 647.61E0 , 747.78E0 , 750.51E0 , 851.37E0 , 845.97E0 , 847.54E0 , 849.93E0 , 851.61E0 , 849.75E0 , 850.98E0 , 848.23E0};
851 x<< 10., -1., .05, -.00001, -.05, .001, -.000001;
854 LevenbergMarquardt<hahn1_functor> lm(functor);
855 info = lm.minimize(x);
858 VERIFY_IS_EQUAL(info, 1);
859 VERIFY_IS_EQUAL(lm.nfev, 11);
860 VERIFY_IS_EQUAL(lm.njev, 10);
862 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.5324382854E+00);
864 VERIFY_IS_APPROX(x[0], 1.0776351733E+00);
865 VERIFY_IS_APPROX(x[1],-1.2269296921E-01);
866 VERIFY_IS_APPROX(x[2], 4.0863750610E-03);
867 VERIFY_IS_APPROX(x[3],-1.426264e-06);
868 VERIFY_IS_APPROX(x[4],-5.7609940901E-03);
869 VERIFY_IS_APPROX(x[5], 2.4053735503E-04);
870 VERIFY_IS_APPROX(x[6],-1.2314450199E-07);
875 x<< .1, -.1, .005, -.000001, -.005, .0001, -.0000001;
877 info = lm.minimize(x);
880 VERIFY_IS_EQUAL(info, 1);
881 VERIFY_IS_EQUAL(lm.nfev, 11);
882 VERIFY_IS_EQUAL(lm.njev, 10);
884 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.5324382854E+00);
886 VERIFY_IS_APPROX(x[0], 1.077640);
887 VERIFY_IS_APPROX(x[1], -0.1226933);
888 VERIFY_IS_APPROX(x[2], 0.004086383);
889 VERIFY_IS_APPROX(x[3], -1.426277e-06);
890 VERIFY_IS_APPROX(x[4],-5.7609940901E-03);
891 VERIFY_IS_APPROX(x[5], 0.00024053772);
892 VERIFY_IS_APPROX(x[6], -1.231450e-07);
899 static const double x[14];
900 static const double y[14];
904 assert(fvec.size()==14);
905 for(
int i=0; i<14; i++) {
906 fvec[i] = b[0]*b[1]*x[i]/(1.+b[1]*x[i]) - y[i];
910 int df(
const VectorXd &
b, MatrixXd &fjac)
913 assert(fjac.rows()==14);
914 assert(fjac.cols()==2);
915 for(
int i=0; i<14; i++) {
916 double den = 1.+b[1]*x[i];
917 fjac(i,0) = b[1]*x[i] / den;
918 fjac(i,1) = b[0]*x[i]*(den-b[1]*x[i])/den/den;
923 const double misra1d_functor::x[14] = { 77.6E0, 114.9E0, 141.1E0, 190.8E0, 239.9E0, 289.0E0, 332.8E0, 378.4E0, 434.8E0, 477.3E0, 536.8E0, 593.1E0, 689.1E0, 760.0E0};
924 const double misra1d_functor::y[14] = { 10.07E0, 14.73E0, 17.94E0, 23.93E0, 29.61E0, 35.18E0, 40.02E0, 44.82E0, 50.76E0, 55.05E0, 61.01E0, 66.40E0, 75.47E0, 81.78E0};
940 LevenbergMarquardt<misra1d_functor> lm(functor);
941 info = lm.minimize(x);
944 VERIFY_IS_EQUAL(info, 3);
945 VERIFY_IS_EQUAL(lm.nfev, 9);
946 VERIFY_IS_EQUAL(lm.njev, 7);
948 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6419295283E-02);
950 VERIFY_IS_APPROX(x[0], 4.3736970754E+02);
951 VERIFY_IS_APPROX(x[1], 3.0227324449E-04);
958 info = lm.minimize(x);
961 VERIFY_IS_EQUAL(info, 1);
962 VERIFY_IS_EQUAL(lm.nfev, 4);
963 VERIFY_IS_EQUAL(lm.njev, 3);
965 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6419295283E-02);
967 VERIFY_IS_APPROX(x[0], 4.3736970754E+02);
968 VERIFY_IS_APPROX(x[1], 3.0227324449E-04);
975 static const double x[24];
976 static const double y[24];
980 assert(fvec.size()==24);
981 for(
int i=0; i<24; i++)
982 fvec[i] = b[0]*
exp(-b[1]*x[i]) + b[2]*
exp(-b[3]*x[i]) + b[4]*
exp(-b[5]*x[i]) - y[i];
985 int df(
const VectorXd &
b, MatrixXd &fjac)
988 assert(fjac.rows()==24);
989 assert(fjac.cols()==6);
990 for(
int i=0; i<24; i++) {
991 fjac(i,0) =
exp(-b[1]*x[i]);
992 fjac(i,1) = -b[0]*x[i]*
exp(-b[1]*x[i]);
993 fjac(i,2) =
exp(-b[3]*x[i]);
994 fjac(i,3) = -b[2]*x[i]*
exp(-b[3]*x[i]);
995 fjac(i,4) =
exp(-b[5]*x[i]);
996 fjac(i,5) = -b[4]*x[i]*
exp(-b[5]*x[i]);
1001 const double lanczos1_functor::x[24] = { 0.000000000000E+00, 5.000000000000E-02, 1.000000000000E-01, 1.500000000000E-01, 2.000000000000E-01, 2.500000000000E-01, 3.000000000000E-01, 3.500000000000E-01, 4.000000000000E-01, 4.500000000000E-01, 5.000000000000E-01, 5.500000000000E-01, 6.000000000000E-01, 6.500000000000E-01, 7.000000000000E-01, 7.500000000000E-01, 8.000000000000E-01, 8.500000000000E-01, 9.000000000000E-01, 9.500000000000E-01, 1.000000000000E+00, 1.050000000000E+00, 1.100000000000E+00, 1.150000000000E+00 };
1002 const double lanczos1_functor::y[24] = { 2.513400000000E+00 ,2.044333373291E+00 ,1.668404436564E+00 ,1.366418021208E+00 ,1.123232487372E+00 ,9.268897180037E-01 ,7.679338563728E-01 ,6.388775523106E-01 ,5.337835317402E-01 ,4.479363617347E-01 ,3.775847884350E-01 ,3.197393199326E-01 ,2.720130773746E-01 ,2.324965529032E-01 ,1.996589546065E-01 ,1.722704126914E-01 ,1.493405660168E-01 ,1.300700206922E-01 ,1.138119324644E-01 ,1.000415587559E-01 ,8.833209084540E-02 ,7.833544019350E-02 ,6.976693743449E-02 ,6.239312536719E-02 };
1015 x<< 1.2, 0.3, 5.6, 5.5, 6.5, 7.6;
1018 LevenbergMarquardt<lanczos1_functor> lm(functor);
1019 info = lm.minimize(x);
1022 VERIFY_IS_EQUAL(info, 2);
1023 VERIFY_IS_EQUAL(lm.nfev, 79);
1024 VERIFY_IS_EQUAL(lm.njev, 72);
1026 std::cout.precision(30);
1027 std::cout << lm.fvec.squaredNorm() <<
"\n";
1028 VERIFY(lm.fvec.squaredNorm() <= 1.4307867721E-25);
1030 VERIFY_IS_APPROX(x[0], 9.5100000027E-02);
1031 VERIFY_IS_APPROX(x[1], 1.0000000001E+00);
1032 VERIFY_IS_APPROX(x[2], 8.6070000013E-01);
1033 VERIFY_IS_APPROX(x[3], 3.0000000002E+00);
1034 VERIFY_IS_APPROX(x[4], 1.5575999998E+00);
1035 VERIFY_IS_APPROX(x[5], 5.0000000001E+00);
1040 x<< 0.5, 0.7, 3.6, 4.2, 4., 6.3;
1042 info = lm.minimize(x);
1045 VERIFY_IS_EQUAL(info, 2);
1046 VERIFY_IS_EQUAL(lm.nfev, 9);
1047 VERIFY_IS_EQUAL(lm.njev, 8);
1049 VERIFY(lm.fvec.squaredNorm() <= 1.4307867721E-25);
1051 VERIFY_IS_APPROX(x[0], 9.5100000027E-02);
1052 VERIFY_IS_APPROX(x[1], 1.0000000001E+00);
1053 VERIFY_IS_APPROX(x[2], 8.6070000013E-01);
1054 VERIFY_IS_APPROX(x[3], 3.0000000002E+00);
1055 VERIFY_IS_APPROX(x[4], 1.5575999998E+00);
1056 VERIFY_IS_APPROX(x[5], 5.0000000001E+00);
1063 static const double x[9];
1064 static const double y[9];
1067 assert(b.size()==3);
1068 assert(fvec.size()==9);
1069 for(
int i=0; i<9; i++) {
1070 fvec[i] = b[0] / (1.+
exp(b[1]-b[2]*x[i])) - y[i];
1075 int df(
const VectorXd &
b, MatrixXd &fjac)
1077 assert(b.size()==3);
1078 assert(fjac.rows()==9);
1079 assert(fjac.cols()==3);
1080 for(
int i=0; i<9; i++) {
1081 double e =
exp(b[1]-b[2]*x[i]);
1082 fjac(i,0) = 1./(1.+e);
1083 fjac(i,1) = -b[0]*e/(1.+e)/(1.+e);
1084 fjac(i,2) = +b[0]*e*x[i]/(1.+e)/(1.+e);
1089 const double rat42_functor::x[9] = { 9.000E0, 14.000E0, 21.000E0, 28.000E0, 42.000E0, 57.000E0, 63.000E0, 70.000E0, 79.000E0 };
1090 const double rat42_functor::y[9] = { 8.930E0 ,10.800E0 ,18.590E0 ,22.330E0 ,39.350E0 ,56.110E0 ,61.730E0 ,64.620E0 ,67.080E0 };
1106 LevenbergMarquardt<rat42_functor> lm(functor);
1107 info = lm.minimize(x);
1110 VERIFY_IS_EQUAL(info, 1);
1111 VERIFY_IS_EQUAL(lm.nfev, 10);
1112 VERIFY_IS_EQUAL(lm.njev, 8);
1114 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.0565229338E+00);
1116 VERIFY_IS_APPROX(x[0], 7.2462237576E+01);
1117 VERIFY_IS_APPROX(x[1], 2.6180768402E+00);
1118 VERIFY_IS_APPROX(x[2], 6.7359200066E-02);
1125 info = lm.minimize(x);
1128 VERIFY_IS_EQUAL(info, 1);
1129 VERIFY_IS_EQUAL(lm.nfev, 6);
1130 VERIFY_IS_EQUAL(lm.njev, 5);
1132 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.0565229338E+00);
1134 VERIFY_IS_APPROX(x[0], 7.2462237576E+01);
1135 VERIFY_IS_APPROX(x[1], 2.6180768402E+00);
1136 VERIFY_IS_APPROX(x[2], 6.7359200066E-02);
1142 static const double x[16];
1143 static const double y[16];
1146 assert(b.size()==3);
1147 assert(fvec.size()==16);
1148 for(
int i=0; i<16; i++)
1149 fvec[i] = b[0] *
exp(b[1]/(x[i]+b[2])) - y[i];
1152 int df(
const VectorXd &
b, MatrixXd &fjac)
1154 assert(b.size()==3);
1155 assert(fjac.rows()==16);
1156 assert(fjac.cols()==3);
1157 for(
int i=0; i<16; i++) {
1158 double factor = 1./(x[i]+b[2]);
1159 double e =
exp(b[1]*factor);
1161 fjac(i,1) = b[0]*factor*e;
1162 fjac(i,2) = -b[1]*b[0]*factor*factor*e;
1167 const double MGH10_functor::x[16] = { 5.000000E+01, 5.500000E+01, 6.000000E+01, 6.500000E+01, 7.000000E+01, 7.500000E+01, 8.000000E+01, 8.500000E+01, 9.000000E+01, 9.500000E+01, 1.000000E+02, 1.050000E+02, 1.100000E+02, 1.150000E+02, 1.200000E+02, 1.250000E+02 };
1168 const double MGH10_functor::y[16] = { 3.478000E+04, 2.861000E+04, 2.365000E+04, 1.963000E+04, 1.637000E+04, 1.372000E+04, 1.154000E+04, 9.744000E+03, 8.261000E+03, 7.030000E+03, 6.005000E+03, 5.147000E+03, 4.427000E+03, 3.820000E+03, 3.307000E+03, 2.872000E+03 };
1181 x<< 2., 400000., 25000.;
1184 LevenbergMarquardt<MGH10_functor> lm(functor);
1185 info = lm.minimize(x);
1188 VERIFY_IS_EQUAL(info, 2);
1189 VERIFY_IS_EQUAL(lm.nfev, 284 );
1190 VERIFY_IS_EQUAL(lm.njev, 249 );
1192 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7945855171E+01);
1194 VERIFY_IS_APPROX(x[0], 5.6096364710E-03);
1195 VERIFY_IS_APPROX(x[1], 6.1813463463E+03);
1196 VERIFY_IS_APPROX(x[2], 3.4522363462E+02);
1201 x<< 0.02, 4000., 250.;
1203 info = lm.minimize(x);
1206 VERIFY_IS_EQUAL(info, 3);
1207 VERIFY_IS_EQUAL(lm.nfev, 126);
1208 VERIFY_IS_EQUAL(lm.njev, 116);
1210 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7945855171E+01);
1212 VERIFY_IS_APPROX(x[0], 5.6096364710E-03);
1213 VERIFY_IS_APPROX(x[1], 6.1813463463E+03);
1214 VERIFY_IS_APPROX(x[2], 3.4522363462E+02);
1221 static const double x[6];
1224 static const double y[6] = { 109., 149., 149., 191., 213., 224. };
1225 assert(b.size()==2);
1226 assert(fvec.size()==6);
1227 for(
int i=0; i<6; i++)
1228 fvec[i] = b[0]*(1.-
exp(-b[1]*x[i])) - y[i];
1231 int df(
const VectorXd &
b, MatrixXd &fjac)
1233 assert(b.size()==2);
1234 assert(fjac.rows()==6);
1235 assert(fjac.cols()==2);
1236 for(
int i=0; i<6; i++) {
1237 double e =
exp(-b[1]*x[i]);
1239 fjac(i,1) = b[0]*x[i]*e;
1260 LevenbergMarquardt<BoxBOD_functor> lm(functor);
1261 lm.parameters.ftol = 1.E6*NumTraits<double>::epsilon();
1262 lm.parameters.xtol = 1.E6*NumTraits<double>::epsilon();
1263 lm.parameters.factor = 10.;
1264 info = lm.minimize(x);
1267 VERIFY_IS_EQUAL(info, 1);
1268 VERIFY(lm.nfev < 31);
1269 VERIFY(lm.njev < 25);
1271 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.1680088766E+03);
1273 VERIFY_IS_APPROX(x[0], 2.1380940889E+02);
1274 VERIFY_IS_APPROX(x[1], 5.4723748542E-01);
1281 lm.resetParameters();
1282 lm.parameters.ftol = NumTraits<double>::epsilon();
1283 lm.parameters.xtol = NumTraits<double>::epsilon();
1284 info = lm.minimize(x);
1287 VERIFY_IS_EQUAL(info, 1);
1288 VERIFY_IS_EQUAL(lm.nfev, 15 );
1289 VERIFY_IS_EQUAL(lm.njev, 14 );
1291 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.1680088766E+03);
1293 VERIFY_IS_APPROX(x[0], 2.1380940889E+02);
1294 VERIFY_IS_APPROX(x[1], 5.4723748542E-01);
1300 static const double x[33];
1301 static const double y[33];
1304 assert(b.size()==5);
1305 assert(fvec.size()==33);
1306 for(
int i=0; i<33; i++)
1307 fvec[i] = b[0] + b[1]*
exp(-b[3]*x[i]) + b[2]*
exp(-b[4]*x[i]) - y[i];
1310 int df(
const VectorXd &
b, MatrixXd &fjac)
1312 assert(b.size()==5);
1313 assert(fjac.rows()==33);
1314 assert(fjac.cols()==5);
1315 for(
int i=0; i<33; i++) {
1317 fjac(i,1) =
exp(-b[3]*x[i]);
1318 fjac(i,2) =
exp(-b[4]*x[i]);
1319 fjac(i,3) = -x[i]*b[1]*
exp(-b[3]*x[i]);
1320 fjac(i,4) = -x[i]*b[2]*
exp(-b[4]*x[i]);
1325 const double MGH17_functor::x[33] = { 0.000000E+00, 1.000000E+01, 2.000000E+01, 3.000000E+01, 4.000000E+01, 5.000000E+01, 6.000000E+01, 7.000000E+01, 8.000000E+01, 9.000000E+01, 1.000000E+02, 1.100000E+02, 1.200000E+02, 1.300000E+02, 1.400000E+02, 1.500000E+02, 1.600000E+02, 1.700000E+02, 1.800000E+02, 1.900000E+02, 2.000000E+02, 2.100000E+02, 2.200000E+02, 2.300000E+02, 2.400000E+02, 2.500000E+02, 2.600000E+02, 2.700000E+02, 2.800000E+02, 2.900000E+02, 3.000000E+02, 3.100000E+02, 3.200000E+02 };
1326 const double MGH17_functor::y[33] = { 8.440000E-01, 9.080000E-01, 9.320000E-01, 9.360000E-01, 9.250000E-01, 9.080000E-01, 8.810000E-01, 8.500000E-01, 8.180000E-01, 7.840000E-01, 7.510000E-01, 7.180000E-01, 6.850000E-01, 6.580000E-01, 6.280000E-01, 6.030000E-01, 5.800000E-01, 5.580000E-01, 5.380000E-01, 5.220000E-01, 5.060000E-01, 4.900000E-01, 4.780000E-01, 4.670000E-01, 4.570000E-01, 4.480000E-01, 4.380000E-01, 4.310000E-01, 4.240000E-01, 4.200000E-01, 4.140000E-01, 4.110000E-01, 4.060000E-01 };
1339 x<< 50., 150., -100., 1., 2.;
1342 LevenbergMarquardt<MGH17_functor> lm(functor);
1343 lm.parameters.ftol = NumTraits<double>::epsilon();
1344 lm.parameters.xtol = NumTraits<double>::epsilon();
1345 lm.parameters.maxfev = 1000;
1346 info = lm.minimize(x);
1349 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.4648946975E-05);
1351 VERIFY_IS_APPROX(x[0], 3.7541005211E-01);
1352 VERIFY_IS_APPROX(x[1], 1.9358469127E+00);
1353 VERIFY_IS_APPROX(x[2], -1.4646871366E+00);
1354 VERIFY_IS_APPROX(x[3], 1.2867534640E-02);
1355 VERIFY_IS_APPROX(x[4], 2.2122699662E-02);
1358 VERIFY_IS_EQUAL(info, 2);
1360 VERIFY_IS_EQUAL(lm.nfev, 602);
1361 VERIFY_IS_EQUAL(lm.njev, 545);
1369 x<< 0.5 ,1.5 ,-1 ,0.01 ,0.02;
1371 lm.resetParameters();
1372 info = lm.minimize(x);
1375 VERIFY_IS_EQUAL(info, 1);
1376 VERIFY_IS_EQUAL(lm.nfev, 18);
1377 VERIFY_IS_EQUAL(lm.njev, 15);
1379 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.4648946975E-05);
1381 VERIFY_IS_APPROX(x[0], 3.7541005211E-01);
1382 VERIFY_IS_APPROX(x[1], 1.9358469127E+00);
1383 VERIFY_IS_APPROX(x[2], -1.4646871366E+00);
1384 VERIFY_IS_APPROX(x[3], 1.2867534640E-02);
1385 VERIFY_IS_APPROX(x[4], 2.2122699662E-02);
1391 static const double _x[11];
1392 static const double y[11];
1395 assert(b.size()==4);
1396 assert(fvec.size()==11);
1397 for(
int i=0; i<11; i++) {
1398 double x = _x[i], xx=x*x;
1399 fvec[i] = b[0]*(xx+x*b[1])/(xx+x*b[2]+b[3]) - y[i];
1403 int df(
const VectorXd &
b, MatrixXd &fjac)
1405 assert(b.size()==4);
1406 assert(fjac.rows()==11);
1407 assert(fjac.cols()==4);
1408 for(
int i=0; i<11; i++) {
1409 double x = _x[i], xx=x*x;
1410 double factor = 1./(xx+x*b[2]+b[3]);
1411 fjac(i,0) = (xx+x*b[1]) * factor;
1412 fjac(i,1) = b[0]*x* factor;
1413 fjac(i,2) = - b[0]*(xx+x*b[1]) * x * factor * factor;
1414 fjac(i,3) = - b[0]*(xx+x*b[1]) * factor * factor;
1419 const double MGH09_functor::_x[11] = { 4., 2., 1., 5.E-1 , 2.5E-01, 1.670000E-01, 1.250000E-01, 1.E-01, 8.330000E-02, 7.140000E-02, 6.250000E-02 };
1420 const double MGH09_functor::y[11] = { 1.957000E-01, 1.947000E-01, 1.735000E-01, 1.600000E-01, 8.440000E-02, 6.270000E-02, 4.560000E-02, 3.420000E-02, 3.230000E-02, 2.350000E-02, 2.460000E-02 };
1433 x<< 25., 39, 41.5, 39.;
1436 LevenbergMarquardt<MGH09_functor> lm(functor);
1437 lm.parameters.maxfev = 1000;
1438 info = lm.minimize(x);
1441 VERIFY_IS_EQUAL(info, 1);
1442 VERIFY_IS_EQUAL(lm.nfev, 490 );
1443 VERIFY_IS_EQUAL(lm.njev, 376 );
1445 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 3.0750560385E-04);
1447 VERIFY_IS_APPROX(x[0], 0.1928077089);
1448 VERIFY_IS_APPROX(x[1], 0.19126423573);
1449 VERIFY_IS_APPROX(x[2], 0.12305309914);
1450 VERIFY_IS_APPROX(x[3], 0.13605395375);
1455 x<< 0.25, 0.39, 0.415, 0.39;
1457 lm.resetParameters();
1458 info = lm.minimize(x);
1461 VERIFY_IS_EQUAL(info, 1);
1462 VERIFY_IS_EQUAL(lm.nfev, 18);
1463 VERIFY_IS_EQUAL(lm.njev, 16);
1465 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 3.0750560385E-04);
1467 VERIFY_IS_APPROX(x[0], 0.19280781);
1468 VERIFY_IS_APPROX(x[1], 0.19126265);
1469 VERIFY_IS_APPROX(x[2], 0.12305280);
1470 VERIFY_IS_APPROX(x[3], 0.13605322);
1478 static const double x[154];
1479 static const double y[154];
1482 assert(b.size()==3);
1483 assert(fvec.size()==154);
1484 for(
int i=0; i<154; i++)
1485 fvec[i] = b[0]*
pow(b[1]+x[i],-1./b[2]) - y[i];
1488 int df(
const VectorXd &
b, MatrixXd &fjac)
1490 assert(b.size()==3);
1491 assert(fjac.rows()==154);
1492 assert(fjac.cols()==3);
1493 for(
int i=0; i<154; i++) {
1494 double e =
pow(b[1]+x[i],-1./b[2]);
1496 fjac(i,1) = - b[0]*e/b[2]/(b[1]+x[i]);
1497 fjac(i,2) = b[0]*e*
log(b[1]+x[i])/b[2]/b[2];
1502 const double Bennett5_functor::x[154] = { 7.447168E0, 8.102586E0, 8.452547E0, 8.711278E0, 8.916774E0, 9.087155E0, 9.232590E0, 9.359535E0, 9.472166E0, 9.573384E0, 9.665293E0, 9.749461E0, 9.827092E0, 9.899128E0, 9.966321E0, 10.029280E0, 10.088510E0, 10.144430E0, 10.197380E0, 10.247670E0, 10.295560E0, 10.341250E0, 10.384950E0, 10.426820E0, 10.467000E0, 10.505640E0, 10.542830E0, 10.578690E0, 10.613310E0, 10.646780E0, 10.679150E0, 10.710520E0, 10.740920E0, 10.770440E0, 10.799100E0, 10.826970E0, 10.854080E0, 10.880470E0, 10.906190E0, 10.931260E0, 10.955720E0, 10.979590E0, 11.002910E0, 11.025700E0, 11.047980E0, 11.069770E0, 11.091100E0, 11.111980E0, 11.132440E0, 11.152480E0, 11.172130E0, 11.191410E0, 11.210310E0, 11.228870E0, 11.247090E0, 11.264980E0, 11.282560E0, 11.299840E0, 11.316820E0, 11.333520E0, 11.349940E0, 11.366100E0, 11.382000E0, 11.397660E0, 11.413070E0, 11.428240E0, 11.443200E0, 11.457930E0, 11.472440E0, 11.486750E0, 11.500860E0, 11.514770E0, 11.528490E0, 11.542020E0, 11.555380E0, 11.568550E0,
1503 11.581560E0, 11.594420E0, 11.607121E0, 11.619640E0, 11.632000E0, 11.644210E0, 11.656280E0, 11.668200E0, 11.679980E0, 11.691620E0, 11.703130E0, 11.714510E0, 11.725760E0, 11.736880E0, 11.747890E0, 11.758780E0, 11.769550E0, 11.780200E0, 11.790730E0, 11.801160E0, 11.811480E0, 11.821700E0, 11.831810E0, 11.841820E0, 11.851730E0, 11.861550E0, 11.871270E0, 11.880890E0, 11.890420E0, 11.899870E0, 11.909220E0, 11.918490E0, 11.927680E0, 11.936780E0, 11.945790E0, 11.954730E0, 11.963590E0, 11.972370E0, 11.981070E0, 11.989700E0, 11.998260E0, 12.006740E0, 12.015150E0, 12.023490E0, 12.031760E0, 12.039970E0, 12.048100E0, 12.056170E0, 12.064180E0, 12.072120E0, 12.080010E0, 12.087820E0, 12.095580E0, 12.103280E0, 12.110920E0, 12.118500E0, 12.126030E0, 12.133500E0, 12.140910E0, 12.148270E0, 12.155570E0, 12.162830E0, 12.170030E0, 12.177170E0, 12.184270E0, 12.191320E0, 12.198320E0, 12.205270E0, 12.212170E0, 12.219030E0, 12.225840E0, 12.232600E0, 12.239320E0, 12.245990E0, 12.252620E0, 12.259200E0, 12.265750E0, 12.272240E0 };
1504 const double Bennett5_functor::y[154] = { -34.834702E0 ,-34.393200E0 ,-34.152901E0 ,-33.979099E0 ,-33.845901E0 ,-33.732899E0 ,-33.640301E0 ,-33.559200E0 ,-33.486801E0 ,-33.423100E0 ,-33.365101E0 ,-33.313000E0 ,-33.260899E0 ,-33.217400E0 ,-33.176899E0 ,-33.139198E0 ,-33.101601E0 ,-33.066799E0 ,-33.035000E0 ,-33.003101E0 ,-32.971298E0 ,-32.942299E0 ,-32.916302E0 ,-32.890202E0 ,-32.864101E0 ,-32.841000E0 ,-32.817799E0 ,-32.797501E0 ,-32.774300E0 ,-32.757000E0 ,-32.733799E0 ,-32.716400E0 ,-32.699100E0 ,-32.678799E0 ,-32.661400E0 ,-32.644001E0 ,-32.626701E0 ,-32.612202E0 ,-32.597698E0 ,-32.583199E0 ,-32.568699E0 ,-32.554298E0 ,-32.539799E0 ,-32.525299E0 ,-32.510799E0 ,-32.499199E0 ,-32.487598E0 ,-32.473202E0 ,-32.461601E0 ,-32.435501E0 ,-32.435501E0 ,-32.426800E0 ,-32.412300E0 ,-32.400799E0 ,-32.392101E0 ,-32.380501E0 ,-32.366001E0 ,-32.357300E0 ,-32.348598E0 ,-32.339901E0 ,-32.328400E0 ,-32.319698E0 ,-32.311001E0 ,-32.299400E0 ,-32.290699E0 ,-32.282001E0 ,-32.273300E0 ,-32.264599E0 ,-32.256001E0 ,-32.247299E0
1505 ,-32.238602E0 ,-32.229900E0 ,-32.224098E0 ,-32.215401E0 ,-32.203800E0 ,-32.198002E0 ,-32.189400E0 ,-32.183601E0 ,-32.174900E0 ,-32.169102E0 ,-32.163300E0 ,-32.154598E0 ,-32.145901E0 ,-32.140099E0 ,-32.131401E0 ,-32.125599E0 ,-32.119801E0 ,-32.111198E0 ,-32.105400E0 ,-32.096699E0 ,-32.090900E0 ,-32.088001E0 ,-32.079300E0 ,-32.073502E0 ,-32.067699E0 ,-32.061901E0 ,-32.056099E0 ,-32.050301E0 ,-32.044498E0 ,-32.038799E0 ,-32.033001E0 ,-32.027199E0 ,-32.024300E0 ,-32.018501E0 ,-32.012699E0 ,-32.004002E0 ,-32.001099E0 ,-31.995300E0 ,-31.989500E0 ,-31.983700E0 ,-31.977900E0 ,-31.972099E0 ,-31.969299E0 ,-31.963501E0 ,-31.957701E0 ,-31.951900E0 ,-31.946100E0 ,-31.940300E0 ,-31.937401E0 ,-31.931601E0 ,-31.925800E0 ,-31.922899E0 ,-31.917101E0 ,-31.911301E0 ,-31.908400E0 ,-31.902599E0 ,-31.896900E0 ,-31.893999E0 ,-31.888201E0 ,-31.885300E0 ,-31.882401E0 ,-31.876600E0 ,-31.873699E0 ,-31.867901E0 ,-31.862101E0 ,-31.859200E0 ,-31.856300E0 ,-31.850500E0 ,-31.844700E0 ,-31.841801E0 ,-31.838900E0 ,-31.833099E0 ,-31.830200E0 ,
1506 -31.827299E0 ,-31.821600E0 ,-31.818701E0 ,-31.812901E0 ,-31.809999E0 ,-31.807100E0 ,-31.801300E0 ,-31.798401E0 ,-31.795500E0 ,-31.789700E0 ,-31.786800E0 };
1519 x<< -2000., 50., 0.8;
1522 LevenbergMarquardt<Bennett5_functor> lm(functor);
1523 lm.parameters.maxfev = 1000;
1524 info = lm.minimize(x);
1527 VERIFY_IS_EQUAL(info, 1);
1528 VERIFY_IS_EQUAL(lm.nfev, 758);
1529 VERIFY_IS_EQUAL(lm.njev, 744);
1531 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.2404744073E-04);
1533 VERIFY_IS_APPROX(x[0], -2.5235058043E+03);
1534 VERIFY_IS_APPROX(x[1], 4.6736564644E+01);
1535 VERIFY_IS_APPROX(x[2], 9.3218483193E-01);
1539 x<< -1500., 45., 0.85;
1541 lm.resetParameters();
1542 info = lm.minimize(x);
1545 VERIFY_IS_EQUAL(info, 1);
1546 VERIFY_IS_EQUAL(lm.nfev, 203);
1547 VERIFY_IS_EQUAL(lm.njev, 192);
1549 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.2404744073E-04);
1551 VERIFY_IS_APPROX(x[0], -2523.3007865);
1552 VERIFY_IS_APPROX(x[1], 46.735705771);
1553 VERIFY_IS_APPROX(x[2], 0.93219881891);
1559 static const double _x[37];
1560 static const double _y[37];
1564 assert(b.size()==7);
1565 assert(fvec.size()==37);
1566 for(
int i=0; i<37; i++) {
1567 double x=_x[i], xx=x*x, xxx=xx*x;
1568 fvec[i] = (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) / (1.+b[4]*x+b[5]*xx+b[6]*xxx) - _y[i];
1572 int df(
const VectorXd &
b, MatrixXd &fjac)
1574 assert(b.size()==7);
1575 assert(fjac.rows()==37);
1576 assert(fjac.cols()==7);
1577 for(
int i=0; i<37; i++) {
1578 double x=_x[i], xx=x*x, xxx=xx*x;
1579 double fact = 1./(1.+b[4]*x+b[5]*xx+b[6]*xxx);
1580 fjac(i,0) = 1.*fact;
1582 fjac(i,2) = xx*fact;
1583 fjac(i,3) = xxx*fact;
1584 fact = - (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) * fact * fact;
1586 fjac(i,5) = xx*fact;
1587 fjac(i,6) = xxx*fact;
1592 const double thurber_functor::_x[37] = { -3.067E0, -2.981E0, -2.921E0, -2.912E0, -2.840E0, -2.797E0, -2.702E0, -2.699E0, -2.633E0, -2.481E0, -2.363E0, -2.322E0, -1.501E0, -1.460E0, -1.274E0, -1.212E0, -1.100E0, -1.046E0, -0.915E0, -0.714E0, -0.566E0, -0.545E0, -0.400E0, -0.309E0, -0.109E0, -0.103E0, 0.010E0, 0.119E0, 0.377E0, 0.790E0, 0.963E0, 1.006E0, 1.115E0, 1.572E0, 1.841E0, 2.047E0, 2.200E0 };
1593 const double thurber_functor::_y[37] = { 80.574E0, 84.248E0, 87.264E0, 87.195E0, 89.076E0, 89.608E0, 89.868E0, 90.101E0, 92.405E0, 95.854E0, 100.696E0, 101.060E0, 401.672E0, 390.724E0, 567.534E0, 635.316E0, 733.054E0, 759.087E0, 894.206E0, 990.785E0, 1090.109E0, 1080.914E0, 1122.643E0, 1178.351E0, 1260.531E0, 1273.514E0, 1288.339E0, 1327.543E0, 1353.863E0, 1414.509E0, 1425.208E0, 1421.384E0, 1442.962E0, 1464.350E0, 1468.705E0, 1447.894E0, 1457.628E0};
1606 x<< 1000 ,1000 ,400 ,40 ,0.7,0.3,0.0 ;
1609 LevenbergMarquardt<thurber_functor> lm(functor);
1610 lm.parameters.ftol = 1.E4*NumTraits<double>::epsilon();
1611 lm.parameters.xtol = 1.E4*NumTraits<double>::epsilon();
1612 info = lm.minimize(x);
1615 VERIFY_IS_EQUAL(info, 1);
1616 VERIFY_IS_EQUAL(lm.nfev, 39);
1617 VERIFY_IS_EQUAL(lm.njev, 36);
1619 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6427082397E+03);
1621 VERIFY_IS_APPROX(x[0], 1.2881396800E+03);
1622 VERIFY_IS_APPROX(x[1], 1.4910792535E+03);
1623 VERIFY_IS_APPROX(x[2], 5.8323836877E+02);
1624 VERIFY_IS_APPROX(x[3], 7.5416644291E+01);
1625 VERIFY_IS_APPROX(x[4], 9.6629502864E-01);
1626 VERIFY_IS_APPROX(x[5], 3.9797285797E-01);
1627 VERIFY_IS_APPROX(x[6], 4.9727297349E-02);
1632 x<< 1300 ,1500 ,500 ,75 ,1 ,0.4 ,0.05 ;
1634 lm.resetParameters();
1635 lm.parameters.ftol = 1.E4*NumTraits<double>::epsilon();
1636 lm.parameters.xtol = 1.E4*NumTraits<double>::epsilon();
1637 info = lm.minimize(x);
1640 VERIFY_IS_EQUAL(info, 1);
1641 VERIFY_IS_EQUAL(lm.nfev, 29);
1642 VERIFY_IS_EQUAL(lm.njev, 28);
1644 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 5.6427082397E+03);
1646 VERIFY_IS_APPROX(x[0], 1.2881396800E+03);
1647 VERIFY_IS_APPROX(x[1], 1.4910792535E+03);
1648 VERIFY_IS_APPROX(x[2], 5.8323836877E+02);
1649 VERIFY_IS_APPROX(x[3], 7.5416644291E+01);
1650 VERIFY_IS_APPROX(x[4], 9.6629502864E-01);
1651 VERIFY_IS_APPROX(x[5], 3.9797285797E-01);
1652 VERIFY_IS_APPROX(x[6], 4.9727297349E-02);
1658 static const double x[15];
1659 static const double y[15];
1662 assert(b.size()==4);
1663 assert(fvec.size()==15);
1664 for(
int i=0; i<15; i++)
1665 fvec[i] = b[0] *
pow(1.+
exp(b[1]-b[2]*x[i]),-1./b[3]) - y[i];
1668 int df(
const VectorXd &
b, MatrixXd &fjac)
1670 assert(b.size()==4);
1671 assert(fjac.rows()==15);
1672 assert(fjac.cols()==4);
1673 for(
int i=0; i<15; i++) {
1674 double e =
exp(b[1]-b[2]*x[i]);
1675 double power = -1./b[3];
1676 fjac(i,0) =
pow(1.+e, power);
1677 fjac(i,1) = power*b[0]*e*
pow(1.+e, power-1.);
1678 fjac(i,2) = -power*b[0]*e*x[i]*
pow(1.+e, power-1.);
1679 fjac(i,3) = b[0]*power*power*
log(1.+e)*
pow(1.+e, power);
1684 const double rat43_functor::x[15] = { 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14., 15. };
1685 const double rat43_functor::y[15] = { 16.08, 33.83, 65.80, 97.20, 191.55, 326.20, 386.87, 520.53, 590.03, 651.92, 724.93, 699.56, 689.96, 637.56, 717.41 };
1698 x<< 100., 10., 1., 1.;
1701 LevenbergMarquardt<rat43_functor> lm(functor);
1702 lm.parameters.ftol = 1.E6*NumTraits<double>::epsilon();
1703 lm.parameters.xtol = 1.E6*NumTraits<double>::epsilon();
1704 info = lm.minimize(x);
1707 VERIFY_IS_EQUAL(info, 1);
1708 VERIFY_IS_EQUAL(lm.nfev, 27);
1709 VERIFY_IS_EQUAL(lm.njev, 20);
1711 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7864049080E+03);
1713 VERIFY_IS_APPROX(x[0], 6.9964151270E+02);
1714 VERIFY_IS_APPROX(x[1], 5.2771253025E+00);
1715 VERIFY_IS_APPROX(x[2], 7.5962938329E-01);
1716 VERIFY_IS_APPROX(x[3], 1.2792483859E+00);
1721 x<< 700., 5., 0.75, 1.3;
1723 lm.resetParameters();
1724 lm.parameters.ftol = 1.E5*NumTraits<double>::epsilon();
1725 lm.parameters.xtol = 1.E5*NumTraits<double>::epsilon();
1726 info = lm.minimize(x);
1729 VERIFY_IS_EQUAL(info, 1);
1730 VERIFY_IS_EQUAL(lm.nfev, 9);
1731 VERIFY_IS_EQUAL(lm.njev, 8);
1733 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 8.7864049080E+03);
1735 VERIFY_IS_APPROX(x[0], 6.9964151270E+02);
1736 VERIFY_IS_APPROX(x[1], 5.2771253025E+00);
1737 VERIFY_IS_APPROX(x[2], 7.5962938329E-01);
1738 VERIFY_IS_APPROX(x[3], 1.2792483859E+00);
1746 static const double x[35];
1747 static const double y[35];
1750 assert(b.size()==3);
1751 assert(fvec.size()==35);
1752 for(
int i=0; i<35; i++)
1753 fvec[i] = b[0]/b[1] *
exp(-0.5*(x[i]-b[2])*(x[i]-b[2])/(b[1]*b[1])) - y[i];
1756 int df(
const VectorXd &
b, MatrixXd &fjac)
1758 assert(b.size()==3);
1759 assert(fjac.rows()==35);
1760 assert(fjac.cols()==3);
1761 for(
int i=0; i<35; i++) {
1762 double b12 = b[1]*b[1];
1763 double e =
exp(-0.5*(x[i]-b[2])*(x[i]-b[2])/b12);
1764 fjac(i,0) = e / b[1];
1765 fjac(i,1) = ((x[i]-b[2])*(x[i]-b[2])/b12-1.) * b[0]*e/b12;
1766 fjac(i,2) = (x[i]-b[2])*e*b[0]/b[1]/b12;
1771 const double eckerle4_functor::x[35] = { 400.0, 405.0, 410.0, 415.0, 420.0, 425.0, 430.0, 435.0, 436.5, 438.0, 439.5, 441.0, 442.5, 444.0, 445.5, 447.0, 448.5, 450.0, 451.5, 453.0, 454.5, 456.0, 457.5, 459.0, 460.5, 462.0, 463.5, 465.0, 470.0, 475.0, 480.0, 485.0, 490.0, 495.0, 500.0};
1772 const double eckerle4_functor::y[35] = { 0.0001575, 0.0001699, 0.0002350, 0.0003102, 0.0004917, 0.0008710, 0.0017418, 0.0046400, 0.0065895, 0.0097302, 0.0149002, 0.0237310, 0.0401683, 0.0712559, 0.1264458, 0.2073413, 0.2902366, 0.3445623, 0.3698049, 0.3668534, 0.3106727, 0.2078154, 0.1164354, 0.0616764, 0.0337200, 0.0194023, 0.0117831, 0.0074357, 0.0022732, 0.0008800, 0.0004579, 0.0002345, 0.0001586, 0.0001143, 0.0000710 };
1788 LevenbergMarquardt<eckerle4_functor> lm(functor);
1789 info = lm.minimize(x);
1792 VERIFY_IS_EQUAL(info, 1);
1793 VERIFY_IS_EQUAL(lm.nfev, 18);
1794 VERIFY_IS_EQUAL(lm.njev, 15);
1796 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.4635887487E-03);
1798 VERIFY_IS_APPROX(x[0], 1.5543827178);
1799 VERIFY_IS_APPROX(x[1], 4.0888321754);
1800 VERIFY_IS_APPROX(x[2], 4.5154121844E+02);
1807 info = lm.minimize(x);
1810 VERIFY_IS_EQUAL(info, 1);
1811 VERIFY_IS_EQUAL(lm.nfev, 7);
1812 VERIFY_IS_EQUAL(lm.njev, 6);
1814 VERIFY_IS_APPROX(lm.fvec.squaredNorm(), 1.4635887487E-03);
1816 VERIFY_IS_APPROX(x[0], 1.5543827178);
1817 VERIFY_IS_APPROX(x[1], 4.0888321754);
1818 VERIFY_IS_APPROX(x[2], 4.5154121844E+02);
int df(const VectorXd &b, MatrixXd &fjac)
Matrix< Scalar, ValuesAtCompileTime, InputsAtCompileTime > JacobianType
int operator()(const VectorXd &b, VectorXd &fvec)
int operator()(const VectorXd &b, VectorXd &fvec)
int df(const VectorXd &b, MatrixXd &fjac)
void testNistChwirut2(void)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half pow(const half &a, const half &b)
void testNistBoxBOD(void)
static const double y[154]
void test_NonLinearOptimization()
int operator()(const VectorXd &b, VectorXd &fvec)
static const double y[11]
static const double m_y[14]
static const double _y[37]
EIGEN_DEVICE_FUNC const ExpReturnType exp() const
int operator()(const VectorXd &b, VectorXd &fvec)
void testNistMisra1d(void)
int df(const VectorXd &b, MatrixXd &fjac)
int df(const VectorXd &b, MatrixXd &fjac)
int df(const VectorXd &b, MatrixXd &fjac)
int df(const VectorXd &b, MatrixXd &fjac)
EIGEN_DEVICE_FUNC const LogReturnType log() const
static const double x[16]
int df(const VectorXd &b, MatrixXd &fjac)
static const double x[15]
static const double x[35]
#define LM_EVAL_COUNT_TOL
int operator()(const VectorXd &b, VectorXd &fvec)
static const double y[33]
int operator()(const VectorXd &x, VectorXd &fvec) const
int operator()(const VectorXd &x, VectorXd &fvec)
static const double x[154]
int operator()(const VectorXd &b, VectorXd &fvec)
Matrix< Scalar, InputsAtCompileTime, 1 > InputType
static const double y[14]
static const double y[35]
int operator()(const VectorXd &b, VectorXd &fvec)
int operator()(const VectorXd &b, VectorXd &fvec)
int df(const VectorXd &b, MatrixXd &fjac)
Matrix< Scalar, ValuesAtCompileTime, 1 > ValueType
static const double _x[11]
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
void testNistLanczos1(void)
static const double x[14]
int operator()(const VectorXd &b, VectorXd &fvec)
static const double y[24]
int operator()(const VectorXd &b, VectorXd &fvec)
static const double m_x[14]
static const double m_x[236]
int fcn_chkder(const VectorXd &x, VectorXd &fvec, MatrixXd &fjac, int iflag)
Functor(int inputs, int values)
static const double m_x[54]
int df(const VectorXd &x, MatrixXd &fjac) const
EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex
void testNistBennett5(void)
static const double x[33]
static const double _x[37]
void covar(Matrix< Scalar, Dynamic, Dynamic > &r, const VectorXi &ipvt, Scalar tol=std::sqrt(NumTraits< Scalar >::epsilon()))
int operator()(const VectorXd &b, VectorXd &fvec)
int operator()(const VectorXd &x, VectorXd &fvec) const
int operator()(const VectorXd &x, VectorXd &fvec) const
int df(const VectorXd &b, MatrixXd &fjac)
int df(const VectorXd &b, MatrixXd &fjac)
int df(const VectorXd &b, MatrixXd &fjac)
void testNistEckerle4(void)
void chkder(const Matrix< Scalar, Dynamic, 1 > &x, const Matrix< Scalar, Dynamic, 1 > &fvec, const Matrix< Scalar, Dynamic, Dynamic > &fjac, Matrix< Scalar, Dynamic, 1 > &xp, const Matrix< Scalar, Dynamic, 1 > &fvecp, int mode, Matrix< Scalar, Dynamic, 1 > &err)
int df(const VectorXd &x, MatrixXd &fjac)
int operator()(const VectorXd &b, VectorXd &fvec)
int operator()(const VectorXd &b, VectorXd &fvec)
static const double y[15]
static const double y[16]
int df(const VectorXd &b, MatrixXd &fjac)
void testNistMisra1a(void)
EIGEN_DEVICE_FUNC const Scalar & b
int df(const VectorXd &b, MatrixXd &fjac)
int df(const VectorXd &b, MatrixXd &fjac)
int operator()(const VectorXd &b, VectorXd &fvec)
int operator()(const VectorXd &x, VectorXd &fvec)
static const double m_y[54]
int df(const VectorXd &x, VectorXd &jac_row, VectorXd::Index rownb)
void testNistThurber(void)
static const double x[24]