;+ ; NAME: ; findmax ; PURPOSE: (one line) ; Find the interpolated local maximum in a 2-D array. ; DESCRIPTION: ; ; CATEGORY: ; Numerical ; CALLING SEQUENCE: ; findmax, x, y, f, xmax, ymax, fmax, $ ; DELTA=in_delta, EPS=in_eps, GOLD=in_gold ; INPUTS: ; x, y : Position of the initial guess. ; f : The 2-D function array. ; OPTIONAL INPUT PARAMETERS: ; ; KEYWORD PARAMETERS: ; DELTA = Half-width of the box containing the desired maximum. ; Default is 1.0 pixel. ; EPS = Stop criterion. Default=1.0E-5. ; GOLD = Pad value on DELTA. Default is 1.0E-4. ; OUTPUTS: ; xmax, ymax : Position of computed maximum. ; fmax : Computed function maximum. ; COMMON BLOCKS: ; ; SIDE EFFECTS: ; ; RESTRICTIONS: ; ; PROCEDURE: ; Binary search (2D). ; A guess for the location of the maximum is chosen. The external function ; sint2d is called to obtain interpolated function values at two symmetric ; points along each axis (x and y). For each axis, the two points are used ; to determine which way to shift the location of the maximum. IF the ; function values at the two points are not equal, the location of the ; maximum is shifted by half the previous amount in the indicated direction, ; and a new set of four points are computed at half the offset used previously. ; This process continues until the offset falls below some small threshold ; value (epsilon). ; MODIFICATION HISTORY: ; Written by Doug Loucks, Lowell Observatory, September, 1993. ;- PRO findmax, in_x, in_y, in_f, out_xmax, out_ymax, out_fmax, $ DELTA=in_delta, EPS=in_eps, GOLD=in_gold IF N_PARAMS() NE 6 THEN BEGIN ;Display the calling sequence. PRINT, 'findmax, x, y, f, xmax, ymax, fmax, ' PRINT, 'DELTA=, EPS=, GOLD=' RETURN ENDIF ;Verify incoming parameters. IF badpar( in_x, [2,3,4,5], 0, CALLER='% FINDMAX: ' ) THEN RETURN IF badpar( in_y, [2,3,4,5], 0, CALLER='% FINDMAX: ' ) THEN RETURN IF badpar( in_f, [2,3,4,5], 2, CALLER='% FINDMAX: ' ) THEN RETURN IF KEYWORD_SET( in_delta ) THEN delta = in_delta ELSE delta = 1.0 IF KEYWORD_SET( in_eps ) THEN eps = in_eps ELSE eps = 1.0E-5 IF KEYWORD_SET( in_gold ) THEN gold = in_gold ELSE gold = 1.0E-4 ;Set the starting values. i = in_x j = in_y h = delta + gold n = 0 REPEAT BEGIN ;Set two test points along the x-axis. x1 = i - h x2 = i + h ;Set two test points along the y-axis. y1 = j - h y2 = j + h ;Compute the function at the offset locations. f1 = sint2d( x2, j, in_f ) f2 = sint2d( i, y2, in_f ) f3 = sint2d( x1, j, in_f ) f4 = sint2d( i, y1, in_f ) ;Shift the x location of the next maximum. If symmetric, no shift. IF f1 GT f3 THEN i = i + h IF f3 GT f1 THEN i = i - h ;Shift the y location of the next maximum. If symmetric, no shift. IF f2 GT f4 THEN j = j + h IF f4 GT f2 THEN j = j - h ;Halve the search interval. h = 0.5 * h n = n + 1 ;Test for convergence. ENDREP UNTIL h LT eps ;MESSAGE, 'Number of iterations ' + STRING( n ), /INFO ;Store the results into the output parameters. out_xmax = i out_ymax = j out_fmax = sint2d( i, j, in_f ) END