Está en la página 1de 16

Tarea Extra

Mario Máiquez

19/11/2021

Resolución

Analíticamente.

• Sea f (x) = λx(1 − x); sea f ′ (x) = −2λx + λ, igualando la derivada a cero, sea λ una constante, el
valor xm que maximiza la función es 1/2, siendo pues el valor máximo de la función λ4 .
• Definimos la función 0 = xλ(1 − x) − x, y nos queda una ecuación de segundo grado, cuyas soluciones
son 0 y 1− λ1 , resultado evidente gráficamente. Sea f ′ (x) = λ−2λx−1, entonces |f (xo )| nos queda, por
un lado, |f ′ (0)| = |λ − 2λ(0) − 1| = |λ − 1|, y por otro lado , |f ′ (1 − λ1 )| = |λ − 2λ(1 − λ1 ) − 1| = | − λ + 1|.

En el programa

• Programación de f (x):

conejos = function(x, landa){


fx = landa*x*(1 - x)
cat(c(x, landa, fx))
}
conejos(landa = runif(1, 0, 4), x = runif(1,0,1))

## 0.6617845 2.07846 0.465213

• Algoritmo iterativo:

landa = runif(1, 0, 4)
x = runif(1,0,1)

g = c()
l = c()
for (i in 1:10000){
a = landa*x*(1-x)
e = append(l,x)
l = e

x = a
k = append(g,a)
g = k
}

1
Jugando con el algoritmo llegamos a la conclusión de que para valores ligeramente superiores a λ = 3 (pero
solo hasta cierto valor, como veremos) nuestra secuencia deja de tender a un valor único, y pasa a oscilar
con un periodo de dos.

landa = 3.01
x = runif(1,0,1)

g = c()
l = c()
for (i in 1:10000){
a = landa*x*(1-x)
e = append(l,x)
l = e

x = a
k = append(g,a)
g = k
}

vector = 1:10000
plot(vector, e, xlab = "iteración", ylab = "x")
0.7
0.5
x

0.3
0.1

0 2000 4000 6000 8000 10000

iteración

Aumentando λ, llegamos a un valor en torno a 3.44-3.46 (el valor teórico exacto es 3.4495), en el cual pasamos
a obtener 4 ramificaciones:

2
landa = 3.46
x = runif(1,0,1)

g = c()
l = c()
for (i in 1:10000){
a = landa*x*(1-x)
e = append(l,x)
l = e

x = a
k = append(g,a)
g = k
}

vector = 1:10000
plot(vector, e, xlab = "iteración", ylab = "x")
0.8
0.7
x

0.6
0.5
0.4

0 2000 4000 6000 8000 10000

iteración

Pero al seguir aumentando, nos daremos cuenta de algo extraordinario: cuando llegamos a un entorno de
3.5-3.6 (3.56999 para ser exactos) encontramos una nube de puntos:

landa = 3.6
x = runif(1,0,1)

g = c()

3
l = c()
for (i in 1:10000){
a = landa*x*(1-x)
e = append(l,x)
l = e

x = a
k = append(g,a)
g = k
}

vector = 1:10000
plot(vector, e, xlab = "iteración", ylab = "x")
0.8
0.6
x

0.4
0.2

0 2000 4000 6000 8000 10000

iteración

El histograma sería el siguiente:

landa = 3.6
x = runif(1,0,1)

g = c()
l = c()
for (i in 1:10000){
a = landa*x*(1-x)
e = append(l,x)
l = e

4
x = a
k = append(g,a)
g = k
}
hist(e, 100, xlab = "x", main = "Histograma de x")

Histograma de x
500
Frequency

300
100
0

0.3 0.4 0.5 0.6 0.7 0.8 0.9

p+1 Λp −Λ
En resumen: Λ1 = 3, Λ2 = 3.4995, Λ3 = 3.57 . . . Entonces, la expresión δp ≡ Λp+2 −Λp+1 , p = 1, 2, · · · nos
3.4995−3
resulta δp ≡ 3.56−3.4995 = 8.256 y así sucesivamente para λs mayores. Aún más interesante sería definir δ no
n+1 −Xn
como división de los valores de λ sino como δ = limn→∞ XXn+2 −Xn+1 , n = 1, 2, · · ·, donde Xn es el valor que
toma la función en la bifurcación superior. El valor de ese límite es aproximadamente 4.669, y se denomina
Constante de Feigenbaum, cuyas más que interesantes conclusiones merece la pena conocer.

• Si representamos en una gráfica del cuadrado de lado 1, por un lado la recta x = y, por otro la parábola
λx(1 − x) = 0 y por otro nuestra secuencia, resultaría en lo siguiente:

caosdet = function(landa, x){


g = c()
l = c()
for (i in 1:10000){
w = landa*x*(1-x)
e = append(l,x)
l = e

5
x = w
k = append(g,w)
g = k
}

plot(e, k, xlim=c(0,1), ylim = c(0,1), pch = 20, xlab = "xo", ylab = "xo+1")
points(k,k, pch = 20)
curve((-landa*xˆ2+landa*x), add = T)
curve((x), add = T)

a = e[-c(1)]
b = k[-c(1)]
segments(a, b, a ,a, col = "purple")
segments(a, b, b, b, col = "purple")
segments(e[1], k[1], e[1], 0, col = "purple")
segments(e[1], k[1], k[1], k[1], col = "purple")
cat(landa, x)
}

caosdet(landa = runif(1, 0, 4), x = runif(1,0,1))


1.0
0.8
0.6
xo+1

0.4
0.2
0.0

0.0 0.2 0.4 0.6 0.8 1.0

xo

## 3.506212 0.5045665

• Por otra parte, el valor que toma |f ′ (xo )| cuando λ = 3, es decir, la serie deja de ser convergente, es
| − (3) + 1| = 2.

6
Funciones iteradas

• Por otra parte, resulta interesante el estudio de funciones iteradas (en este caso, esto puede prestarse a
confusión, porque una cosa es actualizar el valor de mi función con el valor anterior, y otra es actualizar
la variable x con la función anterior). Mediante este sencillo código podemos calcularlas:

f_iterada = function(seed, landa, N){


for (j in 1:N){
a = -landa*seedˆ2+seed*landa
seed = a
}
return(a)
}

s = seq(0,1,0.001)
datos = function(landa, N){
s = seq(0,1,0.001)
g = c()
for(k in s){
e = f_iterada(k, landa, N)
f = append(g,e)
g = f
}
return(g)
}

plot(s, datos(2.5,2), type = "l", ylab = "función iterada", xlab = "[0,1]")

7
0.0 0.1 0.2 0.3 0.4 0.5 0.6
función iterada

0.0 0.2 0.4 0.6 0.8 1.0

[0,1]

Donde N es el número de veces que queremos iterar la función. La relevancia de estudiar las gráficas de
iteraciones superiores radica en ver la tendencia última de la serie. Al superponer las gráficas de diferentes
iteraciones de la función (1,2,4), notamos algo interesante:

f_iterada = function(seed, landa, N){


for (j in 1:N){
a = -landa*seedˆ2+seed*landa
seed = a
}
return(a)
}

s = seq(0,1,0.001)
datos = function(landa, N){
s = seq(0,1,0.001)
g = c()
for(k in s){
e = f_iterada(k, landa, N)
f = append(g,e)
g = f
}
return(g)
}

plot(s, datos(2.5,1), type = "l", xlab = "[0,1]", ylab = "funciones iteradas")


points(s, datos(2.5,2), type = "l", col = "turquoise")

8
points(s, datos(2.5,4), type = "l", col = "magenta")
curve((x), add = T, type = "l", col = "orange")
0.0 0.1 0.2 0.3 0.4 0.5 0.6
funciones iteradas

0.0 0.2 0.4 0.6 0.8 1.0

[0,1]

Efectivamente, todas las funciones cortan la recta en un mismo punto, lo cual tras una transformaciones
no debería sorprendernos. En efecto, si el punto de corte x0 de la recta con la función lo calculamos como
f (x) = λx(1−x) = x, y escribiendo el punto de corte de la función iterada como f (2) (x) = f (x)λ(1−f (x)) = x
como f (x) = x, el punto de corte será el mismo para todas las iteradas sucesivas.

• Retomando el concepto de caos, podemos observar de manera unívoca el llamado “efecto mariposa”
de una manera tan sencilla como la de crear dos funciones, ambas con un parámetro landa superior
al que anteriormente definíamos como el inicio de las series caóticas, pero con una semilla ligeramente
distinta. Y digo ligeramente distinta porque variará a razón de ϵ = 0.0001. Pero tomemos primero un
λ por debajo del λ caótico y observemos la evolución de la diferencia:

i = 1:1000
datos = function(seed, landa){

i = 1:1000
g = c()

for (j in i){
a = -landa*seedˆ2 + landa*seed
l = append(g,a)
g = l
seed = a
}

9
return(l)
}

plot(i, datos(0.6, 2.5)-datos(0.60001, 2.5), type = "l", xlab = "iteración", ylab = "error")
4e−06
2e−06
error

−2e−06 0e+00

0 200 400 600 800 1000

iteración

Como podemos observar, el error es despreciable. Pero veamos ahora qué sucede si tomamos un λ = 3.7:

i = 1:1000
datos = function(seed, landa){
i = 1:1000
g = c()

for (j in i){
a = -landa*seedˆ2 + landa*seed
l = append(g,a)
g = l
seed = a
}
return(l)
}

plot(i, datos(0.6, 3.7)-datos(0.60001, 3.7), type = "l", xlab = "iteración", ylab = "error", xlim = c(0,

10
0.6
0.2
error

−0.2
−0.6

0 2 4 6 8 10

iteración

Al principio no hay error apreciable, pero veamos qué sucede si tendemos a infinito la función diferencia:

i = 1:1000
datos = function(seed, landa){
i = 1:1000
g = c()

for (j in i){
a = -landa*seedˆ2 + landa*seed
l = append(g,a)
g = l
seed = a
}
return(l)
}

plot(i, datos(0.6, 3.7)-datos(0.60001, 3.7), type = "l", xlab = "iteración", ylab = "error")

11
0.6
0.2
error

−0.2
−0.6

0 200 400 600 800 1000

iteración

Efectivamente, por el efecto mariposa, el error se dispara.

• Veamos ahora la iteración gráfica (agárrense el sombrero), de la segunda función iterada:

f_iterada = function(seed, landa, N){


for (j in 1:N){
a = -landa*seedˆ2+seed*landa
seed = a
}
return(a)
}

caosdet = function(landa, seed, N){


g = c()
l = c()
for (i in 1:1000){
e = append(g, seed)
g = e
w = f_iterada(seed, landa, N)

seed = w
k = append(l,w)
l = k
}

plot(e, k, xlim=c(0,1), ylim = c(0,1), pch = 20)

12
points(k,k, pch = 20)
curve((x), add = T)

a = e[-c(1)]
b = k[-c(1)]
segments(a, b, a ,a, col = "turquoise")
segments(a, b, b, b, col = "turquoise")
segments(e[1], k[1], e[1], 0, col = "turquoise")
segments(e[1], k[1], k[1], k[1], col = "turquoise")
cat(landa, seed)
}

caosdet(landa = 2.9, seed = 0.9, N = 2)

## 2.9 0.6551724

f_iterada = function(seed, landa, N){


for (j in 1:N){
a = -landa*seedˆ2+seed*landa
seed = a
}
return(a)
}

s = seq(0,1,0.001)
datos = function(landa, N){
s = seq(0,1,0.001)
g = c()
for(k in s){
e = f_iterada(k, landa, N)
f = append(g,e)
g = f
}
return(g)
}

points(s, datos(2.9,2), type = "l", ylab = "función iterada", xlab = "[0,1]", col = "blue")

13
1.0
0.8
0.6
k

0.4
0.2
0.0

0.0 0.2 0.4 0.6 0.8 1.0

Por último, echaremos un vistazo a otro elemento interesante de esta serie. Como hemos demostrado a lo
largo de este documento, a partir del valor de λ 3.6 aproximado, encontramos nubes de puntos caóticos.
No obstante, es posible encontrar aún antes de llegar al valor de 4 pequeñas ventanas de estabilidad,
como diminutas islas perdidas inmersas en un océano infinito. Una de ellas la alcanzamos para el valor
de 3.82842712 exactamente. Por un lado, la gráfica de la función iterada tercera junto a la bisectriz para
valores de λ cada vez mayores:

f_iterada = function(seed, landa, N){


for (j in 1:N){
a = -landa*seedˆ2+seed*landa
seed = a
}
return(a)
}

s = seq(0,1,0.001)
datos = function(landa, N){
s = seq(0,1,0.001)
g = c()
for(k in s){
e = f_iterada(k, landa, N)
f = append(g,e)
g = f
}
return(g)
}

14
a = seq(0, 3.82842712, 0.01)
curve((x))

for (i in a){
points(s, datos(i,3), type = "l", ylab = "función iterada", xlab = "[0,1]", col = "red")
}
1.0
0.8
0.6
(x)

0.4
0.2
0.0

0.0 0.2 0.4 0.6 0.8 1.0

Y aquí el mapeo de datos:

landa = 3.82842712
x = runif(1,0,1)

g = c()
l = c()
for (i in 1:10000){
a = landa*x*(1-x)
e = append(l,x)
l = e

x = a
k = append(g,a)
g = k
}

vector = 1:10000
plot(vector, e,)

15
0.8
0.6
e

0.4
0.2

0 2000 4000 6000 8000 10000

vector

Bibliografía y webgrafía
• https://www.youtube.com/watch?v=ovJcsL7vyrk&t=366s
• https://mathworld.wolfram.com/LogisticMap.html
• Gribbin,John, “Deep Simplicity: Chaos, Complexity and the Emergence of Life”; capítulo 3.

16

También podría gustarte