home *** CD-ROM | disk | FTP | other *** search
- !PROGRAM TITLE "XBIFURCA"
- CLEAR
- PRINT" ***PENDULUM - BIFURCATION DIAGRAM***"
- PRINT"THIS PROGRAM DISPLAYS THE BIFURCATION DIAGRAM FOR THE PENDULUM."
- PRINT"FOR EACH VALUE OF FORCING AMPLITUDE, G, THE SYSTEM COMES TO A "
- PRINT"STEADY STATE (AFTER MIN.TIME) AND THEN THE ANGULAR VELOCITY AT"
- PRINT"AT THE BEGINNING OF EACH FORCING CYCLE IS DISPLAYED FOR A NUMBER OF"
- PRINT"FURTHER CYCLES (GOVERNED BY MAX. TIME). THE DATA CAN BE SAVED TO A FILE"
- PRINT
-
- DIM XINT(10), VINT(10)
- LIBRARY "SGLIB.TRC"
- !
- DECLARE DEF accel
- DIM A(1),B(1)
- INPUT prompt"Input LOWEST DRIVING FORCE STRENGTH: ":GMIN
- INPUT PROMPT"INPUT HIGHEST DRIVING FORCE STRENGTH:":GMAX
- INPUT PROMPT"INPUT G STEPSIZE:":DELTAG
- INPUT PROMPT"INPUT NUMBER OF SETS OF INITIAL CONDITIONS:":NUMSETS
- FOR I=1 TO NUMSETS
- INPUT PROMPT"INPUT INITIAL ANGLE:":XINT(i)
- INPUT PROMPT"INPUT INITIAL ANGULAR VELOCITY:":VINT(I)
- NEXT I
- INPUT prompt"Input damping (If no damping then input 9999999):":q
- INPUT Prompt"Input min. and max. time:":tmin,tmax
- INPUT prompt"Input phase angle/(2*pi) - USE ZERO IF WANT BEGINNING OF CYCLE:":PHI
- PRINT
- PRINT"SINCE THE RUNTIME IS VERY LONG THE NEXT SET OF INPUTS GIVE AN OPTION"
- PRINT"TO SAVE THE DATA TO A FILE"
- INPUT PROMPT"SAVE TO A FILE? YES(1), NO(2):":SV
- IF SV=1 THEN
- PRINT "A REASONABLE 8 CHARACTER FILE NAME (USE A NUMBER) MIGHT INCLUDE"
- PRINT"1)FIRST 2 DIGITS FOR Q VALUE"
- PRINT"2)NEXT 3 DIGITS FOR LOWEST G VALUE"
- PRINT"3)LAST 3 DIGITS FOR HIGHES G VALUE"
- PRINT" EXAMPLE 20145150"
- INPUT PROMPT"FILE NAME =>":FILENAME
- INPUT PROMPT"DATA FILE DRIVE (A/B/C/D):":B$
- LET NAME$=STR$(FILENAME)
- END IF
- CLEAR
- CALL PARAMS(W,EPS,TSTEP)
- CALL SETAXES(0)
- CALL SETXSCALE(GMIN,GMAX)
- CALL SETYSCALE(-1,3)
- CALL SETTEXT("PENDULUM BIFURCATION DIAGRAM","FORCING-G","ANGULAR VELOCITY")
- CALL RESERVELEGEND
- !
- DATA O,O
- CALL DATAGRAPH(A,B,1,O,"WHITE")
- !
- IF SV=1 THEN !OPENS A FILE AND SPECIFIES CHARACTERISTICS
- OPEN #1:NAME B$&":"&NAME$,ORGANIZATION RECORD, CREATE NEWOLD
- ASK #1:FILESIZE LENGTH
- IF LENGTH=0 THEN SET#1: RECSIZE 10
- SET #1: POINTER END
- END IF
- !
- FOR II=1 TO NUMSETS !LOOPS FOR ALL INITIAL CONDITIONS
- LET T=0
- LET XP =XINT(ii)
- LET VP= VINT(II)
- FOR G=GMIN TO GMAX STEP DELTAG !LOOPS FOR ALL G VALUES
- LET t=0
- LET x=xP
- LET v=vP
- CALL GOTOCANVAS
- !
- !CALCULATION AND GRAPHING BLOCK
- LET phi=phi*2*pi
- FOR i=1 to 1000000
- CALL rk4(x,v,tstep,xnew,vnew,t,w,g,q) ! Take a step of size tstep
- LET tshalf=tstep/2
- CALL rk4(x,v,tshalf,xnh,vnh,t,w,g,q) !Take two half steps
-
- CALL rk4(xnh,vnh,tshalf,xn,vn,t+tshalf,w,g,q)
- LET d1=abs(xn-xnew)
- LET d2=abs(vn-vnew)
- LET delta=max(d1,d2)
- IF delta<eps then
- IF t>tmin then
- LET tnew=t+tstep
- LET w1=mod(phi-w*t,2*pi) !Check for Poincare section
- LET w2=mod(w*tnew-phi,2*pi)
- IF w1<w*tstep then
- IF w2<w*tstep then
- LET ts=w1/w
- CALL rk4(x,v,ts,xp,vp,t,w,g,q) !CALCULATES POINT AT SECTION
- IF abs(xp)>pi then LET xp=xp-2*pi*abs(xp)/xp
- CALL GRAPHPOINT(G,VP,1)
- IF SV=1 THEN WRITE #1:G,VP
- END IF
- END IF
- END IF
- LET x=xnew
- LET v=vnew
- LET t=t+tstep !Expand step size
- LET tstep=tstep*.95*(eps/delta)^.25
- IF abs(x)>pi then !bring theta back into range
- LET x=x-2*pi*abs(x)/x
- END IF
- ELSE !else reduce step size
- LET tstep=tstep*.95*(eps/delta)^.2
- END IF
- IF t>tmax then LET i=1000001
- NEXT i
- NEXT G
- NEXT II
- LET G$=STR$(G)
- LET Q$=STR$(Q)
- CALL ADDLEGEND(" Q="&STR$(Q)&" PHI="&STR$(PHI),0,1,"WHITE")
- CALL DRAWLEGEND
- get key variable
- clear
- print"press <esc> key to finish"
- END
- !
- !
- SUB rk4(x,v,tstep,xnew,vnew,t,w,g,q)
- DECLARE DEF accel
- LET xk1=tstep*v
- LET vk1=tstep*accel(x,v,t,w,g,q)
- LET xk2=tstep*(v+vk1/2)
- LET vk2=tstep*accel(x+xk1/2,v+vk1/2,t+tstep/2,w,g,q)
- LET xk3=tstep*(v+vk2/2)
- LET vk3=tstep*accel(x+xk2/2,v+vk2/2,t+tstep/2,w,g,q)
- LET xk4=tstep*(v+vk3)
- LET vk4=tstep*accel(x+xk3,v+vk3,t+tstep,w,g,q)
- LET vnew=v+(vk1+2*vk2+2*vk3+vk4)/6
- LET xnew=x+(xk1+2*xk2+2*xk3+xk4)/6
- END SUB
- DEF accel(x,v,t,w,g,q)
- LET accel=-sin(x)-(1/q)*v+g*cos(w*t)
- END DEF
- !
- SUB PARAMS(W,EPS,TSTEP)
- LET W=0.66666666
- LET EPS=1.0E-6
- LET TSTEP=0.5
- END SUB
-