Espiral de Fibonecci
La sucesión de Fibonacci comienza con los números 0 y 1. De ahí, obtendremos el siguiente término sumando los dos anteriores. Esto es
De tal manera, en general tenemos que el énesimo término de la sucesión está dado por $$ F_{n}=F_{n-1}+F_{n-2} $$
Esta sucesión fue descrita en Europa por el matemático Leonardo de Pisa, también conocido como Fibonecci. Sin embargo ésta ya había sido descrita en la Matemática de la India. La descripción que presenta Fibonecci es como la solución de un problema relacionado con la cría de conejos:
El primer mes nace una pareja de conejos $a_{1}$, en total hay 1 pareja; en el segundo mes se aparéa esta pareja, en total hay 1 pareja; en el tercer mes la pareja $a_{1}$ da a luz otra pareja $a_{2}$, la pareja inicial se vuelve a cruzar, en total hay 2 parejas; en el cuarto mes la pareja inicial da a luz la pareja $a_{3}$ y se cruza las parejas $a_{1}$ y $a_{2}$, en total hay 3 parejas; en el quinto mes la pareja $a_{1}$ da a luz la pareja $a_{4}$ y la $a_{2}$ da a luz la pareja $a_{5}$, las parejas $a_{1},a_{2}$ y $a_{3}$ se cruzan, en total hay 5 parejas.....
La sucesión de Fibonecci tiene numerosas aplicaciones en Matemáticas, Ciencias de la computación y Economía, además de que ésta aparece en ciertas configuraciones biológicas como en las ramas de los árboles, en cómo el ADN codifica el crecimiento de formas orgánicas complejas, etcétera.
Ahora bien, con base en el comportamiento de la sucesión podemos implementar un código para ir generando números de la sucesión de Fibonecci. Para ello
# declaramos una variable auxiliar para ir almacenando el valor del término F_n de la sucesión
x = 0
# creamos una lista con los primeros dos términos de la sucesión
n_fibonecci = [0, 1]
print(n_fibonecci)
[0, 1]
Recordemos que un lista en python está indexada, comenzando la primera posición con el índice cero. En otras palabras
Para acceder a los elementos de una lista usamos, por ejemplo, n_fibonecci[0]
el cual nos arroja
print(n_fibonecci[0])
# o también
print(n_fibonecci[1])
0 1
Luego, lo que haremos será implementar un bucle for
para ir agregando más elementos a la listan_fibonecci
de la siguiente manera:
Efectuamos primero la suma $F_{2}=F_{1}+F_{0}=1+0=1$, lo cual conseguimos usando n_fibonecci[1]+n_fibonecci[0]
. Para mayor comodidad utilicemos la variable auxiliar x
. Entonces
x = n_fibonecci[1] + n_fibonecci[0]
de modo que x
tiene almacenado el valor de 1 y éste será agregado a la lista. Entonces n_fibonecci=[0,1,1]
. Luego, para $F_{3}=F_{2}+F_{1}=1+1=2$ usamos
x = n_fibonecci[2]+n_fibonecci[1]
de modo que x
tiene almacenado ahora el valor de 2 y n_fibonecci=[0,1,1,2]
.
Lo anterior lo implementamos como
for i in range(1,11):
x = n_fibonecci[i] + n_fibonecci[i - 1]
n_fibonecci.append(x)
print(n_fibonecci)
print(len(n_fibonecci))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 12
De tal manera, como el rango del bucle es de 10, el código anterior nos arrojará 10+2=12 números de Fibonecci.
El número áureo es un número irracional descubierto en la antigüedad como proporción entre dos segmentos de una recta. Cabe resaltar que esta proporción se encuentra muy en figuras geométricas y a menudo en la naturaleza. A los objetos cuyas medidas guardan la proporción áurea se les atribuye propiedades estéticas.
Tomemos los números $a,b$ con $a>b>0$ tales que $a+b$ es la longitud de un segmento de recta. La construcción del número áureo se consigue con la proporción $$ \frac{a+b}{a}=\frac{a}{b} $$ es decir, la longitud del segmento total es a la parte mayor del segmento, como la parte mayor del segmento es a la parte menor.
Resolvamos dicha ecuación $$ 1+\frac{b}{a}=\frac{a}{b} $$ hacemos el cambio de variable $\varphi=\frac{a}{b}$ por lo que $\varphi^{-1}=\frac{b}{a}$, entonces $$ 1+\varphi^{-1}=\varphi\ \ \Rightarrow\ \ \varphi+1=\varphi^{2}\ \ \Rightarrow \varphi^{2}-\varphi-1=0 $$ después usamos la fórmula general $$ \varphi=\frac{-(-1)\pm\sqrt{(-1)^{2}-4(1)(-1)}}{2(1)}=\frac{1\pm\sqrt{5}}{2} $$
De ahí que el número áureo se defina como $$ \varphi=\frac{1+\sqrt{5}}{2}\approx1.618033988749894 $$
Descubramos otra propiedad interesante, para ello utilizaremos los primeros números de la sucesión de Fibonecci. Generemos 54 números de Fibonecci
x = 0
n_fibonecci = [0, 1]
for i in range(1,53):
x = n_fibonecci[i] + n_fibonecci[i - 1]
n_fibonecci.append(x)
print(n_fibonecci)
print(len(n_fibonecci))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173] 54
Ahora efectuemos divisiones de la forma $\frac{F_{n+1}}{F_{n}}$, esto es
print(n_fibonecci[2] / n_fibonecci[1])
print(n_fibonecci[3] / n_fibonecci[2])
print(n_fibonecci[4] / n_fibonecci[3])
1.0 2.0 1.5
Podemos implementar un bucle for
para realizar más divisiones
for i in range(1,11):
print(n_fibonecci[i + 1] / n_fibonecci[i])
1.0 2.0 1.5 1.6666666666666667 1.6 1.625 1.6153846153846154 1.619047619047619 1.6176470588235294 1.6181818181818182
Veamos ahora la división entre los últimos elementos de nuestra lista n_fibonecci
:
for i in range(45,53):
print(n_fibonecci[i + 1] / n_fibonecci[i])
1.618033988749895 1.618033988749895 1.618033988749895 1.618033988749895 1.618033988749895 1.618033988749895 1.618033988749895 1.618033988749895
Dado que Python redondea las cantidades sólo nos muestra los primeros 14 dígitos y redondea el dígito 15. Entonces tenemos que $$ \frac{F_{52}}{F_{51}}\approx1.618033988749895\ \ \ \ \ \textrm{y}\ \ \ \ \ \varphi\approx1.618033988749894 $$
Es decir que la división entre elementos consecutivos de la sucesión de Fibonecci se aproxima al valor de $\varphi$ conforme $n$ crece. Esta es una magnífica propiedad, que de manera más precisa nos dice que $$ \lim\limits_{n\rightarrow \infty}\left(\frac{F_{n+1}}{F_{n}}\right)=\varphi $$
Tomado de pybonacci_spiral.py, tenemos el siguiente código para general la espiral de Fibonecci
import turtle
import random
def draw_window():
"""Define parametros de la ventana y llama a la función: draw_spiral().
"""
window = turtle.Screen()
window.bgcolor("white")
draw_spiral()
window.getcanvas().postscript(file="1.eps")
window.exitonclick()
def draw_spiral():
"""Dibuja la espiral de Fibonacci.
"""
# Define parametros de la línea que dibuja la espiral
mercury = turtle.Turtle()
mercury.shape("classic")
# mercury.color("green")
mercury.pensize(10)
# Tamaño de la espiral de (6,13)
for x in range(6,13):
a = fibonacci(x)
mercury.color(draw_color(a))
print (a)
mercury.circle(a, 90)
def fibonacci(n):
"""Genera la sucesión de Fibonacci según el rango (tamaño = range(6,13).
"""
fib1 = 0
fib2 = 1
if n == 0:
return fib1
elif n == 1:
return fib2
else:
for i in range(n-1):
fib = fib1 + fib2
fib1 = fib2
fib2 = fib
return fib
def draw_color(a):
"""Colorea usando los colores primareos de forma aleatoría.
"""
rgb = (1.0, 1.0, 1.0)
rounds = (a % 2) + 1
while(rounds):
#change tuple to list
lst = list(rgb)
lst[random.randint(0,2)] = 0.0
rgb = tuple(lst)
rounds = rounds - 1
return rgb
draw_window()
Que arroja: