IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Dec 13, 2015, 5:50:46 AM (11 years ago)
Author:
eugene
Message:

merged changes from trunk

Location:
branches/eam_branches/ipp-20151113
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20151113

  • branches/eam_branches/ipp-20151113/Ohana/src/opihi/cmd.astro/fitpm_irls.c

    r39223 r39266  
    11# include "astro.h"
    2 # define J2000 51544.5       /* Modified Julian date at standard epoch J2000 */
    3 
    4 # define ESCAPE(MSG,...) {                      \
    5     gprint (GP_ERR, MSG, __VA_ARGS__);          \
    6     return FALSE; }
    7 
    8 typedef struct {
    9   double Ro, dRo;
    10   double Do, dDo;
    11 
    12   double uR, duR;
    13   double uD, duD;
    14  
    15   double chisq;
    16   int Nfit;
    17 } PMFit_IRLS;
    18 
    19 int FitPMonly_IRLS (PMFit_IRLS *fit, double *X, double *dX, double *Y, double *dY, double *T, int Npts, int VERBOSE);
    20 int IRLS_converged (PMFit_IRLS *fit);
    21 int weighted_LS (double *T, double *X, double *WX, double *Y, double *WY, int Npts,
    22                  double **A, double **B, int VERBOSE);
    23 double weight_cauchy (double x);
    24 double dpsi_cauchy (double x);
    25 double MAD(double *in, int N);
    26      
    272
    283int fitpm_irls (int argc, char **argv) {
     
    129104  }
    130105
    131   PMFit_IRLS fit;
     106  PlxFit fit;
    132107  if (!FitPMonly_IRLS (&fit, X, dX, Y, dY, t, n, VERBOSE)) {
    133108    return FALSE;
     
    165140
    166141/* do we want an init function which does the alloc and a clear function to free? */
    167 int FitPMonly_IRLS (PMFit_IRLS *fit, double *X, double *dX, double *Y, double *dY, double *T, int Npts, int VERBOSE) {
     142int FitPMonly_IRLS (PlxFit *fit, double *X, double *dX, double *Y, double *dY, double *T, int Npts, int VERBOSE) {
    168143
    169144  int i,j;
     
    222197 
    223198  // Solve OLS equation 
    224   if (!weighted_LS(T,X,Wx,Y,Wy,Npts,
     199  if (!weighted_LS_PM(T,X,Wx,Y,Wy,Npts,
    225200                   A,B,VERBOSE)) {
    226201    // Handle fail case
     
    267242
    268243    // Solve
    269     if (!weighted_LS(T,X,Wx,Y,Wy,Npts,
     244    if (!weighted_LS_PM(T,X,Wx,Y,Wy,Npts,
    270245                     A,B,VERBOSE)) {
    271246      // Handle fail case
     
    284259      u[i] = sqrt(SQ(rx[i] / dX[i]) + SQ(ry[i] / dY[i]));
    285260    }
    286     sigma_hat = MAD(u,Npts) / 0.6745;
     261    sigma_hat = MedianAbsDeviation(u,Npts) / 0.6745;
    287262   
    288263    // Check convergence
     
    310285  double Sum_Wx, Sum_Wy;
    311286 
     287  Sum_Wx = 0.0;
     288  Sum_Wy = 0.0;
    312289  ax = 0.0; ay = 0.0;
    313290  bx = 0.0; by = 0.0;
     
    387364}
    388365
    389 
    390 double weight_cauchy (double x) {
    391   double r = x / 2.385;
    392   return (1.0 / (1.0 + SQ(r)));
    393 }
    394 
    395 // dpsi = (d/dx) (x * weight(x))
    396 double dpsi_cauchy (double x) {
    397   double r2 = SQ(x / 2.385);
    398   return ((1.0 - r2) / (SQ(1 + r2)));
    399 }
    400 
    401 
    402 // median absolute deviation
    403 // MAD = median(abs(x - median(x)))
    404 double MAD(double *in, int N) {
    405   double *x;
    406   double median = 0.0;
    407   int i;
    408  
    409   ALLOCATE(x,double,N);
    410   for (i = 0; i < N; i++) {
    411     x[i] = in[i];
    412   }
    413 
    414   dsort(x,N);
    415 
    416   if (N % 2) {
    417     median = 0.5*(x[(int)(0.5*N)] + x[(int)(0.5*N) - 1]);
    418   } else {
    419     median = x[(int)(0.5*N)];
    420   }
    421 
    422   for (i = 0; i < N; i++ ) {
    423     x[i] = fabs(x[i] - median);
    424   }
    425 
    426   dsort(x,N);
    427 
    428   if (N % 2) {
    429     median = 0.5*(x[(int)(0.5*N)] + x[(int)(0.5*N) - 1]);
    430   } else {
    431     median = x[(int)(0.5*N)];
    432   }
    433 
    434   return(median);
    435 }
    436    
    437  
    438  
    439 int weighted_LS (double *T, double *X, double *WX, double *Y, double *WY, int Npts,
    440                  double **A, double **B, int VERBOSE) {
     366int weighted_LS_PM (double *T, double *X, double *WX, double *Y, double *WY, int Npts, double **A, double **B, int VERBOSE) {
    441367
    442368  int i,j;
     
    497423  return TRUE;
    498424}
     425
     426double weight_cauchy (double x) {
     427  double r = x / 2.385;
     428  return (1.0 / (1.0 + SQ(r)));
     429}
     430
     431// dpsi = (d/dx) (x * weight(x))
     432double dpsi_cauchy (double x) {
     433  double r2 = SQ(x / 2.385);
     434  return ((1.0 - r2) / (SQ(1 + r2)));
     435}
     436
     437
     438// median absolute deviation
     439// MAD = median(abs(x - median(x)))
     440double MedianAbsDeviation(double *in, int N) {
     441  double *x;
     442  double median = 0.0;
     443  int i;
     444 
     445  ALLOCATE(x,double,N);
     446  for (i = 0; i < N; i++) {
     447    x[i] = in[i];
     448  }
     449
     450  dsort(x,N);
     451
     452  if (N % 2) {
     453    median = 0.5*(x[(int)(0.5*N)] + x[(int)(0.5*N) - 1]);
     454  } else {
     455    median = x[(int)(0.5*N)];
     456  }
     457
     458  for (i = 0; i < N; i++ ) {
     459    x[i] = fabs(x[i] - median);
     460  }
     461
     462  dsort(x,N);
     463
     464  if (N % 2) {
     465    median = 0.5*(x[(int)(0.5*N)] + x[(int)(0.5*N) - 1]);
     466  } else {
     467    median = x[(int)(0.5*N)];
     468  }
     469
     470  return(median);
     471}
     472 
Note: See TracChangeset for help on using the changeset viewer.