'Program FIG5.BAS calculates standard deviation and kurtosis
'by J. C. Sprott
'Compile with the PowerBASIC Console Compiler
DEFEXT a-z 'do all calculations in extended (80-bit) precision
GLOBAL b AS EXT
FUNCTION PBMAIN()
n&=3 'number of nonlinear odes
h=0.01 'stepsize of integration
tmax=5e5 'time to spend at each b value
CONSOLE NAME "Fig 5"
CONSOLE SET LOC 648,0
GRAPHIC WINDOW "Fig 5", 0, 0, 640, 960 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(40,0)-(640,440)
GRAPHIC BOX(40,480)-(640,920)
GRAPHIC STYLE 0
FOR i&=1 TO 10
xp&=40+600*i&/11
GRAPHIC LINE(xp&,0)-(xp&,20)
GRAPHIC LINE(xp&,420)-(xp&,440)
GRAPHIC LINE(xp&,480)-(xp&,500)
GRAPHIC LINE(xp&,900)-(xp&,920)
NEXT i&
FOR i&=1 TO 9
yp&=440*i&/10
GRAPHIC LINE(40,yp&)-(60,yp&)
GRAPHIC LINE(620,yp&)-(640,yp&)
NEXT i&
FOR i&=1 TO 9
yp&=480+440*i&/10
GRAPHIC LINE(40,yp&)-(60,yp&)
GRAPHIC LINE(620,yp&)-(640,yp&)
NEXT i&
DIM x(n&), dxdt(n&)
FOR i&=1 TO n&: x(i&)=RND: NEXT i&
bmin=0.11##
bmax=0##
FOR ib&=1 TO 600
b=bmin+(bmax-bmin)*ib&/600
v=0: k=0
FOR t=0 TO tmax/h
CALL rk4(x(),dxdt(),n&,h,x())
d2=0
FOR i&=1 TO n&: d2=d2+x(i&)*x(i&): NEXT i&
v=v+d2
var=v/t
k=k+d2*d2/var^2
NEXT t
sd=SQR(var)
kur=k/t-3
PRINT b,sd,kur
yp&=440-440*sd/20
IF ib&=1 THEN yp1&=yp&
GRAPHIC LINE(39+ib&,yp1&)-(40+ib&,yp&)
yp1&=yp&
yp&=480-440*kur/2
IF ib&=1 THEN yp2&=yp&
GRAPHIC LINE(39+ib&,yp2&)-(40+ib&,yp&)
yp2&=yp&
NEXT ib&
GRAPHIC SAVE"fig5.bmp"
BEEP
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&)=-b*x(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