Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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):
• 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
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
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
iteración
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
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:
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)
}
0.4
0.2
0.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:
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)
}
7
0.0 0.1 0.2 0.3 0.4 0.5 0.6
función iterada
[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:
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)
}
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,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
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
iteración
seed = w
k = append(l,w)
l = k
}
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)
}
## 2.9 0.6551724
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
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:
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
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
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