<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Matriz de Leslie
La Matriz de Leslie se usa en ecología para modelar los cambios en una
población de organismos a través de un lapso. En este modelo la
población se divide en grupos de edad. Para cada unidad de tiempo la
población se representa con un vector con un elemento por cada clase
de edad.
Se trata de una matriz cuadrada con tantos renglones y columnas como
el vector de clases tiene elementos.
$$ L=\left[\begin{array}{cccc}
0 & 1 & 2 & 1\
0.8 & 0 & 0 & 0\
0 & 0.7 & 0 & 0\
0 & 0 & 0.5 & 0
\end{array}\right] $$
Step1:  Al paso del tiempo
En cada paso de tiempo el vector de clases de población se multiplica por la matriz Leslie para generar el vector del siguiente paso.
Step2:  Tamaños de clases de poblaciones
Al Paso del tiempo las poblaciones crecen.
Step3:  Proporciones de tamaños de clases de poblaciones
Pero el tamaño proporcional de las clases de subpoblación se estabiliza.
Step4:  Eigenvector, eigenvalor
$$P_{t+1}=(1+q)P_{t}$$
$$P_{t}=P_{0}(1+q)^{t}$$
Distribución de proporciones $\overrightarrow{Q^{*}}$
$$\overrightarrow{Q^{}}=\left[\begin{array}{c}
q_{1}^{}\
q_{2}^{}\
q_{3}^{}
\end{array}\right]$$
para $t$ grande
$$\overrightarrow{X_{t+1}}=\overrightarrow{P_{t+1}}\left[\begin{array}{c}
q_{1}^{}\
q_{2}^{}\
q_{3}^{}
\end{array}\right]=(1+q)P_{t}\overrightarrow{Q^{}}=\overrightarrow{X_{t}}(1+q)$$
por otro lado
$\overrightarrow{X_{t+1}}=L\overrightarrow{X_{t}}=\lambda\overrightarrow{X_{t}}$
donde $\lambda=1+q$
$P_{t}=P_{0}(1+q)^{t}\Longleftrightarrow P_{t}=P_{0}e^{rt}$, $r=ln(1+q)$
Aspiramos a que en general el modelo de Leslie implique que la distribución de proporciones en clases de edad se estabilice, en cuyo caso si 
$x\rightarrow\infty$, $L\overrightarrow{X_{t}}=\lambda\overrightarrow{X_{t}}$
Definición
Sea $M$ una matriz $nxn$, se dice $\overrightarrow{X}$ es un vector propio de $M$ si y sólo si existe lamba en C tal que $M\overrightarrow{X}=\lambda\overrightarrow{X}$. El escalar $\lambda$ es un valor propio del vector $\overrightarrow{X}$ propio de $M$.
Qué conveniente poder multiplicar por un escalar y no por una matriz.
(1) $M\overrightarrow{X}=\lambda\overrightarrow{X}$ que es equivalente a $\lambda\overrightarrow{X}-M\overrightarrow{X}=0$
Usemos una matriz identidad como neutro multiplicativo para tener $\lambda\overrightarrow{X}$
Step5:  Método de newton
Vamos sacando la derivada de la función para con esa llegar a X.
Encontramos la raíz por ahí de 1.2912
<ASSISTANT_TASK:>
Python Code:
# el modelo de Leslie
L = np.array([[0,     1,  2],
              [0.8,   0,  0],
              [0,   0.7,  0]])
# las cuatro clases de edad tienen 100 pobladoras al inicio
poblacion_inicial = [100,100,100]
# lista para contener un vector de tamaños de población por clase para
# cada unidad de tiempo transcurrida en la simulación. Inicializamos con
# la poblacion inicial en el tiempo cero.
historico_de_poblaciones  = [ poblacion_inicial, ]
# en otra lista guardaremos las proporciones de cada clase respecto del
# total de la población.
historico_de_proporciones = []
Explanation: Matriz de Leslie
La Matriz de Leslie se usa en ecología para modelar los cambios en una
población de organismos a través de un lapso. En este modelo la
población se divide en grupos de edad. Para cada unidad de tiempo la
población se representa con un vector con un elemento por cada clase
de edad.
Se trata de una matriz cuadrada con tantos renglones y columnas como
el vector de clases tiene elementos.
$$ L=\left[\begin{array}{cccc}
0 & 1 & 2 & 1\
0.8 & 0 & 0 & 0\
0 & 0.7 & 0 & 0\
0 & 0 & 0.5 & 0
\end{array}\right] $$
End of explanation
# iteramos 25 veces
for t in range(25):
    # nuevo vector
    vector_de_clases = np.dot(L, historico_de_poblaciones[t])
    # al histórico
    historico_de_poblaciones.append( vector_de_clases )
    
    poblacion_total        = vector_de_clases.sum()
    vector_de_proporciones = [clase/poblacion_total for clase in vector_de_clases]
    historico_de_proporciones.append( vector_de_proporciones )
Explanation: Al paso del tiempo
En cada paso de tiempo el vector de clases de población se multiplica por la matriz Leslie para generar el vector del siguiente paso.
End of explanation
np.array( historico_de_poblaciones[0:10] )
figura = plt.plot( historico_de_poblaciones[0:10] )
figura = plt.plot( historico_de_poblaciones )
Explanation: Tamaños de clases de poblaciones
Al Paso del tiempo las poblaciones crecen.
End of explanation
np.array( historico_de_proporciones[10:20] )
figura = plt.plot( historico_de_proporciones )
Explanation: Proporciones de tamaños de clases de poblaciones
Pero el tamaño proporcional de las clases de subpoblación se estabiliza.
End of explanation
# lmbd = np.linalg.det(L)
v = np.linalg.eig(L)[1][:,0]
l=sum(v)
v/l
Explanation: Eigenvector, eigenvalor
$$P_{t+1}=(1+q)P_{t}$$
$$P_{t}=P_{0}(1+q)^{t}$$
Distribución de proporciones $\overrightarrow{Q^{*}}$
$$\overrightarrow{Q^{}}=\left[\begin{array}{c}
q_{1}^{}\
q_{2}^{}\
q_{3}^{}
\end{array}\right]$$
para $t$ grande
$$\overrightarrow{X_{t+1}}=\overrightarrow{P_{t+1}}\left[\begin{array}{c}
q_{1}^{}\
q_{2}^{}\
q_{3}^{}
\end{array}\right]=(1+q)P_{t}\overrightarrow{Q^{}}=\overrightarrow{X_{t}}(1+q)$$
por otro lado
$\overrightarrow{X_{t+1}}=L\overrightarrow{X_{t}}=\lambda\overrightarrow{X_{t}}$
donde $\lambda=1+q$
$P_{t}=P_{0}(1+q)^{t}\Longleftrightarrow P_{t}=P_{0}e^{rt}$, $r=ln(1+q)$
Aspiramos a que en general el modelo de Leslie implique que la distribución de proporciones en clases de edad se estabilice, en cuyo caso si 
$x\rightarrow\infty$, $L\overrightarrow{X_{t}}=\lambda\overrightarrow{X_{t}}$
Definición
Sea $M$ una matriz $nxn$, se dice $\overrightarrow{X}$ es un vector propio de $M$ si y sólo si existe lamba en C tal que $M\overrightarrow{X}=\lambda\overrightarrow{X}$. El escalar $\lambda$ es un valor propio del vector $\overrightarrow{X}$ propio de $M$.
Qué conveniente poder multiplicar por un escalar y no por una matriz.
(1) $M\overrightarrow{X}=\lambda\overrightarrow{X}$ que es equivalente a $\lambda\overrightarrow{X}-M\overrightarrow{X}=0$
Usemos una matriz identidad como neutro multiplicativo para tener $\lambda\overrightarrow{X}$
End of explanation
def p(x):
    return (x*x*x)-(0.8*x)-1.12
# derivada de p
def pp(x):
    return (3*x*x)-0.8
def N(x):
    return x - (p(x)/pp(x))
j = []
x = 1
for n in range(15):
    x = N(x)
    j.append(x)
    
j
Explanation: Método de newton
Vamos sacando la derivada de la función para con esa llegar a X.
Encontramos la raíz por ahí de 1.2912
End of explanation
<END_TASK>