Pro bio,r,p0,pop ;+ --------------------------------------------------------------- ; ; BIO is an IDL demonstration program which calculates the ; population of a sample "DETERMINISTIC, NONPERIODIC" CHAOTIC ; BIOLOGICAL SYSTEM. ; ; The user is invited to run BIO for various values of the ; input parameters r and p0, looking for those which yield ; chaotic behavior. ; ; The function used here is p(n+1) = r*p(n)*(1-p(n)). p(n) is the ; population of the nth generation in the system. This is a famous ; example of a function which, for the correct selection of r and p(0), ; can produce "deterministic, nonperiodic" behavior. ; ; INPUT: ; ; To execute the routine for parameters r and p(0) = p0, type: ; ; bio,r,p0,pop ; ; RECOMMENDED INPUT PARAMETERS: ; ; Try various r,p0 combinations, but keep p0 positive and less than 1.0. ; A good starting point is r =2.9, p0 = 0.05. ; A combination yielding chaotic behavior is r = 4, p0 = 0.05. ; ; Explore the rapid changes in the function near these values by ; using the recall buffer ("up" arrow) and editing the command line. ; ; [The program terminates the computation if the pop vector goes negative.] ; ; OUTPUT: ; ; BIO automatically produces two plots: the population versus generation ; number, and the power spectrum of the population ; ; The [optional] output vector POP, which shows the population of the ; biological system, has 500 elements. It is plotted on the ; terminal along with its power spectrum calculated with a fast ; Fourier transform function. A sharp spike in the power spectrum ; indicates that the POP function has strongly periodic behavior, ; whereas a broad, irregular power spectrum is found for non-periodic, ; chaotic behavior. ; ; You can experiment with various IDL plotting modes using the POP ; output vector of BIO. If you wish to see only part of ; the pop function, type "plot,pop(0:50)", for example, to plot only ; the first 51 elements. You can store the result of the calculation ; in any variable you wish: e.g. "bio,r,p0,snarf" creates the output ; array "snarf". It is therefore easy to compare results for different ; input parameters. ; ; A vector containing the power spectrum can be obtained by typing ; "f = abs(fft(pop,-1))". ; ; If you wish to see the coding of the subroutine, type ".run -t bio" ; ; HISTORY: Created 28 FEB 90, RWO ; 5/31/00: Text consolidated; doc revised ; 6/26/00: Call sequence change, other small mods. RWO ; 7/12/00: Stop computation when pop goes negative ; 8/1/01: Doc update ; 8/8/01: Doc update ;------------------------------------------------------------- if (n_params(0) eq 0) then begin print,' TO RUN BIO, type: bio,r,p0,pop' print,' where r is ~ 1-4 and 0 < p0 < 1.0' return endif pop=fltarr(500) ; Create a 500-element array to hold result ; Initial value is zero pop(0)=p0 ; First element of result is parameter p0 for i = 1,499 do begin ; Fill remainder of answer array s = pop(i-1) if ((1-s) le 0) then goto,next pop(i) = r*s*(1-s) endfor next: ; Set up general plotting parameters !fancy=1 !ignore=1 !type=16 ; Plot pop versus generation in upper window set_viewport,0.15,0.9,0.59,0.95 ; Define upper window !mtitle='POPULATION HISTORY' !xtitle='Generation' !ytitle='Population Size' plot,pop ; Plot the result ; Plot power spectrum of population history in lower window !noeras=1 set_viewport,0.15,0.9,0.1,0.46 ; Define lower window !mtitle='POWER SPECTRUM' !xtitle='Frequency' !ytitle='Amplitude' plot_io,abs(fft(pop,-1)) ; Plot power spectrum in semilog form ; Restore plotting parameters set_viewport,0.1,0.95,0.1,0.95 !noeras=0 !mtitle=' ' !xtitle=' ' !ytitle=' ' return end