; docformat = 'idl'
;+
; PURPOSE:
; (NB: unlikely to be useful!) This function finds the
; best-fitting double Choloniewski function for input arrays of
; absolute magnitudes, surface brightness, phi and phi_err.
;-
;+
; NAME:
; ajs_double_choloniewski_fit
;
;
; PURPOSE:
; This function finds the best-fitting double Choloniewski function for
; input arrays of absolute magnitudes, surface brightness, phi
; and phi_err.
;
;
; CATEGORY:
;
;
;
; CALLING SEQUENCE:
;
;
;
; INPUTS:
; absmag
; sbr
; phi
; phierr
;
; OPTIONAL INPUTS:
; params_init Initial guess for
; [mstar,alpha,phistar,sbstar,sigmasb,beta]
; twice (or default)
;
; KEYWORD PARAMETERS:
; txtfile Output text file
;
;
; OUTPUTS:
; Result [mstar,alpha,phistar,sbstar,sigmasb,beta]
;
;
; OPTIONAL OUTPUTS:
;
;
;
; COMMON BLOCKS:
;
;
;
; SIDE EFFECTS:
;
;
;
; RESTRICTIONS:
; Uses mpfit2d (idlutils)
; ajs_choloniewski
;
; PROCEDURE:
;
;
;
; EXAMPLE:
;
;
;
; MODIFICATION HISTORY:
; 17 Jan 2008 Created, Anthony Smith
;-
FUNCTION ajs_double_choloniewski_fit, absmag, sb, phi, phierr, params_init, $
txtfile=txtfile
compile_opt idl2
IF n_elements(params_init) EQ 0 THEN $
params_init=[median(absmag) - 1, -0.5, 0.01, $
median(sb) - 1, 0.5, 0.2, $
median(absmag) + 1, -1.5, 0.01, $
median(sb) + 1, 1.5, 0.6]
params_init = double(params_init)
absmag_arr = absmag # (sb * 0 + 1)
sb_arr = (absmag * 0 + 1) # sb
parinfo = replicate({value:0.D, fixed:0, limited:[0,0], $
limits:[0.D,0]}, 12)
parinfo[1].limited = [1, 1]
parinfo[1].limits = double([1e-3, 1e-1])
parinfo[7].limited = [1, 1]
parinfo[7].limits = [1e-3, 1e-1]
params=mpfit2dfun('ajs_double_choloniewski', $
absmag_arr, $
sb_arr, $
phi, $
phierr, $
params_init, /quiet, covar=covar, perror=perror, $
parinfo=parinfo)
;; print, 'PError:', float(perror)
;; print, 'Covariance:'
;; print, float(covar)
;; PCOR = covar * 0
;; n = 6
;; FOR i = 0, n-1 DO FOR j = 0, n-1 DO $
;; PCOR(i,j) = covar(i,j)/sqrt(covar(i,i)*covar(j,j))
;; print, 'Correlation:'
;; print, float(pcor)
IF keyword_set(txtfile) THEN BEGIN
;; Text file
openw, unit, txtfile, /get_lun
printf, unit, params
free_lun, unit
ENDIF
RETURN,params
END
PRO ajs_choloniewski_fit_test
;; This works:
;; params_true = [-24, 0, 1e-2, 17, 0.5, 0, $
;; -21, -1, 1e-2, 18, 0.9, 0.5]
params_true = [-24, 0, 1e-2, 17, 0.5, 0, $
-22, -1, 1e-2, 18, 0.9, 0.5]
m = ajs_linspace(-16, -26, 21)
sb = ajs_linspace(22, 14, 21)
print,'Starting with'
print, params_true[0:5]
print, params_true[6:11]
chol = ajs_double_choloniewski(m, sb, params_true)
cholerr = chol / 10
ajs_bbd_plot, m, sb, chol, /show_plot, plotfile='/tmp/bbd.eps'
;; Fit
; params_init = params_true * 1.1
params = ajs_double_choloniewski_fit(m, sb, chol, cholerr);, params_init)
print,'Fitted parameters:'
print, params[0:5]
print, params[6:11]
cholfit = ajs_double_choloniewski(m, sb, params)
ajs_bbd_plot, m, sb, cholfit, /show_plot, plotfile='/tmp/bbd2.eps'
END