Primer proyecto¶
Marco teórico¶
Se escribirá un código para visualizar diferentes familias del conjunto de Julia y Mandelbrot, en el proceso se modelarán diversas formas biológicas. Ambos conjuntos se forman a partir del estudio de ciertas funciones, \(f_c\), sobre las cuales se iteran los números complejos. La notación para la función, \(f_c\), denota que ésta depende de un parámetro \(c \in C\).
El conjunto de Julia \(J_{f_c}\), para una constante \(c\) particular, está formado por todos aquellos puntos del plano complejo en el cual la sucesión siguiente es acotada:
El conjunto de Mandelbrot \(M_{f_c}\), de forma similar, está formado por el conjunto de puntos del plano complejo, en el cual \(c\) pertenece al conjunto si la siguiente sucesión es acotada:
El conjunto de puntos que resulta de la sucesión, para cada \(z\) implicado, se conoce como la órbita de \(z\) por \(f_c\). Para determinar los elementos de una familia del conjunto de \(J_{f_c}\) y \(M_{f_c}\), se utiliza un método iterativo, verificando el criterio convergencia siguiente, en cada paso de la iteración donde se obtiene un elemento de la órbita:
Si en algún punto de la iteración no se cumple el criterio, el punto del plano complejo analizado no pertenece al conjunto.
El conjunto de Julia y Mandelbrot están dados por una familia muy popular de sistemas dinámicos complejos, esto es la familia de polinomios cuadráticos complejos:
Formas biológicas han sido representadas mediante procesos iterativos, como el descrito anteriormente. Pero, empleando un conjunto de funciones \((f_c)\) más complejas que las estudiadas en los conjuntos de Julia y Mandelbrot. A continuación, se listan algunas de las funciones usadas para reproducir formas biológicas:
La iteración es realizada hasta que la magnitud de la componente real e imaginaria de los elementos de la órbita sobrepasa un determinado valor \(\tau\) (un valor puede ser \(\tau=100\)), esto significa que el proceso iterativo se mentiene mientras se cumpla que la parte real o imaginaria satisfacen la condición:
Una manera de graficar los conjuntos de Julia, Mandelbrot y las formas biológicas, es graficar solamente los puntos que pertenecen al conjunto con un color determinado (monocromático).
Para agregar colores a los gráficos, generalmente se utiliza el algoritmo de: Tiempo de Escape, aunque no es el único. El algoritmo consiste en asignar un color dependiendo del número de iteraciones realizadas antes que el elemento de la órbita no satisfaga el criterio de convergencia. De esta manera se visualiza aquellos elementos que pertenecen al conjunto y los que no, además, revela la velocidad de divergencia de la órbita en cada punto.
Requisitos¶
Para el desarrollo del proyecto deberá utilizar solamente los elementos abarcados en la primera semana del workshop, esto es, el uso de: estructuras de datos y control, tipos de datos primitivos del lenguaje. Por lo que no utilizará ningún paquete adicional, creado o desarrollado por la comunidad de Julia, a excepción del paquete Plots.
Para completar este proyecto deberá realizar los siguientes items:
Graficar un conjunto de Julia, para un \(c\) arbitrario (monocromático).
Graficar el conjunto de Mandelbrot (monocromático).
Graficar una forma biológica, par un c arbitrario (monocromático).
Hacer una gráfica a color del conjunto de Mandelbrot usando el algoritmo de Tiempo de Escape.
Realizar una gráfica a color para un conjunto de Julia, para un \(c\) arbitrario .
Realizar una gráfica a color para una forma biológica.
Para realizar las gráficas, deberá tomar en cuenta el uso de “structs” para representar estructuras de datos particulares y también el uso de “multiple dispatch”.
Criterios de Evaluación¶
Durante la evaluación del proyecto se tomarán en cuenta los siguientes aspectos:
Cumplimiento de los requerimientos mencionados.
Claridad y orden el código presentado.
Completitud del proyecto, haciendo todas las partes que lo componen.
Analizar y comentar el trabajo de otros grupos (Mediante el peer review).
Bosquejo¶
Gráficas¶
Para realizar las gráficas se utilizará el paquete Plots, por lo tanto el paquete debe ser importado:
using Plots
begin
size = 50
Plots.default(size = (2200,2200),titlefontsize = size, tickfontsize = size, legendfontsize = size, guidefontsize = size, legendtitlefontsize = size)
end
A continuación se mostrarán ejemplos para realizar gráficas con el paquete, los cuales pueden usarse para mostrar las formas biológicas y los conjuntos de Julia y Mandelbrot, una vez se hayan obtenido los datos necesarios.
Gráfico de números complejos:
begin
r = 2
zcomplejo = [r*cos(θ)+r*sin(θ)*im for θ in 0:0.3:2*pi]
scatter(zcomplejo, seriescolor=:white,
markerstrokecolor=:blue,
aspectratio=1,
title="Gráfica de ejemplo",
legend=false,
markersize=40)
end
Para colorear los gráficos del conjunto de Julia, Mandelbrot y las formas biológicas, utilizando el algoritmo de Tiempo de Escape, se pueden utilizar mapas de calor.
begin
x = -2:0.3:2
y = -2:0.3:2
colores = [i₁*i₂ for i₁ in x, i₂ in y]
heatmap(x, y, colores, color=cgrad([:black,:blue,:white]),
title="Ejemplo Mapa de Calor", xlabel="Re(z)", ylabel="Im(z)")
end
Para el mapa de calor, se necesita hacer una malla (las listas “x” y “y” del ejemplo anterior) y una matriz donde se guardan los valores que definen el color para cada punto de la malla.
Pseudocódigo¶
Para clarificar los pasos a realizar, se muestra el siguiente algoritmo, cuando se desee obtener un gráfico con colores:
NOTAS:
Se utilizan algunas funciones que pertenecen al core y base de Julia, si no conoce o intuye su uso averigue sobre la función mediante
?<nombre_función>
omethods(<nombre_función>)
.Usar
test_convergencia = b
para la creación de formas biológicas.Las variables rz, iz son las componentes real imaginaria del número complejo respectivamente, que define un punto de la región del plano complejo por analizar.
La variable i es el contador del número de iteraciones.
c y z representan números complejos.
1 Para rz = -2:0.3:2 Hacer ##Elección del rango puede ser diferente
2 Para iz = -2:0.3:2 Hacer ##Elección del rango puede ser diferente
3 z = complex(rz,iz)
4 ##La precisión de la imagen es mejor si incrementa las iteraciones
5 Para i = 1:30
6 z = f(z) + c
7 ##Se verfica que z = complex(rz,iz) esté en el conjunto
8 ##T depende del conjunto que se desea graficar
9 Si abs(z) > T Entonces break Fin
10 Fin
11 color = i ##Indica la velocidad de divergencia de la orbita
12 Si test_convergencia = a Entonces
13 Graficar punto en (rz,iz,color)
14 Fin
15 Si test_convergencia = b Entonces
16 Si real(z) < T || imag(z) < T Entonces
17 Graficar punto en (rz,iz,color)
18 Fin
19 Fin
20 Fin
21 Fin
Solución¶
La solución del problema planteado puede seguir un camino diferente, pero siempre basado en el algoritmo proporcionado. Para completar la parte obligatoria de este proyecto rellene las partes que están incompletas de este documento, tome en cuenta la signatura de las funciones descritas y lo que esta debe hacer. A medida avance en el documento haga uso de las definiciones previas donde sea conveniente.
Definición de objetos y funciones¶
A continuación construya un struct
Grid
(Grilla), donde se defina la región del plano complejo que debe ser analizado (límites en las abcisas y ordenadas) y el espacio entre cada punto de la grilla.
"""*
Representa un objeto grilla
"""
struct Grid{T<:Real}
end
Grid
Defina una función que cree una matriz de rangos para los ejes de las abcisas y ordenas.
"""
makeGrid(g::Grid)
Crear una matriz de rangos [rango_abcisas,rango_ordenadas]
"""
function makeGrid(g::Grid)
end
makeGrid
Defina funciones de una línea para las formas biológicas y la familia de polinomios cuadráticos complejos
begin ##*
end
Defina una función que retorne
true
si el criterio de convergencia para los conjuntos \(J_{_c}\) y \(M_{f_c}\) se cumple,false
en caso contrario.
""" *
testJM(z::Complex)
Comprobar el criterio de convergencia para los conjuntos de Julia y Mandelbrot
"""
function testJM(z::Complex)
end
testJM
Defina una función que
true
si el criterio de convergencia para las formas biológicas se cumple,false
en caso contrario.
"""
testbiomorph(z::Complex,τ::Real)
Comprobar el criterio de convergencia para los conjuntos de Julia y Mandelbrot
"""
function testbiomorph(z::Complex,τ::Real)
end
testbiomorph
Defina una función que itere un número sobre una función \(f_c\) y devuelva true si se cumple el criterio de divergencia para \(J_{f_c}\), \(M_{f_c}\) y formas biológicas
"""
iterate(test::Function,f::Function,z::Complex,iter::Integer)
Interar z sobre una funcion f
"""
function iterate(test::Function,f::Function,z::Complex,iter::Integer)
end
iterate
Defina un función que devuelva el número de iteraciones realizadas para un dado z (número complejo), hasta que se no se cumple el criterio de divergencia.
"""*
colormap(f::Function,test::Function,z::Complex,c::Complex,iter::Integer)
Retornar el número de iteraciones para un valor dado de z minetras un criterio de convergencia sea válido
"""
function colormap(f::Function,test::Function,z::Complex,c::Complex,iter::Integer)
end
colormap
Usando multiple dispatch, defina nuevamente la función colormap agregando un nuevo parámetro de entrada \(\tau\), de modo que se pueda usar el test de convergencia para la forma biológica
function colormap(f::Function,test::Function,z::Complex,c::Complex,iter::Integer,τ::Integer)
end
colormap (generic function with 2 methods)
Solución a los incisos¶
Usando las definiciones anteriores realice lo indicado.
1) Graficar un conjunto de Julia, para un \(c\) arbitrario (monocromático).¶
Defina una funcion que retorne el conjunto de puntos que pertenecen al conjunto de Julia.
"""
setjulia()
Construir un array con los puntos del plano complejo que pertenecen al conjunto, dada la región de análisis del plano complejo
Entradas:
- f::Function
- test::Function
- grid::Array{T,2} where T
- c::Complex
- iter::Integer
"""
function setjulia(
f::Function,
test::Function,
grid::Array{T,2} where T,
c::Complex,
iter::Integer)
end
setjulia
begin
## Su código aquí
end
2) Graficar el conjunto de Mandelbrot (monocromático).¶
Defina una funcion que retorne el conjunto de puntos que pertenecen al conjunto de Mandelbrot
"""
setmandelbrot()
Construir un array con los puntos del plano complejo que pertenecen al conjunto, dada la región de análisis del plano complejo
Entradas:
- f::Function
- test::Function
- grid::Array{T,2} where T
- iter::Integer
"""
function setmandelbrot(
f::Function,
test::Function,
grid::Array{T,2} where T,
iter::Integer)
end
setmandelbrot
begin
## Su código aquí
end
3) Graficar una forma biológica, par un c arbitrario (monocromático).¶
Defina una funcion que retorne el conjunto de puntos que pertenecen al conjunto de una forma biológica.
"""
setbiomorph()
Construir un array con los puntos del plano complejo que pertenecen al conjunto, dada la región de análisis del plano complejo
Entradas:
- f::Function
- test::Function
- grid::Array{T,2} where T
- c::Complex
- iter::Integer
- τ::Integer
"""
function setbiomorph(
f::Function,
test::Function,
grid::Array{T,2} where T,
c::Complex,
iter::Integer,
τ::Integer)
end
setbiomorph
begin
## Su código aquí
end
4) Hacer una gráfica a color del conjunto de Mandelbrot¶
Usando el algoritmo de Tiempo de Escape y multiple dispatch, defina nuevamente la función setmandelbrot, para obtener los datos necesarios (matriz) que defina los colores para cada punto de una región arbitraria.
"""
setmandelbrot(f::Function,test::Function,grid::Array{T,1} where T,iter::Integer)
Crear una matriz de enteros correspondiente a los colores
"""
function setmandelbrot(
f::Function,
test::Function,
grid::Array{T,1} where T,
iter::Integer
)
end
setmandelbrot
begin
## Su código aquí
end
5) Realizar una gráfica a color para un conjunto de Julia, para un \(c\) arbitrario.¶
Usando el algoritmo de Tiempo de Escape y multiple dispatch, defina nuevamente la función setjulia, para obtener los datos necesarios (matriz) que defina los colores para cada punto de una región arbitraria.
begin
## Su código aquí
end
6) Realizar una gráfica a color para una forma biológica.¶
Usando el algoritmo de Tiempo de Escape y multiple dispatch, defina nuevamente la función setbiomorph, para obtener los datos necesarios (matriz) que defina los colores para cada punto de una región arbitraria.
begin
## Su código aquí
end