```
%matplotlib inline
from sympy import var, Matrix, eye, init_printing, roots
init_printing()
```


```
var("a:5")
var("b:5")
var("s");
```

# Formas canónicas controlador y controlabilidad

Tenemos un sistema de orden 4 con una representación de estado:


```
Ac = Matrix([[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [-a4, -a3, -a2, -a1]])
bc = Matrix([[0], [0], [0], [1]])
cc = Matrix([[b4], [b3], [b2], [b1]])
```


```
Ac
```


```
bc
```


```
cc
```

La cual ya esta en la forma canónica controlador, podemos obtener su polinomio caracteristico:


```
PCc = (s*eye(4) - Ac).det()
PCc
```

La matriz sistema es la siguiente:


```
MSc  = (s*eye(4) - Ac).row_join(bc).col_join(-cc.T.row_join(Matrix([[0]])))
MSc
```

y su polinomio es:


```
pMSc = MSc.det()
pMSc
```

su Matriz de controlabilidad es:


```
MCc = ((bc.row_join(Ac*bc)).row_join(Ac*Ac*bc)).row_join(Ac*Ac*Ac*bc)
MCc
```

y su determinante es:


```
MCc.det()
```

Dado este sistema, lo podemos transformar a su forma controlabilidad:


```
Aco = Matrix([[-a1, 1, 0, 0], [-a2, 0, 1, 0], [-a3, 0, 0, 1], [-a2, 0, 0, 0]])
bco = bc
beta = Matrix([[1, 0, 0, 0], [a1, 1, 0, 0], [a2, a1, 1, 0], [a3, a2, a1, 1]]).inv()*Matrix([[b1], [b2], [b3], [b4]])
cco = Matrix([[beta[3]], [beta[2]], [beta[1]], [beta[0]]])
```


```
Aco
```


```
bco
```


```
cco
```

La cual tiene un polinomio caracteristico:


```
PCco = (s*eye(4) - Aco).det()
PCco
```

y una matriz sistema:


```
MSco = (s*eye(4) - Aco).row_join(bco).col_join(-cco.T.row_join(Matrix([[0]])))
MSco
```

con un polinomio:


```
pMSco = MSco.det()
pMSco.factor()
```

y una matriz de controlabilidad:


```
MCco = ((bco.row_join(Aco*bco)).row_join(Aco*Aco*bco)).row_join(Aco*Aco*Aco*bco)
MCco
```

con un determintante:


```
MCco.det()
```

## Ejemplo


```
A = Matrix([[0, 1, 0], [0, 0 , 1], [0, 0, 0]])
b = Matrix([[0], [0], [1]])
c = Matrix([[-1], [0], [1]])
x0 = Matrix([[1], [0], [0]])
```

La función de transferencia de este sistema es:


```
FT = c.T*(s*eye(3) - A).inv()*b
FT[0].factor()
```

su polinomio caracteristico:


```
PC = (s*eye(3) - A).det()
PC
```

su matriz sistema es:


```
MS = (s*eye(3) - A).row_join(b).col_join(-c.T.row_join(Matrix([[0]])))
MS
```

y el polinomio de esta matriz:


```
pMS = MS.det()
pMS.factor()
```

su matriz de controlabilidad:


```
C = (b.row_join(A*b)).row_join(A*A*b)
C
```


```
C.det()
```

Por el momento hemos visto que este sistema es controlable, sin embargo, aun no sabemos la retroalimentacion del estado que lo controlara.

Nuestra primera proposición será un sistema que se comporte como el siguiente:

$$
FT = \frac{(s-1)(s+1)}{(s-1)(s+1)^2}
$$

podemos ver que los polos de ese sistema son $+1$ y $-1$ con multiplicidad $2$, si averiguamos la forma del polinomio caracteristico, podemos ver los coeficientes de la retroalimentación:


```
((s+1)**2 *(s-1)).expand()
```

Si los coeficientes actuales son todos $0$ y tenemos que sustraer el vector de retroalimentación para obtener el que queremos, obtenemos que la retroalimentación debe ser de la forma:


```
f1 = Matrix([[1], [1], [-1]])
```

y por lo tanto, la matriz retroalimentada y el polinomio caracteristico, quedan de la siguiente manera:


```
Af1 = A + b*f1.T
Af1
```


```
PClc1 = (s*eye(3) - Af1).det()
PClc1.factor()
```

y el polinomio del sistema:


```
MSlc1 = (s*eye(3) - Af1).row_join(b).col_join(-c.T.row_join(Matrix([[0]])))
MSlc1
```


```
pMSlc1 = MSlc1.det()
pMSlc1.factor()
```

Ahora realicemos la simulación para ver el comportamiento del sistema.


```
from control import ss, step_response, forced_response
from numpy import linspace, matrix, sign
```


```
%matplotlib inline
from matplotlib.pyplot import plot, figure, gca, legend, style
```


```
heavyside = lambda x: 0.5 * (sign(x) + 1)
```


```
Af1 = matrix(Af1.tolist(), dtype=float)
b = matrix(b.tolist(), dtype=float)
c = matrix(c.tolist(), dtype=float)
f1 = matrix(f1.tolist(), dtype=float)
SR = ss(Af1, b, c.T, 0)
```


```
t = linspace(0, 10, 1000)
u = heavyside(t)
t, y, x = forced_response(SR, T=t, U=u)
v = (f1.T*x).T
```


```
f = figure(figsize=(15, 6))
style.use("ggplot")
p1, = plot(t, y)
p2, = plot(t, u)

ax = f.gca()
ax.set_ylim(-0.2, 1.2);

legend([p1, p2], [r"$y(t)$", r"$\delta$"]);
```


```
f = figure(figsize=(15, 6))
style.use("ggplot")
p1, = plot(t, x[0])
p2, = plot(t, x[1])
p3, = plot(t, x[2])

ax = f.gca()
ax.set_ylim(-0.2, 1.2);

legend([p1, p2, p3], [r"$x_1$", r"$x_2$", r"$x_3$"]);
```


```
f = figure(figsize=(15, 6))
style.use("ggplot")
p1, = plot(t, v)

ax = f.gca()
ax.set_ylim(-0.2, 1.2);

legend([p1], [r"$u(t)$"]);
```


```
A = Matrix([[0, 1, 0], [0, 0 , 1], [0, 0, 0]])
b = Matrix([[0], [0], [1]])
c = Matrix([[-1], [0], [1]])
x0 = Matrix([[1], [0], [0]])
```


```
((s+1)**3).expand()
```


```
f2 = Matrix([[-1], [-3], [-3]])
```


```
Af2 = A + b*f2.T
Af2
```


```
PClc2 = (s*eye(3) - Af2).det()
PClc2.factor()
```


```
MSlc1 = (s*eye(3) - Af2).row_join(b).col_join(-c.T.row_join(Matrix([[0]])))
MSlc1
```


```
pMSlc1 = MSlc1.det()
pMSlc1.factor()
```


```
T2, J2 = Af2.jordan_form()
J2
```


```
bJ2 = T2.inv()*b
cJ2 = T2.T*c
```


```
MSJ2 = (s*eye(3) - J2).row_join(bJ2).col_join(-cJ2.T.row_join(Matrix([[0]])))
MSJ2
```


```
FTJ2 = cJ2.T*(s*eye(3) - J2).inv()*bJ2
FTJ2[0].factor()
```


```
Af2 = matrix(Af2.tolist(), dtype=float)
b = matrix(b.tolist(), dtype=float)
c = matrix(c.tolist(), dtype=float)
SR = ss(Af2, b, c.T, 0)
```


```
t = linspace(0, 10, 1000)
u = heavyside(t)
t, y, x = forced_response(SR, T=t, U=u)
v = (f1.T*x).T
```


```
f = figure(figsize=(15, 6))
style.use("ggplot")
p1, = plot(t, y)
p2, = plot(t, u)

ax = f.gca()
ax.set_ylim(-0.2, 1.2);

legend([p1, p2], [r"$y(t)$", r"$\delta$"]);
```


```
f = figure(figsize=(15, 6))
style.use("ggplot")
p1, = plot(t, x[0])
p2, = plot(t, x[1])
p3, = plot(t, x[2])

ax = f.gca()
ax.set_ylim(-0.2, 1.2);

legend([p1, p2, p3], [r"$x_1$", r"$x_2$", r"$x_3$"]);
```


```
f = figure(figsize=(15, 6))
style.use("ggplot")
p1, = plot(t, v)

ax = f.gca()
ax.set_ylim(-0.2, 1.2);

legend([p1], [r"$u(t)$"]);
```


```

```

7534b27591a7763f6f37ebecd7d93c37d7e286b2
ipynb
Jupyter Notebook
IPythonNotebooks/Teoria de Control I/Formas canonicas controlador y controlabilidad.ipynb
chelizalde/DCA
34fd4d500117a9c0a75b979b8b0f121c1992b9dc
MIT
IPythonNotebooks/Teoria de Control I/Formas canonicas controlador y controlabilidad.ipynb
chelizalde/DCA
34fd4d500117a9c0a75b979b8b0f121c1992b9dc
MIT
IPythonNotebooks/Teoria de Control I/Formas canonicas controlador y controlabilidad.ipynb
chelizalde/DCA
34fd4d500117a9c0a75b979b8b0f121c1992b9dc
MIT
2021-03-20T12:44:13.000Z
2021-03-20T12:44:13.000Z
Qwen/Qwen-72B
1. YES
2. YES