'Program FIG18.BAS calculates symbolic dynamics 'by J. C. Sprott 'Compile with the PowerBASIC Console Compiler DEFEXT a-z 'do all calculations in extended (80-bit) precision FUNCTION PBMAIN() n&=3 'number of nonlinear odes h=0.003 'stepsize of integration pi=4#*ATN(1##) CONSOLE NAME "Fig 18" CONSOLE SET LOC 646,0 CURSOR OFF CLS GRAPHIC WINDOW "Fig 18", 0, 0, 640, 640 TO hWin1& GRAPHIC ATTACH hWin1&, 0 GRAPHIC WIDTH 1 GRAPHIC COLOR RGB(0,0,0), RGB(255,255,255) GRAPHIC CLEAR GRAPHIC ATTACH hWin1&, 0 GRAPHIC BOX(0,0)-(640,640) DIM x(n&), dxdt(n&), xnew(n&), dxdtold(n&), p&(2^n&,2^n&), m&(2^n&) OPEN"fig18.dat" FOR OUTPUT AS #1 RANDOMIZE TIMER x(1)=0.1-0.2*RND: x(2)=0.1-0.2*RND: x(3)=0.1-0.2*RND 'x(1)=0.1: x(2)=0.2: x(3)=0.3 'first chamber start 'x(1)=0: x(2)=0: x(3)=pi/2## 'periodic orbit 'x(1)=0: x(2)=pi/2##: x(3)=pi 'another periodic orbit WHILE INKEY$<>CHR$(27) CALL rk4(x(),dxdt(),n&,h,xnew()) a$="": s&=0 FOR i&=1 TO 3 IF xnew(i&)>=2##*pi THEN xnew(i&)=xnew(i&)-2##*pi IF xnew(i&)<0 THEN xnew(i&)=xnew(i&)+2##*pi IF dxdt(i&)*dxdtold(i&)<0 THEN 'switched chambers FOR j&=1 TO n& s&=s&-(dxdt(j&)<0)*2^(j&-1) NEXT j& a$=CHR$(65+s&) END IF dxdtold(i&)=dxdt(i&) x(i&)=xnew(i&) NEXT i& IF a$<>"" THEN 'a$=chr$(int(rnd*2^n&)+65) 'randomness test j&=ASC(a$)-64 i&=ASC(aold$)-64 'print a$; PRINT#1,a$; IF i&>0 THEN INCR m& INCR m&(i&) INCR p&(i&,j&) FOR jj&=1 TO 2^n& LOCATE 2*jj&-1,6*i&-5 PRINT CINT(1000*p&(i&,jj&)/m&(i&)); NEXT jj& LOCATE 2*2^n&+3,6*i&-5 PRINT CINT(1000*m&(i&)/m&); END IF aold$=a$ x=x/4: y=y/2 SELECT CASE a$ CASE"B": y=y+1/2 CASE"C": x=x+1/4 CASE"D": x=x+1/4: y=y+1/2 CASE"E": x=x+2/4 CASE"F": x=x+2/4: y=y+1/2 CASE"G": x=x+3/4 CASE"H": x=x+3/4: y=y+1/2 END SELECT IF m&>20 THEN GRAPHIC SET PIXEL(640*x,640*y) END IF WEND GRAPHIC SAVE"fig18.bmp" WAITKEY$ END FUNCTION SUB DERIVS (x(), dxdt(), n&) 'Returns the time derivatives dxdt(i&) of x(i&) FOR i&=1 TO n& i1&=1+i& MOD n& dxdt(i&)=SIN(x(i1&)) NEXT i& END SUB SUB RK4 (X(), DXDT(), N&, H, XNEW()) 'Fourth-order Runge-Kutta integrator DIM XT(N&), DXT(N&), DXM(N&) HH = H * .5## H6 = H / 6## CALL DERIVS(X(), DXDT(), N&) FOR I& = 1 TO N& XT(I&) = X(I&) + HH * DXDT(I&) NEXT I& CALL DERIVS(XT(), DXT(), N&) FOR I& = 1 TO N& XT(I&) = X(I&) + HH * DXT(I&) NEXT I& CALL DERIVS(XT(), DXM(), N&) FOR I& = 1 TO N& XT(I&) = X(I&) + H * DXM(I&) DXM(I&) = DXT(I&) + DXM(I&) NEXT I& CALL DERIVS(XT(), DXT(), N&) FOR I& = 1 TO N& XNEW(I&) = X(I&) + H6 * (DXDT(I&) + DXT(I&) + 2## * DXM(I&)) NEXT I& ERASE DXM, DXT, XT END SUB