'Program ABSCHAOS.BAS makes bifurcation diagram for chaotic flow with abs term
'(c) 1998 by J. C. Sprott
'Compile with PowerBASIC for DOS 3.5
defext a-z
screen 12
amin=-.8
amax=-.5
xmin=-1
xmax=2
x=0: y=0: z=0
h=.002
tmax&=1000000
line(10,0)-(630,460),,b
locate 1,1: print trim$(str$(csng(xmax)));
locate 15,1: print"X";
locate 29,1: print trim$(str$(csng(xmin)));
locate 30,1: print trim$(str$(csng(amin)));
locate 30,41: print"A";
locate 30,81-len(trim$(str$(csng(amax)))): print trim$(str$(csng(amax)));
xticks%=6: yticks%=6
for i%=1 to xticks%-1
xp%=10+620*i%/xticks%
line(xp%,1)-(xp%,11)
line(xp%,449)-(xp%,459)
next i%
for i%=1 to yticks%-1
yp%=460-460*i%/yticks%
line(11,yp%)-(21,yp%)
line(619,yp%)-(629,yp%)
next i%
for i%=11 to 628
a=amin+(amax-amin)*(i%-10)/620
for t&=0 to tmax&
call rk4(x,y,z,h)
if abs(x)>1e3 then x=0: y=0: z=0: exit for
if t&>tmax&/2 and xxolder then
call extremum (xolder, xold, x, dum, xe)
j%=460-460*(xe-xmin)/(xmax-xmin)
pset(i%,j%)
end if
xolder=xold
xold=x
next t&
if inkey$=chr$(27) then end
next i%
while inkey$="": wend
end
def fnx(x,y,z)=y
def fny(x,y,z)=z
def fnz(x,y,z)=a*z-y+abs(x)-1
SUB rk4 (x, y, z, h)
'Advances (x, y, z) with a fourth order Runge-Kutta method
'User must provide the functions fnx, fny, fnz, and a step size h
k1x = h * fnx(x, y, z)
k1y = h * fny(x, y, z)
k1z = h * fnz(x, y, z)
k2x = h * fnx(x + .5 * k1x, y + .5 * k1y, z + .5 * k1z)
k2y = h * fny(x + .5 * k1x, y + .5 * k1y, z + .5 * k1z)
k2z = h * fnz(x + .5 * k1x, y + .5 * k1y, z + .5 * k1z)
k3x = h * fnx(x + .5 * k2x, y + .5 * k2y, z + .5 * k2z)
k3y = h * fny(x + .5 * k2x, y + .5 * k2y, z + .5 * k2z)
k3z = h * fnz(x + .5 * k2x, y + .5 * k2y, z + .5 * k2z)
k4x = h * fnx(x + k3x, y + k3y, z + k3z)
k4y = h * fny(x + k3x, y + k3y, z + k3z)
k4z = h * fnz(x + k3x, y + k3y, z + k3z)
x = x + (k1x + 2 * (k2x + k3x) + k4x) / 6
y = y + (k1y + 2 * (k2y + k3y) + k4y) / 6
z = z + (k1z + 2 * (k2z + k3z) + k4z) / 6
END SUB
SUB extremum (yl, yo, yh, xe, ye)
'Given three values yl @ x=-1, yo @ x=0 and yh @ x=1
'Calculate the extremum ye and the value xe at which ye occurs
'Fits the data to a parabola y = yo + bx + cx^2
b = (yh - yl) / 2
c = (yh + yl) / 2 - yo
IF c = 0 THEN 'Second derivative is zero (no extremum)
xe = 0
ye = yo
ELSE
xe = -b / (2 * c)
ye = yo - b * b / (4 * c)
END IF
END SUB