IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 30, 2010, 1:29:50 PM (16 years ago)
Author:
eugene
Message:

add diff stats; add flux to CMF_PS1_DV1; output PSF residual mask; more accurate calculation of radius of source model

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/objects/models/pmModel_RGAUSS.c

    r26916 r27531  
    257257psF64 PM_MODEL_RADIUS (const psVector *params, psF64 flux)
    258258{
    259     psF64 z, f;
     259    psF64 z;
    260260    int Nstep = 0;
    261261    psEllipseShape shape;
     
    291291    z0 = 0.0;
    292292
    293     // perform a type of bisection to find the value
    294     float f0 = 1.0 / (1 + z0 + pow(z0, PAR[PM_PAR_7]));
    295     float f1 = 1.0 / (1 + z1 + pow(z1, PAR[PM_PAR_7]));
    296     while ((Nstep < 10) && (fabs(z1 - z0) > 0.5)) {
    297         z = 0.5*(z0 + z1);
    298         f = 1.0 / (1 + z + pow(z, PAR[PM_PAR_7]));
    299         if (f > limit) {
    300             z0 = z;
    301             f0 = f;
    302         } else {
    303             z1 = z;
    304             f1 = f;
    305         }
    306         Nstep ++;
    307     }
     293    // starting guess:
     294    z = 0.5*(z0 + z1);
     295    float dz = 1.0;
     296
     297    for (int i = 0; (i < 10) && (fabs(dz) > 0.0001); i++) {
     298        // use Newton-Raphson to minimize f(z) - limit = 0
     299        float q = (1 + z + pow(z,PAR[PM_PAR_7]));
     300        float dqdz = (1.0 + PAR[PM_PAR_7]*pow(z,PAR[PM_PAR_7] - 1.0));
     301
     302        float f = 1.0 / q;
     303        float dfdz = -dqdz * f / q;
     304
     305        dz = (f - limit) / dfdz;
     306
     307        // fprintf (stderr, "%f %f %f : %f %f\n", f, z, dz, dfdz, q);
     308        z -= dz;
     309    }
     310
    308311    psF64 radius = sigma * sqrt (2.0 * z);
    309312
Note: See TracChangeset for help on using the changeset viewer.