home *** CD-ROM | disk | FTP | other *** search
- !PROGRAM TITLE - "XPHASE2D"
- !THIS PROGRAM DISPLAYS THE 2-DIMENSIONAL PHASE DIAGRAM
- !FOR THE DRIVEN AND UNDRIVEN PENDULUM.
- !
- LIBRARY "SGLIB.TRC"
- DECLARE DEF ACCEL
- DIM A(1), B(1)
- !INPUT STATEMENTS
- INPUT PROMPT"INPUT DRIVING FORCE STRENGTH:":g
- INPUT PROMPT"INPUT DAMPING (IF NO DAMPING THEN INPUT 9999999):":q
- INPUT PROMPT"INPUT: INITIAL ANGLE , ANGULAR VELOCITY:":XINT,VINT
- INPUT PROMPT"INPUT: MINUMUM TIME , MAXIMUM TIME:":TMIN,TMAX
- INPUT PROMPT"AVERAGE VELOCTY CALCULATION; YES(1) , NO(2):":AVC
- CALL PARAMS(W,EPS,TSTEP,XMIN,XMAX,YMIN,YMAX) !SETS MISC AND GRAPH PARAMETERS
- CALL SETXSCALE(XMIN,XMAX) !FROM SGLIB
- CALL SETYSCALE(YMIN,YMAX) !FROM SGLIB
- CALL SETTEXT("PENDULUM - 2-D PHASE DIAGRAM","ANGLE","ANGULAR VELOCITY")
- CALL RESERVELEGEND !FROM SGLIB , SAVES SPACE FOR LEGENDS
-
- DATA 0,0
- CALL DATAGRAPH(A,B,1,0,"WHITE") !FROM SGLIB - PLOTS INITIAL POINT
- LET T=0
- LET X=XINT
- LET V=VINT
- CALL GOTOCANVAS !SETS SCREEN FOR GRAPH
- !
- !CALCULATION AND GRAPHNG BLOCK
- FOR I=1 TO 10000000
- CALL RK4(X,V,TSTEP,XNEW,VNEW,T,W,G,Q) !CALL RUNGE-KUTTA, STEP = TSTEP
- LET TSHALF=TSTEP/2 ! SPLIT INTERVAL
- CALL RK4(X,V,TSHALF,XNH,VNH,T,W,G,Q) ! DO 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
- IF ABS(X)>PI THEN LET X=X-2*PI*ABS(X)/X
- CALL GRAPHPOINT(X,V,1)
- LET SUMVEL=SUMVEL+V*TSTEP !UPDATE AVERAGE
- END IF
- LET X=XNEW
- LET V=VNEW
- LET T=T+TSTEP
- LET TSTEP=TSTEP*.95*(EPS/DELTA)^.25
- IF ABS(X)>PI THEN LET X=X-2*PI*ABS(X)/X
- ELSE
- LET TSTEP=TSTEP*.95*(EPS/DELTA)^.2 !REDUCE STEP SIZE
- END IF
- IF T>TMAX THEN LET I=10000001
- NEXT I
- LET MEANVEL=SUMVEL/(TMAX-TMIN)
- CALL ADDLEGEND("G="&STR$(G)&" Q="&STR$(Q),0,1,"WHITE")
- IF AVC=1 THEN CALL ADDLEGEND("AV. VEL. = "&STR$(MEANVEL),0,1,"WHITE")
- CALL DRAWLEGEND !ADDS G AND Q VALUES TO LEGEND
- get key variable
- clear
- print"press <esc> key to finish"
- END
- !
- SUB RK4(X,V,TSTEP,XNEW,VNEW,T,W,G,Q) !RUNGE-KUTTA INTEGRATOR
- 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 DAMP=1/Q
- LET ACCEL=-SIN(X)-DAMP*V+G*COS(W*T)
- END DEF
- !
- SUB PARAMS(W,EPS,TSTEP,XMIN,XMAX,YMIN,YMAX)
- LET W=0.66666666
- LET EPS=1.0E-6
- LET TSTEP=0.5
- LET XMIN=-3
- LET XMAX=3
- LET YMIN=-3
- LET YMAX=3
- END SUB
-
-