.TITLE MIN ;.MACRO .MIN F,XLO,XHI,XMIN,I ;MINIMIZES F(X); XMIN IS RETURNED AS BEST X ;OF F OVER RANGE XLO-->XHI ;I (OPTIONAL) SPECIFIES NO. OF ITERATIONS; DEFAULT IS 20. ;ACCURACY = 1 PART IN 2**I; FOR I=10, ACCURACY IS ABOUT 1 PART PER 1000 ;USER MUST DEFINE Y=F(X) SUBROUTINE: F=ADDRESS OF ENTRY PT ;LOCATION F-4: X ;LOCATION F-10: Y A0=R0 A1=R1 A2=R2 A3=R3 .GLOBL .MIN .MCALL .MOVF .MACRO FUNC X,Y .MOVF X,@ADX CALL @F .MOVF @ADY,Y .ENDM .MACRO AV J ;X[J]=(X[J+1]+X[J-1])/2 LDF 4*+X0,A0 ADDF 4*+X0,A0 DIVF #2,A0 STF A0,4*J+X0 FUNC A0,4*J+Y0 .ENDM I: .BLKW 1 ;NO. ITERATIONS XMIN: .BLKW 2 ;X GIVNG MINIMUM F(XMIN) XHI: .BLKW 2 ;RIGHTMOST X XLO: .BLKW 2 ;LEFTMOST X F: .BLKW 1 ;ADDRESS OF SUBROUTINE F .MIN: MOV R0,-(SP) ;SAVE R0-5 & A0-3 SO USER'S FUNCTION MAY MOV R1,-(SP) ;USE ANY OF THEM MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) STF A0,-(SP) STF A1,-(SP) STF A2,-(SP) STF A3,-(SP) MOV F,ADX ;ADDRESS OF X=F-4 IN USER'S FUNCTION SUB #4,ADX MOV F,ADY ;ADDRESS OF Y=F-10 SUB #10,ADY LDF XHI,A1 ;INITIAL GUESSES STF A1,X4 ;X4=XHI SUBF XLO,A1 DIVF #4,A1 LDF XLO,A0 STF A0,X0 ;X0=XLO ADDF A1,A0 ;X1=0.25*(XHI-XLO)+XLO STF A0,X1 ADDF A1,A0 ;X2=0.5*(XHI+XHI) STF A0,X2 ADDF A1,A0 ;X3=0.75*(XHI-XLO)+XLO STF A0,X3 FUNC X0,Y0 FUNC X1,Y1 FUNC X2,Y2 FUNC X3,Y3 FUNC X4,Y4 ;FIND MIN F OF 5 PTS LSERCH: LDF #1E30,A0 ;A0=MIN F FOUND SO FAR CLR R1 MOV #Y0,R3 LMIN: CMPF (R3),A0 ;IF F[M]