Controlabilidad¶
- ¿Cuando podemos hacer posicionamiento de polos usando la realimentación de estados?
- ¿Cuando la matriz $B$ (la configuración de los actuadores) es suficientemente rica para hacer que el sistema haga lo que nosotros queramos?
- Las respuestas a estas preguntas reposan sobre el concepto de controlabilidad...
Controlabilidad con un ejemplo¶
- Dado un sistema en tiempo discreto: $$x_{k+1}= A\, x_k + B\, u_k\qquad x_0 = 0$$
- Es posible llevar el sistema en un número $n$ de pasos hacia un punto particular en el espacio $x^\star$
Controlabilidad con un ejemplo¶
$$\array{ x_1 &=& Ax_0 + Bu_0 &=& Bu_0\\ x_2 &=& Ax_1 + Bu_1 &=& ABu_0 + Bu_1\\ x_3 &=& Ax_2 + Bu_2 &=& A^2Bu_0+ ABu_1 + Bu_2\\ &&\vdots\\ x_n &=& Ax_{n-1} + Bu_{n-1} &=& A^{n-1}Bu_0 + \cdots + Bu_{n-1} }$$
de aquí podemos ver que:
$$x^\star = \left[\array{B&AB&\cdots&A^{n-1}B}\right] \left[\array{u_{n-1}\\\vdots\\u_1\\u_0}\right] = \Gamma \left[\array{u_{n-1}\\\vdots\\u_1\\u_0}\right]$$
Controlabilidad con un ejemplo¶
Es posible llegar a un estado $x^\star$ si y solo si:
$$\text{rank}\left(\Gamma\right) = n$$
Esto se generaliza fácilmente.
Controlabilidad : Teorema 1¶
Para un sistema $\dot{x}=Ax+Bu, x \in \mathscr{R}^n$
Definición El sistema es completamente controlable (CC) si es posible ir de cualquier estado inicial a cualquier estado final.
$$\Gamma = \left[\array{B&AB&\cdots&A^{n-1}B}\right] \qquad \text{Matriz de controlabilidad}$$
Teorema 1 El sistema es completamente controlable (CC) si y solo si
$$\text{rank}\left(\Gamma\right) = n$$
rank(M) =
al número de filas o columnas independientes de M
Controlabilidad : Teorema 2¶
asumiendo lo siguiente:
$$u = -Kx \qquad\qquad \dot{x}=(A-BK)x$$
Teorema 2 El posicionamiento de polos a valores arbitrarios es posible si y solo si el sistema es CC.
Ejemplo de uso de la controlabilidad¶
Dado el siguiente sistema:
$$\dot{x}=\left[\array{2&0\\1&1}\right]x+\left[\array{1\\1}\right]u$$
$$y=\left[\array{1&0}\right]x$$
Diseñar un controlador con realimentación de estados donde el vector de ref es $r=5$
Revisando de retrato de fase¶
El retrato de fase nos muestra para cada punto en el espacio de estados cual es la tendencia del sistema.
def phasePortrait(A,xlim=[-2,2],ylim=[-2,2]):
# next, define a grid of points at which we will show arrows
x0=np.linspace(xlim[0],xlim[1],20)
x1=np.linspace(ylim[0],ylim[1],20)
# create a grid
X0,X1=np.meshgrid(x0,x1)
# projections of the trajectory tangent vector
dX0=np.zeros(X0.shape)
dX1=np.zeros(X1.shape)
n,m = X1.shape
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');
phasePortrait(A)
plt.xlabel("x1")
plt.ylabel("x2");
Podemos ver de las flechas son divergentes.
Suponiendo que no sabemos de la controlabilidad¶
Del diagrama de bloques tendremos:
$$\dot{x}=(A-B\,K)\,x + B\,r$$
con la matriz dinámica del sistema en lazo cerrado podemos verificar su estabilidad usando los valores propios.
k1,k2 = symbols("k_1,k_2")
A1 = Matrix(A)-Matrix(B)*Matrix([[k1,k2]])
display(A1)
cuyos valores propios son:
display(A1.eigenvals())
De aquí vemos que para que el sistema sea estable debemos tener un $k_1 > 2 - k_2$, aunque ya tenemos un valor propio inestable $\lambda_1=1$
Continuando con la idea¶
Tomemos valores para las ganancias del controlador $k_1=k_2=2$, con esto el espacio de estados del sistema será:
K = np.array([[2,2]])
S1 = ct.ss(A-B*K,B,C,D)
display(S1)
Con este sistema si lo simulamos para que llegue al valor deseado, no llega:
T = np.linspace(0,3.5,100)
U = np.ones((1,100))*5
t,y = ct.forced_response(S1,T=T,U=U)
plt.plot(t,y,'b',[t[0],t[-1]],[5,5],'r')
plt.xlabel('x1')
plt.ylabel('x2');
Evaluando la controlabilidad¶
Tomemos las matrices $A$ y $B$ y construyamos la matriz de controlabilidad $\Gamma$
$$A=\left[\array{0&1\\0&1}\right] \qquad B=\left[\array{1\\0}\right] \qquad \implies \qquad \Gamma = \left[\array{1&0\\0&0}\right]$$
Luego, el rango de $\Gamma$ es $1$ que es menor al tamaño de $A$ que es $2$, por esto el sistema no es completamente controlable.
Ejemplo 2 de uso de controlabilidad¶
Realicemos lo mismo con el siguiente sistema:
$$\dot{x}=\left[\array{2&0\\1&1}\right]x+\left[\array{1\\0}\right]u$$
Pero empecemos con la matriz de controlabilidad para no cometer el mismo error
$$\Gamma = \left[\array{1&2\\0&1}\right]$$
cuyo rango es $2$ para un sistema con $2$ variables de estado, luego el sistema es completamente controlable.
Caminando con confianza¶
Ya que el sistema es completamente controlable podremos ubicar los polos del sistema donde queramos. Analicemos los valores propios de la matriz dinámica en lazo cerrado. Matriz dinámica:
A2 = Matrix(A)-Matrix(nB)*Matrix([[k1,k2]])
display(A2)
y sus valores propios:
display(A2.eigenvals())
Podemos definir los valores propios
poles = np.array([[-1,-10]])
K = ct.place(A,nB,poles)
A2 = Matrix(A)-Matrix(nB)*Matrix(K)
display(Matrix(poles))
Los cuales nos arrojarán los valores del controlador:
display(Matrix(K))
El sistema en lazo cerrado será:
S1 = ct.ss(A-nB*K,nB,C,D)
display(S1)
Respuesta del sistema controlable¶
La siguiente es la respuesta del controlador cuando tratamos de controlar los dos estados del sistema:
n = 1000
T = np.linspace(0,7,n)
RN = np.ones((1,n))*5*-10
R = np.ones((1,n))*5
t,y = ct.forced_response(S1,T=T,U=R)
tn,yn = ct.forced_response(S1,T=T,U=RN)
plt.plot(t,y,'g',[t[0],t[-1]],[5,5],'r')
plt.xlabel('tiempo')
plt.ylabel('salida');
¿Qué paso con la salida del sistema?
Falta regularizar la referencia usando la expresión:
$$N = (C\,(-A+B\,K)^{-1}B)^{-1}$$
para esta situación
$$N=-10$$
Respuesta del sistema con regularización¶
plt.plot(t,y,'g',tn,yn,'b',[t[0],t[-1]],[5,5],'r')
plt.xlabel('tiempo')
plt.legend(["sin regularización","con regularización","referencia"])
plt.ylabel('salida');
Punto vs Trayectoria¶
En espacio de estado se puede definir el punto donde queremos que llegue el sistema, pero no podemos definir la trayectoria.
particula = np.array([[0,1],[0,0]])
phasePortrait(particula)
plt.plot(1,1,'ko')
plt.plot(-1,1,'r*');
Ejercicio¶
Considerando la siguiente representación en espacio de estados:
$$\begin{align} \dot{x}&= \begin{bmatrix} 0 & 1 \\ 0 & 0 \end{bmatrix} \,x+ \begin{bmatrix} 0\\ 1 \end{bmatrix} \,u \\ y&= \begin{bmatrix} 1 & 0 \end{bmatrix} \,x \end{align}$$
- Verificar la controlabilidad del sistema
- Ubicar los polos del sistema donde queramos.
- Controlemos el sistema para llegar a un objetivo posición $p=-1$ y velocidad $v=1$.
phasePortrait(A,[-100,100],[-100,100])
plt.xlabel("x1")
plt.ylabel("x2");