Serie de Fibonacci, Razón Áurea y Filotaxis en R

In [1]:
# Muestra la fecha de la última ejecución del proyecto
print(paste0("Última ejecución: ", date()))
[1] "Última ejecución: Mon Nov 25 22:38:15 2019"

Contenido

  1. Introducción
  2. Parte 1 Funciones
  3. Números de Fibonacci
  4. Serie con m elementos
  5. Razón Áurea
  6. Parte 2 Filotaxis
  7. Coméntanos






Introducción

En este proyecto realizaremos una serie de ejercicios que nos permitirán generar la serie de Fibonacci y encontrar la razón áurea definiendo funciones recursivas en lenguaje R. Además generaremos interesantes visualizaciones obedeciendo el ángulo de Fibonacci que simulan la filotaxis en la naturaleza.
Con el desarrollo de este proyecto podremos practicar el uso de variables, dataframes, funciones y visualizaciones con ggplot2.

Espiral Fibonacci

Regresar al inicio


Parte 1. Funciones

En esta parte definiremos funciones en lenguaje R para generar elementos de la serie de Fibonacci, la serie con m elementos, y obtener la razón áurea.

1.1 Función Recursiva para Generar Números de Fibonacci

In [2]:
# Importamos las librerías que usaremos en el proyecto

# Con este comando desactivamos la impresión de warnings (versiones de CRAN y ggplot2)
options(warn = -1)
library(ggplot2)

La función fib genera el n-ésimo número de la serie:

In [3]:
fib <- function(n) {

  if (n == 1) {
    
      return(0)
  }
  else if(n == 2) {
    
      return(1)
  }
  else if(n > 2) {
    
      return(fib(n - 1) + fib(n - 2))
  }
  
}

Apliquemos la función fib para generar el octavo número de la serie:

In [4]:
print(fib(8))
[1] 13

1.2 Función para Generar la Serie con m elementos

Dentro de la función declaramos un vector serie en el que acularemos los elementos que se generan con ciclo for que repite la aplicación de la función fib.

In [5]:
s_fib <- function(m) {
    
    serie <- vector("numeric", length = m)
    
    for (i in 1:m) {
        
        serie[i] <- fib(i)
    }

    return(serie)
}

Apliquemos la función s_fib para generar 20 elementos de la serie:

In [6]:
print(s_fib(20))
 [1]    0    1    1    2    3    5    8   13   21   34   55   89  144  233  377
[16]  610  987 1597 2584 4181

1.3 Función para Obtener la Razón Áurea

Obtendremos la razón áurea definiendo una función r_oro que dividirá el n-ésimo número de la serie entre su predecesor.

In [7]:
r_oro <- function(n) {

  if (n <= 4) {
    
      return('Utiliza un número mayor a 4')
  }
  
    else (return(fib(n)/fib(n-1)))
     
}
In [8]:
print(r_oro(30))
[1] 1.618034

Razón Áurea


$$ \phi = \frac{1+\sqrt{5}}{2} \sim{1.618033989} $$

Ángulo de Fibonacci


$$ \alpha = 360°* \Bigg(\frac{2}{1 + \sqrt{5}}\Bigg)^{2} \sim{137.5°} $$

Regresar al inicio


Parte 2. Filotaxis

Utilizando el ángulo de Fibonacci crearemos un dataframe con tres coordenas correspondientes al factor alpha (ángulo), la órdenada y la abcisa las cuales graficaremos en dos dimensiones y haremos algunas variaciones para simular la filotaxia en la naturaleza.

2.1 Girasol

In [9]:
# Ajustamos el tamaño de las gráficas
options(repr.plot.width=5, repr.plot.height=5)
In [10]:
# Número de puntos en la visualización
n <- 2000

# Ángulo de Fibonacci
alpha <- 360*((2 / (sqrt(5) + 1))**2)

# Elementos que formarán las espirales
s <- -(1:n)*alpha
x <- sin(s)
y <- cos(s)

# Creamos un dataframe con los valores
df <- data.frame(s, x, y)

# Creamos la gráfica
p <- ggplot(df, aes(x*s, y*s))

# Estéticos
p + geom_point(aes(size = s), 
               alpha = 0.8,
               color = "orange",
               fill = 'brown',
               shape = 21,
               stroke = 1) +

theme(panel.background = element_rect(fill = "white"),
      panel.grid = element_blank(),
      axis.text = element_blank(),
      axis.title = element_blank(),
      axis.line = element_blank(),
      axis.ticks = element_blank(),
      legend.position = "none")

2.2. Floración Amarilla de Girasol

In [11]:
n <- 2000
alpha <- 360*((2 / (sqrt(5) + 1))**2)


s <- (1:n)*alpha
x <- sin(s)
y <- cos(s)

df <- data.frame(s, x, y)

p <- ggplot(df, aes(x*s, y*s))

p + geom_point(aes(size = s), 
               alpha = 0.5,
               color = "yellow",
               fill = 'gold3',
               shape = 21,
               stroke = 0.8) +

theme(panel.background = element_rect(fill = "white"),
      panel.grid = element_blank(),
      axis.text = element_blank(),
      axis.title = element_blank(),
      axis.line = element_blank(),
      axis.ticks = element_blank(),
      legend.position = "none")