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_PGAUSS.c

    r26916 r27531  
    236236psF64 PM_MODEL_RADIUS (const psVector *params, psF64 flux)
    237237{
    238     psF64 z, f;
     238    psF64 z;
    239239    int Nstep = 0;
    240240    psEllipseShape shape;
     
    271271    z0 = 0.0;
    272272
    273     // perform a type of bisection to find the value
    274     float f0 = 1.0 / (1 + z0 + z0*z0/2.0 + z0*z0*z0/6.0);
    275     float f1 = 1.0 / (1 + z1 + z1*z1/2.0 + z1*z1*z1/6.0);
    276     while ((Nstep < 10) && (fabs(z1 - z0) > 0.5)) {
    277         z = 0.5*(z0 + z1);
    278         f = 1.0 / (1 + z + z*z/2.0 + z*z*z/6.0);
    279         if (f > limit) {
    280             z0 = z;
    281             f0 = f;
    282         } else {
    283             z1 = z;
    284             f1 = f;
    285         }
    286         Nstep ++;
    287     }
     273    // starting guess:
     274    z = 0.5*(z0 + z1);
     275    float dz = 1.0;
     276
     277    for (int i = 0; (i < 10) && (fabs(dz) > 0.0001); i++) {
     278        // use Newton-Raphson to minimize f(z) - limit = 0
     279        float dqdz = (1.0 + z + z*z/2.0);
     280        float q = (dqdz + z*z*z/6.0);
     281
     282        float f = 1.0 / q;
     283        float dfdz = -dqdz * f / q;
     284
     285        dz = (f - limit) / dfdz;
     286
     287        // fprintf (stderr, "%f %f %f : %f %f\n", f, z, dz, dfdz, q);
     288        z -= dz;
     289    }
     290
    288291    psF64 radius = sigma * sqrt (2.0 * z);
    289292
Note: See TracChangeset for help on using the changeset viewer.