PROGRAM period ! find fixed point of f(x) iterated p times DECLARE DEF f CALL initial(r,p,epsilon,xleft,xright,gleft,gright) DO CALL bisection(r,p,xleft,xright,gleft,gright) LOOP until abs(xleft - xright) < epsilon LET x = 0.5*(xleft + xright) PRINT "explicit demonstration of period"; p; "behavior" PRINT PRINT 0,x ! result FOR i = 1 to 2*p + 1 LET x = f(x,r,1) PRINT i,x NEXT i END SUB initial(r,p,epsilon,xleft,xright,gleft,gright) DECLARE DEF f INPUT prompt "control parameter r = ": r INPUT prompt "period = " : p INPUT prompt "desired precision = ": epsilon LET done$ = "no" DO while done$ = "no" ! do until zero between xleft and xright INPUT prompt "guess for xleft = ": xleft INPUT prompt "guess for xright = ": xright LET gleft = f(xleft,r,p) - xleft LET gright = f(xright,r,p) - xright IF gleft*gright < 0 then LET done$ = "yes" ELSE PRINT "range does not necessarily enclose a root" END IF LOOP END SUB SUB bisection(r,p,xleft,xright,gleft,gright) DECLARE DEF f ! midpoint between xleft and xright LET xmid = 0.5*(xleft + xright) LET gmid = f(xmid,r,p) - xmid IF gmid*gleft > 0 then LET xleft = xmid ! change xleft LET gleft = gmid ELSE LET xright = xmid ! change xright LET gright = gmid END IF END SUB DEF f(x,r,p) ! f defined by recursive procedure IF p > 1 then LET y = f(x,r,p-1) LET f = 4*r*y*(1-y) ELSE LET f = 4*r*x*(1-x) END IF END DEF