mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-14 04:35:57 +08:00
use eigen objects for the lmder callback
This commit is contained in:
parent
2727099906
commit
3251e12258
@ -64,7 +64,7 @@ L20:
|
|||||||
/* evaluate the function at the starting point */
|
/* evaluate the function at the starting point */
|
||||||
/* and calculate its norm. */
|
/* and calculate its norm. */
|
||||||
|
|
||||||
iflag = Functor::f(m, n, x.data(), fvec.data(), fjac.data(), ldfjac, 1);
|
iflag = Functor::f(x, fvec, fjac, 1);
|
||||||
nfev = 1;
|
nfev = 1;
|
||||||
if (iflag < 0) {
|
if (iflag < 0) {
|
||||||
goto L300;
|
goto L300;
|
||||||
@ -82,7 +82,7 @@ L30:
|
|||||||
|
|
||||||
/* calculate the jacobian matrix. */
|
/* calculate the jacobian matrix. */
|
||||||
|
|
||||||
iflag = Functor::f(m, n, x.data(), fvec.data(), fjac.data(), ldfjac, 2);
|
iflag = Functor::f(x, fvec, fjac, 2);
|
||||||
++njev;
|
++njev;
|
||||||
if (iflag < 0) {
|
if (iflag < 0) {
|
||||||
goto L300;
|
goto L300;
|
||||||
@ -95,7 +95,7 @@ L30:
|
|||||||
}
|
}
|
||||||
iflag = 0;
|
iflag = 0;
|
||||||
if ((iter - 1) % nprint == 0) {
|
if ((iter - 1) % nprint == 0) {
|
||||||
iflag = Functor::f(m, n, x.data(), fvec.data(), fjac.data(), ldfjac, 0);
|
iflag = Functor::f(x, fvec, fjac, 0);
|
||||||
}
|
}
|
||||||
if (iflag < 0) {
|
if (iflag < 0) {
|
||||||
goto L300;
|
goto L300;
|
||||||
@ -237,7 +237,7 @@ L200:
|
|||||||
|
|
||||||
/* evaluate the function at x + p and calculate its norm. */
|
/* evaluate the function at x + p and calculate its norm. */
|
||||||
|
|
||||||
iflag = Functor::f(m, n, wa2.data(), wa4.data(), fjac.data(), ldfjac, 1);
|
iflag = Functor::f(wa2, wa4, fjac, 1);
|
||||||
++nfev;
|
++nfev;
|
||||||
if (iflag < 0) {
|
if (iflag < 0) {
|
||||||
goto L300;
|
goto L300;
|
||||||
@ -378,7 +378,7 @@ L300:
|
|||||||
}
|
}
|
||||||
iflag = 0;
|
iflag = 0;
|
||||||
if (nprint > 0) {
|
if (nprint > 0) {
|
||||||
iflag = Functor::f(m, n, x.data(), fvec.data(), fjac.data(), ldfjac, 0);
|
iflag = Functor::f(x, fvec, fjac, 0);
|
||||||
}
|
}
|
||||||
return info;
|
return info;
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ void testChkder()
|
|||||||
|
|
||||||
|
|
||||||
struct lmder_functor {
|
struct lmder_functor {
|
||||||
static int f(int /*m*/, int /*n*/, const double *x, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &x, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* subroutine fcn for lmder1 example. */
|
/* subroutine fcn for lmder1 example. */
|
||||||
@ -130,9 +130,9 @@ struct lmder_functor {
|
|||||||
tmp2 = 16 - i - 1;
|
tmp2 = 16 - i - 1;
|
||||||
tmp3 = (i>=8)? tmp2 : tmp1;
|
tmp3 = (i>=8)? tmp2 : tmp1;
|
||||||
tmp4 = (x[1]*tmp2 + x[2]*tmp3); tmp4 = tmp4*tmp4;
|
tmp4 = (x[1]*tmp2 + x[2]*tmp3); tmp4 = tmp4*tmp4;
|
||||||
fjac[i + ldfjac*(0)] = -1.;
|
fjac(i,0) = -1;
|
||||||
fjac[i + ldfjac*(1)] = tmp1*tmp2/tmp4;
|
fjac(i,1) = tmp1*tmp2/tmp4;
|
||||||
fjac[i + ldfjac*(2)] = tmp1*tmp3/tmp4;
|
fjac(i,2) = tmp1*tmp3/tmp4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -587,15 +587,16 @@ void testLmdif()
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct chwirut2_functor {
|
struct chwirut2_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double _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};
|
static const double _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};
|
||||||
static const double 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 };
|
static const double 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 };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(m==54);
|
assert(b.size()==3);
|
||||||
assert(n==3);
|
assert(fvec.size()==54);
|
||||||
assert(ldfjac==54);
|
assert(fjac.rows()==54);
|
||||||
|
assert(fjac.cols()==3);
|
||||||
if (iflag != 2) {// compute fvec at b
|
if (iflag != 2) {// compute fvec at b
|
||||||
for(i=0; i<54; i++) {
|
for(i=0; i<54; i++) {
|
||||||
double x = _x[i];
|
double x = _x[i];
|
||||||
@ -607,9 +608,9 @@ struct chwirut2_functor {
|
|||||||
double x = _x[i];
|
double x = _x[i];
|
||||||
double factor = 1./(b[1]+b[2]*x);
|
double factor = 1./(b[1]+b[2]*x);
|
||||||
double e = exp(-b[0]*x);
|
double e = exp(-b[0]*x);
|
||||||
fjac[i+ldfjac*0] = -x*e*factor;
|
fjac(i,0) = -x*e*factor;
|
||||||
fjac[i+ldfjac*1] = -e*factor*factor;
|
fjac(i,1) = -e*factor*factor;
|
||||||
fjac[i+ldfjac*2] = -x*e*factor*factor;
|
fjac(i,2) = -x*e*factor*factor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -666,15 +667,16 @@ void testNistChwirut2(void)
|
|||||||
|
|
||||||
|
|
||||||
struct misra1a_functor {
|
struct misra1a_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double 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};
|
static const double 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};
|
||||||
static const double 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};
|
static const double 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};
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(m==14);
|
assert(b.size()==2);
|
||||||
assert(n==2);
|
assert(fvec.size()==14);
|
||||||
assert(ldfjac==14);
|
assert(fjac.rows()==14);
|
||||||
|
assert(fjac.cols()==2);
|
||||||
if (iflag != 2) {// compute fvec at b
|
if (iflag != 2) {// compute fvec at b
|
||||||
for(i=0; i<14; i++) {
|
for(i=0; i<14; i++) {
|
||||||
fvec[i] = b[0]*(1.-exp(-b[1]*x[i])) - y[i] ;
|
fvec[i] = b[0]*(1.-exp(-b[1]*x[i])) - y[i] ;
|
||||||
@ -682,8 +684,8 @@ struct misra1a_functor {
|
|||||||
}
|
}
|
||||||
else { // compute fjac at b
|
else { // compute fjac at b
|
||||||
for(i=0; i<14; i++) {
|
for(i=0; i<14; i++) {
|
||||||
fjac[i+ldfjac*0] = (1.-exp(-b[1]*x[i]));
|
fjac(i,0) = (1.-exp(-b[1]*x[i]));
|
||||||
fjac[i+ldfjac*1] = (b[0]*x[i]*exp(-b[1]*x[i]));
|
fjac(i,1) = (b[0]*x[i]*exp(-b[1]*x[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -736,16 +738,18 @@ void testNistMisra1a(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct hahn1_functor {
|
struct hahn1_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double _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 , 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 , 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};
|
static const double _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 , 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 , 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};
|
||||||
static const double _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 , 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 , 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 };
|
static const double _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 , 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 , 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 };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// static int called=0; printf("call hahn1_functor with iflag=%d, called=%d\n", iflag, called); if (iflag==1) called++;
|
// static int called=0; printf("call hahn1_functor with iflag=%d, called=%d\n", iflag, called); if (iflag==1) called++;
|
||||||
assert(m==236);
|
|
||||||
assert(n==7);
|
assert(b.size()==7);
|
||||||
assert(ldfjac==236);
|
assert(fvec.size()==236);
|
||||||
|
assert(fjac.rows()==236);
|
||||||
|
assert(fjac.cols()==7);
|
||||||
if (iflag != 2) {// compute fvec at x
|
if (iflag != 2) {// compute fvec at x
|
||||||
for(i=0; i<236; i++) {
|
for(i=0; i<236; i++) {
|
||||||
double x=_x[i], xx=x*x, xxx=xx*x;
|
double x=_x[i], xx=x*x, xxx=xx*x;
|
||||||
@ -756,14 +760,14 @@ struct hahn1_functor {
|
|||||||
for(i=0; i<236; i++) {
|
for(i=0; i<236; i++) {
|
||||||
double x=_x[i], xx=x*x, xxx=xx*x;
|
double x=_x[i], xx=x*x, xxx=xx*x;
|
||||||
double fact = 1./(1.+b[4]*x+b[5]*xx+b[6]*xxx);
|
double fact = 1./(1.+b[4]*x+b[5]*xx+b[6]*xxx);
|
||||||
fjac[i+ldfjac*0] = 1.*fact;
|
fjac(i,0) = 1.*fact;
|
||||||
fjac[i+ldfjac*1] = x*fact;
|
fjac(i,1) = x*fact;
|
||||||
fjac[i+ldfjac*2] = xx*fact;
|
fjac(i,2) = xx*fact;
|
||||||
fjac[i+ldfjac*3] = xxx*fact;
|
fjac(i,3) = xxx*fact;
|
||||||
fact = - (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) * fact * fact;
|
fact = - (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) * fact * fact;
|
||||||
fjac[i+ldfjac*4] = x*fact;
|
fjac(i,4) = x*fact;
|
||||||
fjac[i+ldfjac*5] = xx*fact;
|
fjac(i,5) = xx*fact;
|
||||||
fjac[i+ldfjac*6] = xxx*fact;
|
fjac(i,6) = xxx*fact;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -827,15 +831,16 @@ void testNistHahn1(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct misra1d_functor {
|
struct misra1d_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double 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};
|
static const double 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};
|
||||||
static const double 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};
|
static const double 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};
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(m==14);
|
assert(b.size()==2);
|
||||||
assert(n==2);
|
assert(fvec.size()==14);
|
||||||
assert(ldfjac==14);
|
assert(fjac.rows()==14);
|
||||||
|
assert(fjac.cols()==2);
|
||||||
if (iflag != 2) {// compute fvec at b
|
if (iflag != 2) {// compute fvec at b
|
||||||
for(i=0; i<14; i++) {
|
for(i=0; i<14; i++) {
|
||||||
fvec[i] = b[0]*b[1]*x[i]/(1.+b[1]*x[i]) - y[i];
|
fvec[i] = b[0]*b[1]*x[i]/(1.+b[1]*x[i]) - y[i];
|
||||||
@ -844,8 +849,8 @@ struct misra1d_functor {
|
|||||||
else { // compute fjac at b
|
else { // compute fjac at b
|
||||||
for(i=0; i<14; i++) {
|
for(i=0; i<14; i++) {
|
||||||
double den = 1.+b[1]*x[i];
|
double den = 1.+b[1]*x[i];
|
||||||
fjac[i+ldfjac*0] = b[1]*x[i] / den;
|
fjac(i,0) = b[1]*x[i] / den;
|
||||||
fjac[i+ldfjac*1] = b[0]*x[i]*(den-b[1]*x[i])/den/den;
|
fjac(i,1) = b[0]*x[i]*(den-b[1]*x[i])/den/den;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -899,15 +904,16 @@ void testNistMisra1d(void)
|
|||||||
|
|
||||||
|
|
||||||
struct lanczos1_functor {
|
struct lanczos1_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double 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 };
|
static const double 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 };
|
||||||
static const double 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 };
|
static const double 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 };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(m==24);
|
assert(b.size()==6);
|
||||||
assert(n==6);
|
assert(fvec.size()==24);
|
||||||
assert(ldfjac==24);
|
assert(fjac.rows()==24);
|
||||||
|
assert(fjac.cols()==6);
|
||||||
if (iflag != 2) {// compute fvec at b
|
if (iflag != 2) {// compute fvec at b
|
||||||
for(i=0; i<24; i++) {
|
for(i=0; i<24; i++) {
|
||||||
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];
|
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];
|
||||||
@ -915,12 +921,12 @@ struct lanczos1_functor {
|
|||||||
}
|
}
|
||||||
else { // compute fjac at b
|
else { // compute fjac at b
|
||||||
for(i=0; i<24; i++) {
|
for(i=0; i<24; i++) {
|
||||||
fjac[i+ldfjac*0] = exp(-b[1]*x[i]);
|
fjac(i,0) = exp(-b[1]*x[i]);
|
||||||
fjac[i+ldfjac*1] = -b[0]*x[i]*exp(-b[1]*x[i]);
|
fjac(i,1) = -b[0]*x[i]*exp(-b[1]*x[i]);
|
||||||
fjac[i+ldfjac*2] = exp(-b[3]*x[i]);
|
fjac(i,2) = exp(-b[3]*x[i]);
|
||||||
fjac[i+ldfjac*3] = -b[2]*x[i]*exp(-b[3]*x[i]);
|
fjac(i,3) = -b[2]*x[i]*exp(-b[3]*x[i]);
|
||||||
fjac[i+ldfjac*4] = exp(-b[5]*x[i]);
|
fjac(i,4) = exp(-b[5]*x[i]);
|
||||||
fjac[i+ldfjac*5] = -b[4]*x[i]*exp(-b[5]*x[i]);
|
fjac(i,5) = -b[4]*x[i]*exp(-b[5]*x[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -982,15 +988,16 @@ void testNistLanczos1(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct rat42_functor {
|
struct rat42_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double x[9] = { 9.000E0, 14.000E0, 21.000E0, 28.000E0, 42.000E0, 57.000E0, 63.000E0, 70.000E0, 79.000E0 };
|
static const double x[9] = { 9.000E0, 14.000E0, 21.000E0, 28.000E0, 42.000E0, 57.000E0, 63.000E0, 70.000E0, 79.000E0 };
|
||||||
static const double y[9] = { 8.930E0 ,10.800E0 ,18.590E0 ,22.330E0 ,39.350E0 ,56.110E0 ,61.730E0 ,64.620E0 ,67.080E0 };
|
static const double y[9] = { 8.930E0 ,10.800E0 ,18.590E0 ,22.330E0 ,39.350E0 ,56.110E0 ,61.730E0 ,64.620E0 ,67.080E0 };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(m==9);
|
assert(b.size()==3);
|
||||||
assert(n==3);
|
assert(fvec.size()==9);
|
||||||
assert(ldfjac==9);
|
assert(fjac.rows()==9);
|
||||||
|
assert(fjac.cols()==3);
|
||||||
if (iflag != 2) {// compute fvec at b
|
if (iflag != 2) {// compute fvec at b
|
||||||
for(i=0; i<9; i++) {
|
for(i=0; i<9; i++) {
|
||||||
fvec[i] = b[0] / (1.+exp(b[1]-b[2]*x[i])) - y[i];
|
fvec[i] = b[0] / (1.+exp(b[1]-b[2]*x[i])) - y[i];
|
||||||
@ -999,9 +1006,9 @@ struct rat42_functor {
|
|||||||
else { // compute fjac at b
|
else { // compute fjac at b
|
||||||
for(i=0; i<9; i++) {
|
for(i=0; i<9; i++) {
|
||||||
double e = exp(b[1]-b[2]*x[i]);
|
double e = exp(b[1]-b[2]*x[i]);
|
||||||
fjac[i+ldfjac*0] = 1./(1.+e);
|
fjac(i,0) = 1./(1.+e);
|
||||||
fjac[i+ldfjac*1] = -b[0]*e/(1.+e)/(1.+e);
|
fjac(i,1) = -b[0]*e/(1.+e)/(1.+e);
|
||||||
fjac[i+ldfjac*2] = +b[0]*e*x[i]/(1.+e)/(1.+e);
|
fjac(i,2) = +b[0]*e*x[i]/(1.+e)/(1.+e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1056,15 +1063,16 @@ void testNistRat42(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct MGH10_functor {
|
struct MGH10_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double 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 };
|
static const double 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 };
|
||||||
static const double 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 };
|
static const double 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 };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(m==16);
|
assert(b.size()==3);
|
||||||
assert(n==3);
|
assert(fvec.size()==16);
|
||||||
assert(ldfjac==16);
|
assert(fjac.rows()==16);
|
||||||
|
assert(fjac.cols()==3);
|
||||||
if (iflag != 2) {// compute fvec at b
|
if (iflag != 2) {// compute fvec at b
|
||||||
for(i=0; i<16; i++) {
|
for(i=0; i<16; i++) {
|
||||||
fvec[i] = b[0] * exp(b[1]/(x[i]+b[2])) - y[i];
|
fvec[i] = b[0] * exp(b[1]/(x[i]+b[2])) - y[i];
|
||||||
@ -1074,9 +1082,9 @@ struct MGH10_functor {
|
|||||||
for(i=0; i<16; i++) {
|
for(i=0; i<16; i++) {
|
||||||
double factor = 1./(x[i]+b[2]);
|
double factor = 1./(x[i]+b[2]);
|
||||||
double e = exp(b[1]*factor);
|
double e = exp(b[1]*factor);
|
||||||
fjac[i+ldfjac*0] = e;
|
fjac(i,0) = e;
|
||||||
fjac[i+ldfjac*1] = b[0]*factor*e;
|
fjac(i,1) = b[0]*factor*e;
|
||||||
fjac[i+ldfjac*2] = -b[1]*b[0]*factor*factor*e;
|
fjac(i,2) = -b[1]*b[0]*factor*factor*e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1132,15 +1140,16 @@ void testNistMGH10(void)
|
|||||||
|
|
||||||
|
|
||||||
struct BoxBOD_functor {
|
struct BoxBOD_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double x[6] = { 1., 2., 3., 5., 7., 10. };
|
static const double x[6] = { 1., 2., 3., 5., 7., 10. };
|
||||||
static const double y[6] = { 109., 149., 149., 191., 213., 224. };
|
static const double y[6] = { 109., 149., 149., 191., 213., 224. };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(m==6);
|
assert(b.size()==2);
|
||||||
assert(n==2);
|
assert(fvec.size()==6);
|
||||||
assert(ldfjac==6);
|
assert(fjac.rows()==6);
|
||||||
|
assert(fjac.cols()==2);
|
||||||
if (iflag != 2) {// compute fvec at b
|
if (iflag != 2) {// compute fvec at b
|
||||||
for(i=0; i<6; i++) {
|
for(i=0; i<6; i++) {
|
||||||
fvec[i] = b[0]*(1.-exp(-b[1]*x[i])) - y[i];
|
fvec[i] = b[0]*(1.-exp(-b[1]*x[i])) - y[i];
|
||||||
@ -1149,8 +1158,8 @@ struct BoxBOD_functor {
|
|||||||
else { // compute fjac at b
|
else { // compute fjac at b
|
||||||
for(i=0; i<6; i++) {
|
for(i=0; i<6; i++) {
|
||||||
double e = exp(-b[1]*x[i]);
|
double e = exp(-b[1]*x[i]);
|
||||||
fjac[i+ldfjac*0] = 1.-e;
|
fjac(i,0) = 1.-e;
|
||||||
fjac[i+ldfjac*1] = b[0]*x[i]*e;
|
fjac(i,1) = b[0]*x[i]*e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1205,15 +1214,16 @@ void testNistBoxBOD(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct MGH17_functor {
|
struct MGH17_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double 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 };
|
static const double 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 };
|
||||||
static const double 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 };
|
static const double 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 };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(m==33);
|
assert(b.size()==5);
|
||||||
assert(n==5);
|
assert(fvec.size()==33);
|
||||||
assert(ldfjac==33);
|
assert(fjac.rows()==33);
|
||||||
|
assert(fjac.cols()==5);
|
||||||
if (iflag != 2) {// compute fvec at b
|
if (iflag != 2) {// compute fvec at b
|
||||||
for(i=0; i<33; i++) {
|
for(i=0; i<33; i++) {
|
||||||
fvec[i] = b[0] + b[1]*exp(-b[3]*x[i]) + b[2]*exp(-b[4]*x[i]) - y[i];
|
fvec[i] = b[0] + b[1]*exp(-b[3]*x[i]) + b[2]*exp(-b[4]*x[i]) - y[i];
|
||||||
@ -1221,11 +1231,11 @@ struct MGH17_functor {
|
|||||||
}
|
}
|
||||||
else { // compute fjac at b
|
else { // compute fjac at b
|
||||||
for(i=0; i<33; i++) {
|
for(i=0; i<33; i++) {
|
||||||
fjac[i+ldfjac*0] = 1.;
|
fjac(i,0) = 1.;
|
||||||
fjac[i+ldfjac*1] = exp(-b[3]*x[i]);
|
fjac(i,1) = exp(-b[3]*x[i]);
|
||||||
fjac[i+ldfjac*2] = exp(-b[4]*x[i]);
|
fjac(i,2) = exp(-b[4]*x[i]);
|
||||||
fjac[i+ldfjac*3] = -x[i]*b[1]*exp(-b[3]*x[i]);
|
fjac(i,3) = -x[i]*b[1]*exp(-b[3]*x[i]);
|
||||||
fjac[i+ldfjac*4] = -x[i]*b[2]*exp(-b[4]*x[i]);
|
fjac(i,4) = -x[i]*b[2]*exp(-b[4]*x[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1288,15 +1298,16 @@ void testNistMGH17(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct MGH09_functor {
|
struct MGH09_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double _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 };
|
static const double _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 };
|
||||||
static const double 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 };
|
static const double 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 };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(m==11);
|
assert(b.size()==4);
|
||||||
assert(n==4);
|
assert(fvec.size()==11);
|
||||||
assert(ldfjac==11);
|
assert(fjac.rows()==11);
|
||||||
|
assert(fjac.cols()==4);
|
||||||
if (iflag != 2) {// compute fvec at b
|
if (iflag != 2) {// compute fvec at b
|
||||||
for(i=0; i<11; i++) {
|
for(i=0; i<11; i++) {
|
||||||
double x = _x[i], xx=x*x;
|
double x = _x[i], xx=x*x;
|
||||||
@ -1307,10 +1318,10 @@ struct MGH09_functor {
|
|||||||
for(i=0; i<11; i++) {
|
for(i=0; i<11; i++) {
|
||||||
double x = _x[i], xx=x*x;
|
double x = _x[i], xx=x*x;
|
||||||
double factor = 1./(xx+x*b[2]+b[3]);
|
double factor = 1./(xx+x*b[2]+b[3]);
|
||||||
fjac[i+ldfjac*0] = (xx+x*b[1]) * factor;
|
fjac(i,0) = (xx+x*b[1]) * factor;
|
||||||
fjac[i+ldfjac*1] = b[0]*x* factor;
|
fjac(i,1) = b[0]*x* factor;
|
||||||
fjac[i+ldfjac*2] = - b[0]*(xx+x*b[1]) * x * factor * factor;
|
fjac(i,2) = - b[0]*(xx+x*b[1]) * x * factor * factor;
|
||||||
fjac[i+ldfjac*3] = - b[0]*(xx+x*b[1]) * factor * factor;
|
fjac(i,3) = - b[0]*(xx+x*b[1]) * factor * factor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1371,16 +1382,17 @@ void testNistMGH09(void)
|
|||||||
|
|
||||||
|
|
||||||
struct Bennett5_functor {
|
struct Bennett5_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double 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, 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 };
|
static const double 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, 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 };
|
||||||
static const double 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 ,-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 ,-31.827299E0 ,-31.821600E0 ,-31.818701E0 ,-31.812901E0 ,-31.809999E0 ,-31.807100E0 ,-31.801300E0 ,-31.798401E0 ,-31.795500E0 ,-31.789700E0 ,-31.786800E0 };
|
static const double 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 ,-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 ,-31.827299E0 ,-31.821600E0 ,-31.818701E0 ,-31.812901E0 ,-31.809999E0 ,-31.807100E0 ,-31.801300E0 ,-31.798401E0 ,-31.795500E0 ,-31.789700E0 ,-31.786800E0 };
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(m==154);
|
assert(b.size()==3);
|
||||||
assert(n==3);
|
assert(fvec.size()==154);
|
||||||
assert(ldfjac==154);
|
assert(fjac.rows()==154);
|
||||||
|
assert(fjac.cols()==3);
|
||||||
if (iflag != 2) {// compute fvec at b
|
if (iflag != 2) {// compute fvec at b
|
||||||
for(i=0; i<154; i++) {
|
for(i=0; i<154; i++) {
|
||||||
fvec[i] = b[0]* pow(b[1]+x[i],-1./b[2]) - y[i];
|
fvec[i] = b[0]* pow(b[1]+x[i],-1./b[2]) - y[i];
|
||||||
@ -1389,9 +1401,9 @@ struct Bennett5_functor {
|
|||||||
else { // compute fjac at b
|
else { // compute fjac at b
|
||||||
for(i=0; i<154; i++) {
|
for(i=0; i<154; i++) {
|
||||||
double e = pow(b[1]+x[i],-1./b[2]);
|
double e = pow(b[1]+x[i],-1./b[2]);
|
||||||
fjac[i+ldfjac*0] = e;
|
fjac(i,0) = e;
|
||||||
fjac[i+ldfjac*1] = - b[0]*e/b[2]/(b[1]+x[i]);
|
fjac(i,1) = - b[0]*e/b[2]/(b[1]+x[i]);
|
||||||
fjac[i+ldfjac*2] = b[0]*e*log(b[1]+x[i])/b[2]/b[2];
|
fjac(i,2) = b[0]*e*log(b[1]+x[i])/b[2]/b[2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1446,16 +1458,17 @@ void testNistBennett5(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct thurber_functor {
|
struct thurber_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double _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 };
|
static const double _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 };
|
||||||
static const double _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};
|
static const double _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};
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// static int called=0; printf("call hahn1_functor with iflag=%d, called=%d\n", iflag, called); if (iflag==1) called++;
|
// static int called=0; printf("call hahn1_functor with iflag=%d, called=%d\n", iflag, called); if (iflag==1) called++;
|
||||||
assert(m==37);
|
assert(b.size()==7);
|
||||||
assert(n==7);
|
assert(fvec.size()==37);
|
||||||
assert(ldfjac==37);
|
assert(fjac.rows()==37);
|
||||||
|
assert(fjac.cols()==7);
|
||||||
if (iflag != 2) {// compute fvec at x
|
if (iflag != 2) {// compute fvec at x
|
||||||
for(i=0; i<37; i++) {
|
for(i=0; i<37; i++) {
|
||||||
double x=_x[i], xx=x*x, xxx=xx*x;
|
double x=_x[i], xx=x*x, xxx=xx*x;
|
||||||
@ -1466,14 +1479,14 @@ struct thurber_functor {
|
|||||||
for(i=0; i<37; i++) {
|
for(i=0; i<37; i++) {
|
||||||
double x=_x[i], xx=x*x, xxx=xx*x;
|
double x=_x[i], xx=x*x, xxx=xx*x;
|
||||||
double fact = 1./(1.+b[4]*x+b[5]*xx+b[6]*xxx);
|
double fact = 1./(1.+b[4]*x+b[5]*xx+b[6]*xxx);
|
||||||
fjac[i+ldfjac*0] = 1.*fact;
|
fjac(i,0) = 1.*fact;
|
||||||
fjac[i+ldfjac*1] = x*fact;
|
fjac(i,1) = x*fact;
|
||||||
fjac[i+ldfjac*2] = xx*fact;
|
fjac(i,2) = xx*fact;
|
||||||
fjac[i+ldfjac*3] = xxx*fact;
|
fjac(i,3) = xxx*fact;
|
||||||
fact = - (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) * fact * fact;
|
fact = - (b[0]+b[1]*x+b[2]*xx+b[3]*xxx) * fact * fact;
|
||||||
fjac[i+ldfjac*4] = x*fact;
|
fjac(i,4) = x*fact;
|
||||||
fjac[i+ldfjac*5] = xx*fact;
|
fjac(i,5) = xx*fact;
|
||||||
fjac[i+ldfjac*6] = xxx*fact;
|
fjac(i,6) = xxx*fact;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1538,15 +1551,16 @@ void testNistThurber(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct rat43_functor {
|
struct rat43_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double x[15] = { 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14., 15. };
|
static const double x[15] = { 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14., 15. };
|
||||||
static const double 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 };
|
static const double 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 };
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(m==15);
|
assert(b.size()==4);
|
||||||
assert(n==4);
|
assert(fvec.size()==15);
|
||||||
assert(ldfjac==15);
|
assert(fjac.rows()==15);
|
||||||
|
assert(fjac.cols()==4);
|
||||||
if (iflag != 2) {// compute fvec at b
|
if (iflag != 2) {// compute fvec at b
|
||||||
for(i=0; i<15; i++) {
|
for(i=0; i<15; i++) {
|
||||||
fvec[i] = b[0] * pow(1.+exp(b[1]-b[2]*x[i]),-1./b[3]) - y[i];
|
fvec[i] = b[0] * pow(1.+exp(b[1]-b[2]*x[i]),-1./b[3]) - y[i];
|
||||||
@ -1556,10 +1570,10 @@ struct rat43_functor {
|
|||||||
for(i=0; i<15; i++) {
|
for(i=0; i<15; i++) {
|
||||||
double e = exp(b[1]-b[2]*x[i]);
|
double e = exp(b[1]-b[2]*x[i]);
|
||||||
double power = -1./b[3];
|
double power = -1./b[3];
|
||||||
fjac[i+ldfjac*0] = pow(1.+e, power);
|
fjac(i,0) = pow(1.+e, power);
|
||||||
fjac[i+ldfjac*1] = power*b[0]*e*pow(1.+e, power-1.);
|
fjac(i,1) = power*b[0]*e*pow(1.+e, power-1.);
|
||||||
fjac[i+ldfjac*2] = -power*b[0]*e*x[i]*pow(1.+e, power-1.);
|
fjac(i,2) = -power*b[0]*e*x[i]*pow(1.+e, power-1.);
|
||||||
fjac[i+ldfjac*3] = b[0]*power*power*log(1.+e)*pow(1.+e, power);
|
fjac(i,3) = b[0]*power*power*log(1.+e)*pow(1.+e, power);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1620,16 +1634,17 @@ void testNistRat43(void)
|
|||||||
|
|
||||||
|
|
||||||
struct eckerle4_functor {
|
struct eckerle4_functor {
|
||||||
static int f(int m, int n, const double *b, double *fvec, double *fjac, int ldfjac, int iflag)
|
static int f(const VectorXd &b, VectorXd &fvec, MatrixXd &fjac, int iflag)
|
||||||
{
|
{
|
||||||
static const double 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};
|
static const double 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};
|
||||||
static const double 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 };
|
static const double 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 };
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(m==35);
|
assert(b.size()==3);
|
||||||
assert(n==3);
|
assert(fvec.size()==35);
|
||||||
assert(ldfjac==35);
|
assert(fjac.rows()==35);
|
||||||
|
assert(fjac.cols()==3);
|
||||||
if (iflag != 2) {// compute fvec at b
|
if (iflag != 2) {// compute fvec at b
|
||||||
for(i=0; i<35; i++) {
|
for(i=0; i<35; i++) {
|
||||||
fvec[i] = b[0]/b[1] * exp(-0.5*(x[i]-b[2])*(x[i]-b[2])/(b[1]*b[1])) - y[i];
|
fvec[i] = b[0]/b[1] * exp(-0.5*(x[i]-b[2])*(x[i]-b[2])/(b[1]*b[1])) - y[i];
|
||||||
@ -1639,9 +1654,9 @@ struct eckerle4_functor {
|
|||||||
for(i=0; i<35; i++) {
|
for(i=0; i<35; i++) {
|
||||||
double b12 = b[1]*b[1];
|
double b12 = b[1]*b[1];
|
||||||
double e = exp(-0.5*(x[i]-b[2])*(x[i]-b[2])/b12);
|
double e = exp(-0.5*(x[i]-b[2])*(x[i]-b[2])/b12);
|
||||||
fjac[i+ldfjac*0] = e / b[1];
|
fjac(i,0) = e / b[1];
|
||||||
fjac[i+ldfjac*1] = ((x[i]-b[2])*(x[i]-b[2])/b12-1.) * b[0]*e/b12;
|
fjac(i,1) = ((x[i]-b[2])*(x[i]-b[2])/b12-1.) * b[0]*e/b12;
|
||||||
fjac[i+ldfjac*2] = (x[i]-b[2])*e*b[0]/b[1]/b12;
|
fjac(i,2) = (x[i]-b[2])*e*b[0]/b[1]/b12;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user