home *** CD-ROM | disk | FTP | other *** search
- !PROGRAM TITLE "XPENDLYA"
- LIBRARY "SGLIB.TRC"
- DIM A(1),B(1)
- CLEAR
- PRINT" ***PENDULUM - LYAPUNOV EXPONENTS***"
- PRINT
- PRINT"THIS PROGRAM CALCULATES THE 3 LYAPUNOV EXPONENTS FOR THE DRIVEN PENDULUM"
- PRINT"USING THE ALGORITHM OF WOLF ET AL. THE EXPONENTS ARE SMOOTHED OVER "
- PRINT"MANY DRIVE CYCLES (ORBITS)."
- !
- !N=# OF NONLINEAR EQUTNS., NN= TOTAL # OF EQUATIONS
- LET N=3
- LET NN=12
- DECLARE DEF YPRIM
- !
- DIM Y(12), ZNORM(3), GSC(3), CUM(3), YNEW(12)
- !
- !INITIAL CONDITIONS FOR NONLINEAR SYSTEM
- LET Y(1)=.5
- LET Y(2)=0
- LET Y(3)=0
- !
- !INITIAL CONDITIONS FOR LINEAR SYSTEM (ORTHONORMAL FRAME)
- FOR I= N+1 TO NN
- LET Y(I)=0.0
- NEXT I
- FOR I=1 TO n
- LET Y((N+1)*I) = 1.0
- LET CUM(I)=0.0
- NEXT I
- !
- INPUT PROMPT"INTEGRATION STEPSIZE (TRY 0.5):":TSTEP
- INPUT PROMPT"NUMBER OF ORBITS:":NUMORBITS
- INPUT PROMPT"DRIVING FORCE:":G
- INPUT PROMPT"DRIVE FREQUENCY:":W
- INPUT PROMPT"DAMPING FACTOR:":Q
- INPUT PROMPT"LOG BASE (1)NATURAL (2)INF0-2 CHOOSE 1 OR 2:":BASE
- !
- !SET UP GRAPHICS
- IF BASE=1 THEN CALL SETYSCALE(-.7,.3)
- IF BASE=2 THEN CALL SETYSCALE(-1,.5)
- CALL SETXSCALE(0,NUMORBITS)
- CALL SETTEXT("PENDULUM - LYAPUNOV EXPONENTS","# DRIVE CYCLES","LYAP. EXPS.")
- CALL SETAXES(0)
- CALL RESERVELEGEND
- DATA 0,0
- CALL DATAGRAPH(A,B,1,0,"WHITE")
- CALL GOTOCANVAS
- !
- DO WHILE Y(3)<2*PI*NUMORBITS
- !INITIALIZE INTEGRATOR
- CALL RKK4(Y(),NN,TSTEP,Q,W,G,YNEW())
- FOR K=1 TO 12
- LET Y(K)=YNEW(K)
- NEXT K
- !
- !CONSTRUCT A NEW ORTHONORMAL BASIS BY GRAM-SCHMIDT METHOD
- !NORMALIZE FIRST VECTOR
- LET ZNORM(1)=0.0
- FOR J = 1 TO N
- LET ZNORM(1) = ZNORM(1) +Y(N*J+1)^2
- NEXT J
- LET ZNORM(1)=(ZNORM(1))^.5
- FOR J=1 TO N
- LET Y(N*J+1)=Y(N*J+1)/ZNORM(1)
- NEXT J
- !
- !GENERATE THE NEW ORTHONORMAL SET OF VECTORS
- FOR J=2 TO N
- ! GENERATE J-1 COEFFICIENTS
- FOR K = 1 TO (J-1)
- LET GSC(K)=0.0
- FOR L = 1 TO N
- LET GSC(K) = GSC(K) + Y(N*L+J)*Y(N*L+K)
- NEXT L
- NEXT K
- !
- ! CONSTRUCT A NEW VECTOR
- FOR K = 1 TO N
- FOR L= 1 TO J-1
- LET Y(N*K+J) = Y(N*K+J) -GSC(L)*Y(N*K+L)
- NEXT L
- NEXT K
- !
- ! CALCULATE THE VECTOR'S NORM
- LET ZNORM(J) = 0.0
- FOR K= 1 TO N
- LET ZNORM(J) = ZNORM(J)+Y(N*K+J)^2
- NEXT K
- LET ZNORM(J) = (ZNORM(J))^.5
- !
- ! NORMALIZE THE NEW VECTOR
- FOR K = 1 TO N
- LET Y(N*K+J) = Y(N*K+J)/ZNORM(J)
- NEXT K
- NEXT J
- !
- ! UPDATE RUNNING VECTOR MAGNITUDES
- FOR K = 1 TO N
- LET CUM(K) = CUM(K) +LOG(ZNORM(K))
- IF BASE = 2 THEN LET CUM(K) = CUM(K)/LOG(2)
- NEXT K
- !
- !NORMALIZE EXPONENT AND PLOT EXPONENTS
- IF Y(3)>0 THEN
- LET T=Y(3)/W
- FOR K = 1 TO N
- LET CUMKT=CUM(K)/T
- CALL GRAPHPOINT(T*W/(2*PI),CUMKT,1)
- NEXT K
- END IF
-
- LOOP
- !
- CALL ADDLEGEND("G="&STR$(G)&" Q="&STR$(Q)&" W="&STR$(W),0,1,"WHITE")
- CALL DRAWLEGEND
- END
- !
- SUB RKK4(Y(),NN,TSTEP,Q,W,G,YNEW())
- DIM Y1(12), Y2(12), Y3(12), Y4(12), YY1(12), YY2(12), YY3(12)
- DECLARE DEF YPRIM
- FOR K= 1 TO NN
- LET Y1(K)=TSTEP*YPRIM(Y(),K,Q,W,G)
- NEXT K
- FOR K= 1 TO NN
- LET YY1(K)=Y(K)+Y1(K)/2
- NEXT K
- FOR K=1 TO NN
- LET Y2(K)=TSTEP*YPRIM(YY1(),K,Q,W,G)
- NEXT K
- FOR K = 1 TO NN
- LET YY2(K)=Y(K)+Y2(K)/2
- NEXT K
- FOR K = 1 TO NN
- LET Y3(K)=TSTEP*YPRIM(YY2(),K,Q,W,G)
- NEXT K
- FOR K = 1 TO NN
- LET YY3(K)=Y(K)+Y3(K)
- NEXT K
- FOR K= 1 TO NN
- LET Y4(K)=TSTEP*YPRIM(YY3(),K,Q,W,G)
- NEXT K
- FOR K = 1 TO NN
- LET YNEW(K) = Y(K)+(Y1(K) +2*Y2(K)+2*Y3(K)+Y4(K))/6
- NEXT K
- END SUB
-
-
-
- !DEFINE DERIVATIVES FUNCTIONS
- DEF YPRIM(Y(),K,Q,W,G)
- IF K=1 THEN LET YPRIM=-Y(1)/Q-SIN(Y(2))+G*COS(Y(3))
- IF K=2 THEN LET YPRIM=Y(1)
- IF K=3 THEN LET YPRIM=W
- IF K>3 THEN
- IF K<7 THEN
- LET I = K-4
- LET YPRIM=-Y(4+I)/Q-Y(7+I)*COS(Y(2))+G*Y(10+I)*COS(Y(3))
- END IF
- END IF
- IF K>6 THEN
- IF K<10 THEN
- LET I = K-7
- LET YPRIM=Y(4+I)
- END IF
- END IF
- IF K>9 THEN LET YPRIM = 0
- END DEF
-