Retrato de Fase

El retrato de fase es una representación gráfica que de las variables de estado y sus derivadas, representadas por flechas. Es un campo vectorial que se construye con la matriz $A$ del sistema considerando el vector $u$ nulo, por lo que la ecuación de estados:

\[\dot{x} = A\,x+B\,u\]

se reduce a:

\[\dot{x} = A\,x\label{eqA}\]

Esta representación gráfica nos muestra cual es la tendencia de un sistema de manera natural a moverse (como un gradiente) partiendo de un punto en la gráfica.

El algoritmo

A continuación les presento una forma de calcularlo. Básicamente debemos calcular las derivadas usando la ecuación (\ref{eqA}):

Usaremos la matriz:

\[A = \begin{bmatrix}-1&-3\\3&-1\end{bmatrix}\]
import numpy as np
import matplotlib.pyplot as plt

A = np.array([[-1,-3],[3,-1]])

# Definimos el espacio donde 
# haremos el calculo del retrato de fase
x0 = np.linspace(-2,2,20)
x1 = np.linspace(-2,2,20)
    
# Creamo una malla de puntos
X0,X1=np.meshgrid(x0,x1)

# Creamos las matrices que guardarán
# la información de la derivadas
dX0 = np.zeros(X0.shape)
dX1 = np.zeros(X1.shape)
    
n,m = X1.shape

# Iteramos por todos los valores de la matriz
for i in range(n):
    for j in range(m):
        dX = np.matmul(A,np.array([[X0[i,j]],[X1[i,j]]]))
        dX0[i,j]=dX[0,0]
        dX1[i,j]=dX[1,0]

plt.figure(figsize=(4, 4))
plt.quiver(X0,X1,dX0,dX1,color='b');
plt.xlabel("x0")
plt.ylabel("x1")

Resultando en:

El algoritmo está escrito para dos variables de estado. Debe ser reinterpretado para más variables.