# Cálculo de estabilidad a partir de valores propios y matriz de Jordan 

## Caracterización de estabilidad ecuaciones lineales de coenficientes constantes  



Sea $A \in M_d( \mathbb R)$,  $\sigma(A) = \{ \lambda_1, ..., \lambda_d \}$ el radio espectral, es decir el conjunto de valores própios de $A$. 
Denotaremos por $m(\lambda_i)$ a la multiplicidad algebraica, (el número de veces que aparece cierto vector en el radio espectral. 

La dimensión geomtrica es la dimensión del espacio asociado, calculada como: $dim E_{\lambda _i} = dim_ker( A - \lambda_i I) - rango(A - \lambda_i I)$, a efectos prácticas para nosotros el número de filas que sean cero salvo el elemento de la diagonal y que coincidad con ese valor propio. 

Llamaremos a $\mu(A)$ al máximo de las partes reales del radio espectral. 

Tenemos pues que 
1. Si $\mu(A) < 0$ entonces EDO lineal es **asintóticamente estable**. 
2. Si $\mu(A) > 0$ entonces EDO lineal es **inestable**.
3. Si $\mu(A) =  0$ y la dimensión algebraica coincide con la geométrica para todo valor propio, entonces EDO lineal es **estable** (No asintóticamente estable).
4. Si $\mu(A) =  0$ y la dimensión algebraica NO coincide con la geométrica para algún valor propio, entonces EDO lineal es **inestable**.


### Documentación: 
- Valores propios: https://docs.sympy.org/latest/tutorial/matrices.html

- Matriz de jordan: https://docs.sympy.org/latest/modules/matrices/matrices.html


- Para cálculo numérico: https://www.math.ubc.ca/~pwalls/math-python/linear-algebra/eigenvalues-eigenvectors/


Análisis para la matriz $A$:

$\mu(A) = 0$ y para $i y -i$ la multiplicidad algebraica no coinciden con la geométrica, luego no es estable. 


```python
import sympy as sp

A = sp.Matrix ( 
    [
        [2,    2,  3, -3, -1],
        [1,    3,  4, -5, 0],
        [-10, -6,-13, 10, 4],
        [-7, -2, -7, 4, 3], 
        [-8, -4, -10, 6, 3]
    ]
)
P , J = A.jordan_form() # A = P J P^{-1}

print('Jordan Matrix: ')
display(J)

print('valores propios:', A.eigenvals()) # dicionario con valor propios: multiplicidad algebraica

t = sp.symbols("t")
(A*t).sp.exp()
```


```python
# Por si acaso el cálculo simbólico no funciona utilizar numpy: 

import numpy as np
import matplotlib.pyplot as plt
import scipy.linalg as la


# Matriz 

M = np.array( 
    [
        [2,    2,  3, -3, -1],
        [1,    3,  4, -5, 0],
        [-10, -6,-13, 10, 4],
        [-7, -2, -7, 4, 3], 
        [-8, -4, -10, 6, 3]
    ]
)

eigvals, eigvecs = la.eig(M) # almacena en 0 los valores propios, en 1 lso vectoris propios


#np.set_printoptions(precision=2)
print( np.around(eigvals, decimals = 5))


```

    [-1.+0.j  0.+1.j  0.-1.j -0.+1.j -0.-1.j]



```python
A = sp.Matrix ( 
    [
        [2,   6,  -5],
        [ 2,  10,  -7], 
        [4,  18 , -13]
    ]
)
A = sp.Matrix ( 
    [
        [ 6,  18, -13],
        [4, 16, -11], 
        [8, 30, -21]
    ]
)

P , J = A.jordan_form() # A = P J P^{-1}

print('Jordan Matrix: ')
display(J)

print('valores propios:', A.eigenvals()) # dicionario con valor propios: multiplicidad algebraica

```

    Jordan Matrix: 



$\displaystyle \left[\begin{matrix}-2 & 0 & 0\\0 & 1 & 0\\0 & 0 & 2\end{matrix}\right]$


    valores propios: {2: 1, 1: 1, -2: 1}


bdd7e491786795e0a14bab2da370da9c94afb64e
ipynb
Jupyter Notebook
programas/valores_propios_matriz_jordan.ipynb
BlancaCC/ecuaciones-diferenciales
f876a4b2e5224ae27b7be0ec048cd7faa4bdcfb0
MIT
programas/valores_propios_matriz_jordan.ipynb
BlancaCC/ecuaciones-diferenciales
f876a4b2e5224ae27b7be0ec048cd7faa4bdcfb0
MIT
programas/valores_propios_matriz_jordan.ipynb
BlancaCC/ecuaciones-diferenciales
f876a4b2e5224ae27b7be0ec048cd7faa4bdcfb0
MIT
Qwen/Qwen-72B
1. YES
2. YES