Teoria de Caos: Gerador Iterativo de Onda Senoidal

Este programa está escrito em BASIC. Corte e cole-o em um compilador de BASIC, como o Microsoft QuickBasic. Em seguida, compile-o e execute-o. Ele gera a onda senoidal iterando uma equação de diferença simples. Ele exibe a onda senoidal, como ela está sendo gerada, tanto como um gráfico de amplitude-tempo e como um diagrama de fase. [English]


'SINE-WAVE DIFFERENCE FUNCTION
screen 9,3
color 7,1
th = 3                     'text horizontal bias
s = 1.5                    'horizontal scaling factor
n = 150                    'integral extent of the axes
h = 230                    'horizontal zero bias
v = 330                    'vertical zero bias
nn = 550                   'extent of time-series horizontal axis
hh = 25                    'time-series horizontal bias
vv = 160                   'time-series vertical bias
ss = 200                   'inter-iteration delay


'DISPLAY THE RUN INFORMATION
  locate 14, th : print"Difference-generated sine function"
  locate 23, th : print"Press any key to stop program."
  locate 19, th : print"yMAX ="
  locate 20, th : print"yMIN ="


'DRAW AXES FOR THE TIME-SERIES DIAGRAM
  ts = 1                        'set time-series flag
  c = 3                         'set colour to cyan for axes
  t = nn : x = 0 : gosub p      'set pen to end of time axis
  t = 0 : gosub l               'draw line to time-series origin
  x = 1 : gosub l               'draw time-series y-axis
  locate  2,  3 : print "y"
  locate 12, 74 : print "time"


'DRAW THE GRAPH AXES FOR THE PHASE DIAGRAM
  ts = 0                        'clear time-series flag
  x = 1 : y = 0 : gosub p       'set pen to end of x-axis
  x = 0 : gosub l               'draw line to origin
  y = 1 : gosub l               'continue line to end of y-axis
  locate 14, 43 : print "y"
  locate 24, 73 : print "x";


'ITERATE NON-LINEAR DIFFERENCE FUNCTION UNTIL A KEY IS PRESSED
  oldx = 0
  t = 1                    'initialise the time
  u = 61                   'start of trace-clearing sweep
  ymax = 0                 'holds maximum excursion of y
  ymin = 1                 'holds minimum excursion of y
  sx = -1                  'set initial value of input
  sy = 0                   'for position of first plot
  gosub p                  'set plotting pen to starting value
  e = 0                    'reset the out-of-range flag

  while inkey$ = ""        'while user has not pressed a key...
    gosub p                'set starting point for current line
    oldx = x
    gosub f                'ITERATE THE DIFFERENCE FUNCTION
    newx = x
    gosub l                'draw line to point x, y
    gosub TimeSeries       'put plot on time-series graph
    for tt = 0 to 5000 : next
  wend : end


'TIMES-SERIES GRAPH PLOTTING ROUTINE
TimeSeries:
  ts = 1                   'set time-series flag
  c = 10                   'set trace colour to bright green
  if t > nn then t = 1     'if end of sweep has been reached
  x = oldx : gosub p       'set to previous plot position
  t = t + 5                'increment the time axis
  x = newx : gosub l       'draw line to current plot
  if u > nn then u = 1
  uu = u + hh : uuu = uu + 10
  for i = uu to uuu        'draw the trace-wiper in blue
    line (i, vv - n) - (i, vv - 1), 1  
  next
  u = u + 5
  ts = 0                    'clear the time-series flag
return

p:
  gosub q : pset(a, b), c   'set starting point for current line
return
l:
  gosub q : line -(a, b), c 'draw line to point x, y
return


'CONVERT REAL X/Y CO-ORD TO SCALED INTEGRAL NUMBERS OF PIXELS
q:
  if ts = 0 then
    a = s * (h + n * x)
    b = v - n * y
  else
    a = hh + t
    b = vv - n * x
  end if
return


'ITERATE THE DIFFERENCE FUNCTION
f:
  if sx < 0 then sa = .05 else sa = -.05
  sy = sy + sa
  sx = sx + sy
  if sy > ymax then ymax = sy : locate 19, th + 8 : gosub num
  if sy < ymin then ymin = sy : locate 20, th + 8 : gosub num
  x = sx / 4 + .51
  y = sy / 4 + .51
return
num:
  y$ = str$(sy) : PRINT y$ + space$(13 - len(y$))
return

© outubro 1997 Robert John Morton | ANTE | PROX