home *** CD-ROM | disk | FTP | other *** search
- !
- !PROGRAM TITLE "XMOTION"
- LIBRARY "SGLIB.TRC"
- DIM A(1),B(1)
- !
- CLEAR
- print" ***PENDULUM - ANIMATION OF ITS MOTION***"
- PRINT"This program draws the motion of the pendulum at equal time intervals."
- PRINT
- INPUT prompt"Input driving force strength (0.5 to 1.5):":g
- INPUT prompt"input damping ,q (2 to 4):":q
- INPUT prompt"Input initial position:":xint
- INPUT Prompt"Input initial velocity:":vint
- INPUT prompt"Input min. and max. time:":tmin,tmax
- INPUT prompt"Input drive angular frequency (try .666666666):":w
- LET tstep=.5
-
- !SET WINDOW -1,1,-1,1
- !BOX LINES -.95,.95,-.95,.95
- CALL SETXSCALE(-1,1)
- CALL SETYSCALE(-1,1)
- CALL SETAXES(0)
- CALL SETTICKSIZES(0,0)
- CALL SETTITLE("PENDULUM ANIMATION")
- DATA 0,0
- CALL DATAGRAPH(A,B,0,0,"WHITE")
- CALL GOTOCANVAS
- PICTURE Pendulum
- SET COLOR "white"
- FOR k=1 to 2
- IF k=2 then SET COLOR "black"
- PLOT LINES:0,0;0,-.5;.05,-.5;.05,-.55;-.05,-.55;-.05,-.5;0,-.5
- NEXT k
-
- END PICTURE
-
- FOR i=1 to 1000000
- CALL rk4(x,v,tstep,xnew,vnew,t,w,g,q)
- LET t=t+tstep
- LET x=xnew
- LET v=vnew
- IF t>tmin then
- LET angle=x
- DRAW pendulum with rotate(angle)
- PLOT
- END IF
- IF t>tmax then LET i=1000001
- NEXT i
- get key variable
- CLEAR
- END
-
- DEF accel(x,v,t,w,g,q)
- LET accel= -sin(x)-(1/q)*v+g*cos(w*t)
- END DEF
-
- 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
-
-