domingo, 24 de julio de 2016

Cálculo de las matrices de controlabilidad y observabilidad en Python/SageMath

Cálculo de las matrices de controlabilidad y observabilidad en Python/SageMath

Jonny Cristhian Otero Baca

Dado un sistema representado en el espacio de estados por las matrices A, B, C, D, como paso previo al diseño de un controlador u observador debemos verificar la controlabilidad u observabilidad del sistema.
Por medio de la libreria Numpy, podemos calcular las matrices de controlabilidad y observabilidad usando Python y Sagemath, para mas teoría respecto al tema referirse a .
Antes de implementar las funciones que calculen la controlabilidad y observabilidad de un sistema en el espacio de estados, se hizo necesario definir una función que calculara la potencia n de una matriz A, el codigo de la función es el siguiente:
import numpy as np
def power_matrix(A,n):
    if n==0:
        return(np.identity(A.ndim))
    if n==1:
         return A
    X=A
    for i in range(1,n):
        X=X.dot(A)
    return X
A continuación definimos la función controlabilidad, esta función definida en Python retorna la matriz de controlabilidad. Para calcular el resultado, es necesario proporcionar como parametros las matrices A y B.
​
def controlability(A,B):
    U=B
    for i in range(1,A.ndim):
        U1=np.dot(power_matrix(A,i),B).transpose()
        U=np.insert(U,i,U1,axis=1)
    return U
La función observabilidad la definimos como sigue:
def observability(A,C):
    V=C
    for i in range(1,A.ndim):
        V=np.append(V,np.dot(C,power_matrix(A,i)),axis=0)
    return V     
Probamos las funciones ingresando los siguientes sistemas de prueba:
A=np.array([[1.5,1],[1,0]])
B=np.array([[1.0],[0.0]])
C=np.array([[2.,-1.]])
U=controlability(A,B)
view(U)
V=observability(A,C)
view(V)
Este código retorna:
U =  1.0 1.5 0.0 1.0
V =  2.0  − 1.0 2.0 2.0

Referencias

[1]