Changeset 5873
- Timestamp:
- Jan 3, 2006, 11:12:54 AM (21 years ago)
- File:
-
- 1 edited
-
trunk/pstest/src/tst_psPolynomial.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/pstest/src/tst_psPolynomial.c
r5613 r5873 1 1 #include <stdio.h> 2 #include <math.h> 2 3 #include "pslib_strict.h" 3 4 #include "psTest.h" 4 5 5 6 static psS32 testPolynomial1DEval_01(void); 7 static psS32 testPolynomial1DEvalVector_01(void); 8 static psS32 testPolynomial1DEvalVector_02(void); 9 static psS32 testVectorFitPolynomial1D_01(void); 10 static psS32 testVectorFitPolynomial1D_02(void); 11 static psS32 testVectorClipFitPolynomial1D_01(void); 6 12 7 13 /* list of test functions in test suite */ 8 14 testDescription tests[] = { 9 15 {testPolynomial1DEval_01,1,"psPolynomial1DEval_01",0,false}, 16 {testPolynomial1DEvalVector_01,2,"psPolynomial1DEvalVector_01",0,false}, 17 {testPolynomial1DEvalVector_02,2,"psPolynomial1DEvalVector_02",0,false}, 18 {testVectorFitPolynomial1D_01,2,"psVectorFitPolynomial1D_01",0,false}, 19 {testVectorFitPolynomial1D_02,2,"psVectorFitPolynomial1D_02",0,false}, 20 {testVectorClipFitPolynomial1D_01,2,"psVectorFitClipPolynomial1D_01",0,false}, 10 21 {NULL} 11 22 }; … … 14 25 int main(int argc, char* argv[]) 15 26 { 27 //psTraceSetLevel("VectorFitPolynomial1DOrd", 6); 16 28 psLogSetFormat("HLNM"); 17 29 psLogSetLevel(PS_LOG_INFO); … … 24 36 # define X3 -2.0 25 37 26 static psPolynomial1D *makePolynomial1D(int Nord) { 38 39 static psPolynomial1D *makePolynomial1D(int Nord, psPolynomialType type, int ordMask) { 27 40 28 41 // define the polynomial 29 psPolynomial1D *poly = psPolynomial1DAlloc(Nord, PS_POLYNOMIAL_ORD);42 psPolynomial1D *poly = psPolynomial1DAlloc(Nord, type); 30 43 switch (Nord) { 31 44 case 3: 32 poly->coeff[3] = X3;45 poly->coeff[3] = (ordMask==3) ? 0:X3; 33 46 case 2: 34 poly->coeff[2] = X2;47 poly->coeff[2] = (ordMask==2) ? 0:X2; 35 48 case 1: 36 poly->coeff[1] = X1;49 poly->coeff[1] = (ordMask==1) ? 0:X1; 37 50 case 0: 38 poly->coeff[0] = X0;51 poly->coeff[0] = (ordMask==0) ? 0:X0; 39 52 break; 40 53 default: … … 44 57 } 45 58 46 static void fillVectors (psVector *x, psVector *y, int Nord, int Npts) { 47 48 psF32 X; 59 static void fillVectors(psVector *x, psVector *y, int Nord, int Npts, psPolynomialType type) { 60 61 psF32 X;//, P1, P2, P3; 62 double c[] = {(double)X0,(double)X1,(double)X2,(double)X3}; 63 //double sv,d,dd; 64 double sum, Tn, Tn_1, Tn_2; 49 65 50 66 for (int i = 0; i < Npts; i++) { 51 X = i - 0.5*Npts;67 X = (float)i/Npts - 0.5; 52 68 x->data.F32[i] = X; 53 switch (Nord) { 54 case 0: 55 y->data.F32[i] = X0; 69 switch (type) { 70 case PS_POLYNOMIAL_ORD: 71 switch (Nord) { 72 case 0: 73 y->data.F32[i] = c[0]; 74 break; 75 case 1: 76 y->data.F32[i] = c[0] + c[1]*X; 77 break; 78 case 2: 79 y->data.F32[i] = c[0] + c[1]*X + c[2]*X*X; 80 break; 81 case 3: 82 y->data.F32[i] = c[0] + c[1]*X + c[2]*X*X + c[3]*X*X*X; 83 break; 84 default: 85 y->data.F32[i] = 0; 86 } 56 87 break; 57 case 1: 58 y->data.F32[i] = X0 + X*X1; 88 case PS_POLYNOMIAL_CHEB: 89 switch (Nord) { 90 case 0: 91 y->data.F32[i] = c[0]; 92 break; 93 case 1: 94 y->data.F32[i] =c[0] + c[1]*X; 95 break; 96 default: 97 //Clenshaw's formula approach (NR 5.5) 98 //d=0.0; 99 //dd=0.0; 100 //for (int j=Nord; j>=1; j--) { 101 // sv = d; 102 // d = (double)2.0*(double)X*d - dd + c[j]; 103 // dd = sv; 104 //} 105 //y->data.F32[i] = (double)X*d-dd+(double)0.5*c[0]; 106 107 //Straightforward approach 108 Tn_1=X; //T1 109 Tn_2=1; //T0 110 sum=0.; 111 for (int j=2; j<=Nord; j++) { 112 Tn = 2.0*X*Tn_1 - Tn_2; 113 sum = sum + c[j]*Tn; 114 Tn_2 = Tn_1; 115 Tn_1 = Tn; 116 } 117 y->data.F32[i] = sum + c[1]*X + c[0] - 0.5*c[0]; 118 } 59 119 break; 60 case 2:61 y->data.F32[i] = X0 + X*X1 + X*X*X2;62 break;63 case 3:64 y->data.F32[i] = X0 + X*X1 + X*X*X2 + X*X*X*X3;65 break;66 default:67 y->data.F32[i] = 0;68 120 } 69 121 } … … 71 123 } 72 124 125 # define NPTS 10 126 73 127 int testPolynomial1DEval_01(void) { 74 75 # define NPTS 100 76 # define NORD 3 77 78 psPolynomial1D *poly = makePolynomial1D(NORD); 79 80 // create x vector, known y vector: 81 psVector *x = psVectorAlloc (NPTS, PS_TYPE_F32); 82 psVector *y = psVectorAlloc (NPTS, PS_TYPE_F32); 83 fillVectors (x, y, NORD, NPTS); 84 85 psF32 xV, yV; 86 87 int Ngood = 0; 88 int Nbad = 0; 89 90 for (int i = 0; i < NPTS; i++) { 91 xV = x->data.F32[i]; 92 yV = psPolynomial1DEval (poly, xV); 93 if (yV == y->data.F32[i]) { 94 Ngood ++; 95 } else { 96 Nbad ++; 97 } 98 } 99 psFree (x); 100 psFree (y); 101 psFree (poly); 102 103 if (Nbad > 0) { 104 psError(PS_ERR_UNKNOWN,true,"%d incorrect polynomial evaluations\n", Nbad); 105 return 1; 106 } 107 return 0; 108 } 128 129 //# define NORD 3 130 int NORD; 131 int maxNORD = 3; 132 int retval = 0; 133 psPolynomialType type[] = {PS_POLYNOMIAL_ORD, PS_POLYNOMIAL_CHEB}; 134 135 for (int k = 0; k<1; k++) { //loop over the 2 polynomial types 136 for (int j = 1; j <= maxNORD; j++) { //loop over the polynomial orders 137 int nGood = 0, nBad = 0; 138 NORD = j; 139 //printf("Testing NORD=%d\n", NORD); 140 psPolynomial1D *poly = makePolynomial1D(NORD, type[k], -1); 141 142 //create x vector, known y vector: 143 psVector *x = psVectorAlloc (NPTS, PS_TYPE_F32); 144 psVector *y = psVectorAlloc (NPTS, PS_TYPE_F32); 145 fillVectors (x, y, NORD, NPTS, type[k]); 146 147 psF32 xV, yV; 148 149 for (int i = 0; i < NPTS; i++) { 150 xV = x->data.F32[i]; 151 yV = psPolynomial1DEval (poly, xV); 152 //Change some values around to make it fail! 153 //if (i>90 && NORD==2) {yV = yV + 0.1;} 154 if (yV == y->data.F32[i]) { 155 nGood++; 156 } else { 157 nBad++; 158 printf("%.3f --> %.10f & %.10f\tdel=%e\n",xV,yV,y->data.F32[i],y->data.F32[i]-yV); 159 } 160 } 161 psFree (x); 162 psFree (y); 163 psFree (poly); 164 165 if (nBad > 0) { 166 psError(PS_ERR_UNKNOWN,true,"%d incorrect polynomial evaluations for NORD=%d\n", nBad, NORD); 167 retval = retval + pow(2,NORD); 168 } 169 } 170 } 171 return retval; 172 } 173 174 175 int testPolynomial1DEvalVector_01(void) { 176 177 //# define NORD 3 178 int NORD; 179 int maxNORD = 3; 180 int retval = 0; 181 psPolynomialType type[] = {PS_POLYNOMIAL_ORD, PS_POLYNOMIAL_CHEB}; 182 183 for (int k = 0; k<1; k++) { //loop over the 2 polynomial types 184 for (int j = 1; j <= maxNORD; j++) { //loop over the polynomial orders 185 int nGood = 0, nBad = 0; 186 NORD = j; 187 //printf("Testing NORD=%d\n", NORD); 188 psPolynomial1D *poly = makePolynomial1D(NORD, type[k], -1); 189 190 // create x vector, known y vector: 191 psVector *x = psVectorAlloc (NPTS, PS_TYPE_F32); 192 psVector *y = psVectorAlloc (NPTS, PS_TYPE_F32); 193 fillVectors (x, y, NORD, NPTS, type[k]); 194 195 psVector *xV = x; 196 psVector *yV = psPolynomial1DEvalVector(poly, xV); 197 198 for (int i = 0; i < NPTS; i++) { 199 //Change some values around to make it fail! 200 //if (i>90 && NORD==2) {yV->data.F32[i] = yV->data.F32[i] + 0.1;} 201 if (yV->data.F32[i] == y->data.F32[i]) { 202 nGood++; 203 } else { 204 nBad++; 205 printf("%.3f --> %.3f & %.3f\tdel=%e\n",xV->data.F32[i],yV->data.F32[i],y->data.F32[i],y->data.F32[i]-yV->data.F32[i]); 206 } 207 } 208 psFree (x); 209 psFree (y); 210 psFree (yV); 211 psFree (poly); 212 213 if (nBad > 0) { 214 psError(PS_ERR_UNKNOWN,true,"%d incorrect polynomial evaluations for NORD=%d\n", nBad, NORD); 215 retval = retval + pow(2,NORD); 216 } 217 } 218 } 219 return retval; 220 } 221 int testPolynomial1DEvalVector_02(void) { 222 // check that psPolynomial1DEvalVector obeys the psPolynomial1D.mask 223 int NORD; 224 int maxNORD = 3; 225 int retval = 0; 226 psPolynomialType type[] = {PS_POLYNOMIAL_ORD, PS_POLYNOMIAL_CHEB}; 227 228 for (int k = 0; k<1; k++) { //loop over the 2 polynomial types 229 for (int imask=0; imask<=maxNORD; imask++) { // mask one order at a time 230 int j= maxNORD; 231 NORD = j; 232 int nGood = 0, nBad = 0; 233 psPolynomial1D *poly = makePolynomial1D(NORD, type[k], -1); 234 psPolynomial1D *polynomask = makePolynomial1D(NORD, type[k], imask); 235 poly->mask[imask]=1; 236 237 // create x vector, known y vector: 238 psVector *x = psVectorAlloc (NPTS, PS_TYPE_F32); 239 psVector *y = psVectorAlloc (NPTS, PS_TYPE_F32); 240 fillVectors (x, y, NORD, NPTS, type[k]); 241 242 psVector *xV = x; 243 psVector *yV = psPolynomial1DEvalVector(poly, xV); 244 psVector *yVnm = psPolynomial1DEvalVector(polynomask, xV); 245 246 for (int i = 0; i < NPTS; i++) { 247 if (yV->data.F32[i] == yVnm->data.F32[i]) { 248 nGood++; 249 } else { 250 nBad++; 251 printf("x:%.3f y:%.3f , %.3f , %.3f\tdel=%e\n",xV->data.F32[i],y->data.F32[i],yV->data.F32[i],yVnm->data.F32[i],yVnm->data.F32[i]-yV->data.F32[i]); 252 } 253 } 254 psFree (x); 255 psFree (y); 256 psFree (yV); 257 psFree (yVnm); 258 psFree (poly); 259 psFree (polynomask); 260 261 if (nBad > 0) { 262 psError(PS_ERR_UNKNOWN,true,"%d incorrect polynomial evaluations for NORD=%d\n", nBad, NORD); 263 retval = retval + pow(2,NORD); 264 } 265 } 266 } 267 return retval; 268 } 269 270 271 272 int testVectorFitPolynomial1D_01(void) { 273 int retval=0; 274 int NORD, maxNORD=3; 275 float tolerance = 1.0E-5; 276 psPolynomialType type[] = {PS_POLYNOMIAL_ORD, PS_POLYNOMIAL_CHEB}; 277 278 for (int k = 0; k<1; k++) { //loop over the 2 polynomial types XXX: not using Chebyshevs right now!!! 279 for (int j = 1; j <= maxNORD; j++) { //loop over the polynomial orders 280 int nGood = 0, nBad = 0; 281 NORD = j; 282 printf("Testing NORD=%d\n", NORD); 283 psPolynomial1D *poly = makePolynomial1D(NORD, type[k], -1); 284 psPolynomial1D *polycopy = makePolynomial1D(NORD, type[k], -1); 285 psVector *f = psVectorAlloc(NPTS, PS_TYPE_F32); 286 psVector *fErr = psVectorAlloc(NPTS, PS_TYPE_F32); 287 psVector *x = psVectorAlloc(NPTS, PS_TYPE_F32); 288 289 fillVectors(x, f, NORD, NPTS, type[k]); 290 psTime *now = psTimeGetNow(PS_TIME_UTC); 291 const psRandom *r = psRandomAlloc(PS_RANDOM_TAUS, now->sec); 292 for (int i = 0; i < NPTS; i++) { 293 double errgen = psRandomGaussian(r); 294 double amp = 1.0E-3; 295 fErr->data.F32[i] = amp*errgen; 296 //fErr->data.F32[i] = 0.; 297 } 298 psFree(now); 299 psFree(r); 300 301 //f->data.F32[NPTS-1] = X0 + 10.*X1*x->data.F32[NPTS-1]; 302 //fErr->data.F32[NPTS-1] = 0.0000001; 303 304 305 psVectorFitPolynomial1D(poly, NULL, 0, f, fErr, x); 306 for (int i = 0; i <= NORD; i++) { 307 if (poly->coeff[i] <= polycopy->coeff[i]+tolerance 308 && 309 poly->coeff[i] >= polycopy->coeff[i]-tolerance) { 310 nGood++; 311 } else { 312 nBad++; 313 printf("polycopy->coeff[%d]=%.20f poly->coeff[%d]=%.20f\n",i,polycopy->coeff[i],i,poly->coeff[i]); 314 } 315 if (polycopy->coeffErr[i] != poly->coeffErr[i]) { 316 printf("polycopy->coeffErr[%d]=%.20f poly->coeffErr[%d]=%.20f\n",i,polycopy->coeffErr[i],i,poly->coeffErr[i]); 317 } 318 } 319 320 if (nBad > 0) { 321 psError(PS_ERR_UNKNOWN,true,"%d incorrect polynomial evaluations for NORD=%d\n", nBad, NORD); 322 retval = retval + pow(2,NORD); 323 } 324 325 printf("NORD: %d retval: %d\n",NORD,retval); 326 psFree(poly); 327 psFree(polycopy); 328 psFree(f); 329 psFree(fErr); 330 psFree(x); 331 } 332 } 333 return retval; 334 } 335 336 337 int testVectorFitPolynomial1D_02(void) { 338 // this time test that the masking in psPolynomial1D works correctly 339 int retval=0; 340 int NORD, maxNORD=3; 341 float tolerance = 1.0E-5; 342 psPolynomialType type[] = {PS_POLYNOMIAL_ORD, PS_POLYNOMIAL_CHEB}; 343 344 for (int k = 0; k<1; k++) { //loop over the 2 polynomial types XXX: not using Chebyshevs right now!!! 345 for (int imask=0; imask<=maxNORD; imask++) { // mask one order at a time 346 int j= maxNORD; 347 NORD = j; 348 int nGood = 0, nBad = 0; 349 psPolynomial1D *poly = makePolynomial1D(NORD, type[k], -1); 350 psPolynomial1D *polynomask = makePolynomial1D(NORD, type[k], imask); 351 poly->mask[imask]=1; 352 //poly and polynomask look the same now. 353 354 psVector *mask = psVectorAlloc(NPTS, PS_TYPE_U8); 355 psVector *f = psVectorAlloc(NPTS, PS_TYPE_F32); 356 psVector *fErr = psVectorAlloc(NPTS, PS_TYPE_F32); 357 psVector *x = psVectorAlloc(NPTS, PS_TYPE_F32); 358 359 fillVectors(x, f, NORD, NPTS, type[k]); 360 361 // add random errors to the vector 362 psTime *now = psTimeGetNow(PS_TIME_UTC); 363 const psRandom *r = psRandomAlloc(PS_RANDOM_TAUS, now->sec); 364 for (int i = 0; i < NPTS; i++) { 365 double errgen = psRandomGaussian(r); 366 double amp = 1.0E-3; 367 fErr->data.F32[i] = amp*errgen; 368 //fErr->data.F32[i] = 0.; 369 } 370 psFree(now); 371 psFree(r); 372 373 374 //mask->data.U8[imask] = 0xff; 375 //for (int ii=0; ii<=mask->n; ii++) { 376 //printf(" %d",mask->data.U8[ii]); 377 //} 378 //printf("\n"); 379 380 poly->mask[imask] = 1; 381 for (int ii=0; ii<=poly->nX; ii++) { 382 printf("%x ", poly->mask[ii]); 383 } 384 printf("\n"); 385 386 psVectorFitPolynomial1D(poly, NULL, 0xff, f, fErr, x); 387 psVectorFitPolynomial1D(polynomask, NULL, 0xff, f, fErr, x); 388 389 psVector *xx = psVectorAlloc(NPTS, PS_TYPE_F32); 390 psVector *yy = psPolynomial1DEvalVector(poly, xx); 391 psVector *del; 392 psBinaryOp(del, f, "-", yy); 393 psPolynomial1D *polydel = makePolynomial1D(NORD, type[k], -1); 394 psVectorFitPolynomial1D(polydel, NULL,0xff, f, fErr, x); 395 396 397 398 //mask->data.U8[imask] = 0; 399 poly->mask[imask] = 0; 400 for (int i = 0; i <= NORD; i++) { 401 printf("polynomask->coeff[%d]=%.8f poly->coeff[%d]=%.8f polydel->coeff[%d]=%.8f\n",i,polynomask->coeff[i],i,poly->coeff[i],i,polydel->coeff[i]); 402 if (poly->coeff[i] <= polynomask->coeff[i]+tolerance 403 && 404 poly->coeff[i] >= polynomask->coeff[i]-tolerance) { 405 nGood++; 406 } else { 407 nBad++; 408 //printf("polynomask->coeff[%d]=%.8f poly->coeff[%d]=%.8f\n",i,polynomask->coeff[i],i,poly->coeff[i]); 409 } 410 if (polynomask->coeffErr[i] != poly->coeffErr[i]) { 411 //printf("polynomask->coeffErr[%d]=%.8f poly->coeffErr[%d]=%.8f\n",i,polynomask->coeffErr[i],i,poly->coeffErr[i]); 412 } 413 } 414 415 if (nBad > 0) { 416 psError(PS_ERR_UNKNOWN,true,"%d incorrect polynomial evaluations for NORD=%d\n", nBad, NORD); 417 retval = retval + pow(2,NORD); 418 } 419 420 printf("Mask Ord: %d retval: %d\n", imask, retval); 421 psFree(poly); 422 psFree(polynomask); 423 psFree(mask); 424 psFree(f); 425 psFree(fErr); 426 psFree(x); 427 psFree(xx); 428 psFree(yy); 429 psFree(del); 430 psFree(polydel); 431 432 } 433 } 434 return retval; 435 } 436 437 438 439 440 441 int testVectorClipFitPolynomial1D_01(void) { 442 int retval=0; 443 int NORD, maxNORD=3; 444 double Nsigma = 3.; 445 int Niter= 3.; 446 float tolerance = 1.0E-5; 447 psPolynomialType type[] = {PS_POLYNOMIAL_ORD, PS_POLYNOMIAL_CHEB}; 448 449 for (int k = 0; k<1; k++) { //loop over the 2 polynomial types XXX: psVectorClipFirPolynomial1D does not 450 // work with Chebyshev now 451 for (int j = 1; j <= maxNORD; j++) { //loop over the polynomial orders 452 int nGood = 0, nBad = 0; 453 NORD = j; 454 printf("Testing NORD=%d\n", NORD); 455 psPolynomial1D *poly = makePolynomial1D(NORD, type[k], -1); 456 psPolynomial1D *polycopy = makePolynomial1D(NORD, type[k], -1); 457 psStats *stats = psStatsAlloc(PS_STAT_CLIPPED_MEAN | PS_STAT_CLIPPED_STDEV); 458 stats->clipSigma = Nsigma; 459 stats->clipIter = Niter; 460 psVector *f = psVectorAlloc(NPTS, PS_TYPE_F32); 461 psVector *fErr = psVectorAlloc(NPTS, PS_TYPE_F32); 462 psVector *x = psVectorAlloc(NPTS, PS_TYPE_F32); 463 464 fillVectors(x, f, NORD, NPTS, type[k]); 465 psTime *now = psTimeGetNow(PS_TIME_UTC); 466 const psRandom *r = psRandomAlloc(PS_RANDOM_TAUS, now->sec); 467 for (int i = 0; i < NPTS; i++) { 468 double errgen = psRandomGaussian(r); 469 double amp = 1.0E-3; 470 fErr->data.F32[i] = amp*errgen; 471 //fErr->data.F32[i] = 0.; 472 } 473 psFree(now); 474 psFree(r); 475 476 //f->data.F32[NPTS-1] = X0 + 10.*X1*x->data.F32[NPTS-1]; 477 //fErr->data.F32[NPTS-1] = 0.0000001; 478 479 480 psVectorClipFitPolynomial1D(poly, stats, NULL, 2, f, fErr, x); 481 for (int i = 0; i <= NORD; i++) { 482 if (poly->coeff[i] <= polycopy->coeff[i]+tolerance 483 && 484 poly->coeff[i] >= polycopy->coeff[i]-tolerance) { 485 nGood++; 486 } else { 487 nBad++; 488 printf("polycopy->coeff[%d]=%.20f poly->coeff[%d]=%.20f\n",i,polycopy->coeff[i],i,poly->coeff[i]); 489 } 490 if (polycopy->coeffErr[i] != poly->coeffErr[i]) { 491 printf("polycopy->coeffErr[%d]=%.20f poly->coeffErr[%d]=%.20f\n",i,polycopy->coeffErr[i],i,poly->coeffErr[i]); 492 } 493 } 494 495 if (nBad > 0) { 496 psError(PS_ERR_UNKNOWN,true,"%d incorrect polynomial evaluations for NORD=%d\n", nBad, NORD); 497 retval = retval + pow(2,NORD); 498 } 499 500 printf("NORD: %d retval: %d\n",NORD,retval); 501 psFree(poly); 502 psFree(polycopy); 503 psFree(stats); 504 psFree(f); 505 psFree(fErr); 506 psFree(x); 507 } 508 } 509 return retval; 510 } 511 512 513 514 515 516 517 518 //test psStats 519 520 //test psGaussian 521 522 //test psMinimization (and psMinimizeLMChi2 and psMinimizeChi2Powell?) 523 524 //test psRandomUniform / psRandomGausian / psRandomPoisson 525 526 //test psSpline?
Note:
See TracChangeset
for help on using the changeset viewer.
