Diseño para un motor de continua#

Supongamos que la transferencia de nuestro sistema es:

\[G(s)=\frac{10}{s(s+2)(s+8)}\]

Diseño un controlador que ubique los polos en:

\[pc=[-1.42;\quad -1.04\pm2.14j]\]

y los del estimador tres veces más rápidos.

Como tenemos el sistema en forma de función transferencia lo llevamos a alguna forma en espacio de estados (la que sea por defecto de Python)

G=ctrl.tf(10,[1,10,16,0])
G
\[\frac{10}{s^3 + 10 s^2 + 16 s}\]

Expresión en variables de estado#

De las formas canónicas disponibles, elegimos la forma canónica de observabilidad.

ctrl.canonical_form?
sys,_=ctrl.canonical_form(ctrl.ss(G),'observable')
sys
\[\begin{split} \left(\begin{array}{rllrllrll|rll} -10\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ -16\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ -0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&10\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \hline 1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \end{array}\right) \end{split}\]

Ley de control y estimador completo#

pc=np.array([-1.42, -1.04+2.14j,-1.04-2.14j])
pe = pc*3

Notar que hubiera podido escribir pc como una lista de los valores en donde quiero ubicar los polos a lazo cerrado. Sin embargo, luego no hubiera podido hacer la operación de pc*3 sobre la lista, ya que hubiera resultado en algo que no es lo que buscábamos.

Obtenemos la ley de control:

K=ctrl.place(sys.A,sys.B,pc)

Obtenemos L del estimador:

L=ctrl.place(sys.A.T,sys.C.T,pe).T

Hemos podido utilizar el comando place debido a que los 3 polos tanto del estimador como de los elegidos para la ley de control son distintos. De haber querido ubicar dos polos en el mismo lugar, hubiéramos tenido que usar el comando acker.

Sin embargo es necesario tener en cuenta que acker no es recomendable para sistema de orden mayor a 4.

Sistema controlador con estimador completo#

Dc=ctrl.ss(sys.A-sys.B@K-L@sys.C,L,-K,0)
ctrl.tf(Dc)
ctrl.isctime(Dc)
True
Dc.pole()
array([-2.93739746+8.32368499j, -2.93739746-8.32368499j,
        1.87479491+0.j        ])

Podemos ver que el controlador diseñado es inestable!. Esto no es deseable.

La razones por la que no es deseable un controlador inestable son:

  1. Presenta dificultades para ser testeado, ya sea el compensador por si solo o en lazo abierto durante la puesta en funcionamiento. Sin embargo, en algunos casos, se puede lograr una mejor performance del sistema de controlado con un controlador inestable (hay casos de sistemas que ni siquiera pueden ser estabilizados con controladores estables.). En ese caso se aceptan estos inconvenientes de testeo.

  2. Para ganancias bajas el sistema a lazo cerrado con un controlador inestable resulta inestable (visualizar el root locus). En general, los actuadores presentan saturaciones, es decir valor máximos de actuación. Cuando un actuador satura se ve desde el punto de vista de lazo como una reducción de la ganancia, llevando a la zona instable o acercándose a la misma.

Los sistemas que necesitan se vuelven inestables cuando su valor ganancia se reduce se los conoce como sistemas condicionalmente estables y deben ser evitados en la medida de lo posible.

Rediseñamos usando un estimador reducido#

Ahora pondremos los polos tal que \(\omega_n=6\) rad/seg y \(\zeta=0.707\)

pe_red= np.roots([1,2*0.707*6,6**2])
pe_red
array([-4.242+4.24328128j, -4.242-4.24328128j])

Necesitamos las sub-matrices de A para calcular el estimadores reducido

Aaa=sys.A[0:1,0:1]
Aab=sys.A[0:1,1:]
Aba=sys.A[1:,0:1]
Abb=sys.A[1:,1:]

Ba = sys.B[0:1,0:]
Bb = sys.B[1:,0:]

Ahora calculemos el estimador reducido.

Ltred = ctrl.place(Abb.T,Aab.T,pe_red).T
Ltred
array([[ 8.484],
       [36.   ]])

Sistema controlador con estimador reducido#

Ka=K[0:1,0:1]
Kb=K[0:1,1:]

Ar = Abb-Ltred@Aab-(Bb-Ltred@Ba)@Kb
Br = Ar@Ltred + Aba - Ltred@Aaa - (Bb-Ltred@Ba)@Ka
Cr = -Kb
Dr = -Ka-Kb@Ltred
Dcr = ctrl.ss(Ar,Br,Cr,Dr)
Dcr
\[\begin{split} \left(\begin{array}{rllrll|rll} -8.&\hspace{-1em}48&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&32.&\hspace{-1em}9&\hspace{-1em}\phantom{\cdot}\\ -93.&\hspace{-1em}6&\hspace{-1em}\phantom{\cdot}&6.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&264\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \hline -5.&\hspace{-1em}76&\hspace{-1em}\phantom{\cdot}&0.&\hspace{-1em}65&\hspace{-1em}\phantom{\cdot}&20.&\hspace{-1em}9&\hspace{-1em}\phantom{\cdot}\\ \end{array}\right) \end{split}\]
ctrl.tf(Dcr)
\[\frac{20.93 s^2 + 23.72 s - 28.94}{s^2 + 1.984 s + 38.47}\]
Dcr.pole()
array([-0.992+6.12247793j, -0.992-6.12247793j])
Dcr.zero()
array([-1.871798  +0.j,  0.73868705+0.j])

Si bien este diseño mejoró al anterior ya que el controlador resultante es estable, este presenta un problema potencialmente menos danino. El problema es que es un controlador de no mínima fase, ya que tiene un 0 en el lado derecho del plano \(s\), limitando la velocidad del sistema controlado.

L=-ctrl.tf(Dcr)*G/ctrl.db2mag(6)
ctrl.bode(L,dB=True, margins=True, omega_num=2000);
plt.gcf().set_size_inches(12,8)
../../../_images/fbec886e164459e8c8deffad1b742f4cda5307f0b029b9bf425e044eb06bbefc.png
T=ctrl.feedback(L)
plt.figure()
ctrl.bode(T,dB=True);
plt.gcf().set_size_inches(12,8)
../../../_images/33e82c6fa6209f139b9d5d778bf9402e0939990e9349a8fc5cf2670553da61a8.png
_=ctrl.nyquist(L);
plt.gcf().set_size_inches(8,6)
../../../_images/df5c30738c482e2dcca7287705893a590066dd2f96ee7aba624e4570b6659eef.png

Agregamos referencia al controlador de orden reducido.

def seguimiento_referencia(sys):
    aux1=np.vstack((np.hstack((sys.A,sys.B)),
                   np.hstack((sys.C,sys.D))))
    n=np.shape(sys.A)[0]
    aux2=np.vstack((np.zeros((n,1)),[1]))
    N=np.linalg.inv(aux1)@aux2
    Nx=N[0:n]
    Nu=N[n]
    return Nx, Nu

def calculate_Nbar(Nx,Nu,K):
    return Nu+K@Nx
Nx, Nu = seguimiento_referencia(sys)
Nbar = calculate_Nbar(Nx,Nu, K)
Nbar
array([[0.8038904]])
N=Nbar # Lo vemos mañana como se saca
M=(Bb-Ltred@Ba)*N
M
array([[0.      ],
       [8.038904]])
Dcr_ref = ctrl.ss(Ar, np.hstack((Br,M)), Cr, np.hstack((Dr,N)))
Dcr_ref
\[\begin{split} \left(\begin{array}{rllrll|rllrll} -8.&\hspace{-1em}48&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&32.&\hspace{-1em}9&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ -93.&\hspace{-1em}6&\hspace{-1em}\phantom{\cdot}&6.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&264\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&8.&\hspace{-1em}04&\hspace{-1em}\phantom{\cdot}\\ \hline -5.&\hspace{-1em}76&\hspace{-1em}\phantom{\cdot}&0.&\hspace{-1em}65&\hspace{-1em}\phantom{\cdot}&20.&\hspace{-1em}9&\hspace{-1em}\phantom{\cdot}&0.&\hspace{-1em}804&\hspace{-1em}\phantom{\cdot}\\ \end{array}\right) \end{split}\]

Rediseño usando SRL#

Vamos a diseñar el sistema para ubicar los polos de forma tal que se tenga un ancho de banda de 2.5rad/seg y que los polos del estimador estén aproximadamente 2.5 veces más rápido.

Para usar SRL vamos a tomar que \(\mathbf{C} = \mathbf{C_1}\) y que \(\mathbf{B} = \mathbf{B_1}\)

def conjugate_tf(G):
    num = ctrl.tf(G).num[0][0]
    den = ctrl.tf(G).den[0][0]
    nume = [num[i]*((-1)**(len(num)%2+1-i)) for i in range(0, len(num))]
    dene = [den[i]*((-1)**(len(den)%2+1-i)) for i in range(0, len(den))]
    return ctrl.tf(nume,dene)
Gm=conjugate_tf(G)
Gm
\[\frac{10}{-s^3 + 10 s^2 - 16 s}\]
_=ctrl.rlocus(G*Gm)
plt.gcf().set_size_inches(8,6)
../../../_images/fdd408519ede36d9ab11603a5d2d86a9d92de6a4ee4aa6ce3b86b0b9f6b6b10a.png

Con \(K=26\) obtenemos los polos con una frecuencia de corte de 2.5 rad/seg.

pc,_=ctrl.rlocus(G*conjugate_tf(G),kvect=[26],Plot=False)
pc = pc[pc.real<0]
pc
/usr/share/miniconda/lib/python3.11/site-packages/control/rlocus.py:132: FutureWarning: 'Plot' keyword is deprecated in root_locus; use 'plot'
  warnings.warn("'Plot' keyword is deprecated in root_locus; "
array([-8.04131959+0.j        , -2.00120126-1.52846879j,
       -2.00120126+1.52846879j])

Y con K=1350 tenemos los polos del estimador.

pe,_=ctrl.rlocus(G*conjugate_tf(G),kvect=[1350],Plot=False)
pe = pe[pe.real<0]
pe
array([-9.16842047+0.j        , -4.00280684-4.90432763j,
       -4.00280684+4.90432763j])
print("Polos de la ley de control: ",pc)
print("Polos del estimador: ",pe)
Polos de la ley de control:  [-8.04131959+0.j         -2.00120126-1.52846879j -2.00120126+1.52846879j]
Polos del estimador:  [-9.16842047+0.j         -4.00280684-4.90432763j -4.00280684+4.90432763j]
K=ctrl.place(sys.A,sys.B,pc)
L=ctrl.place(sys.A.T,sys.C.T,pe).T
Dcsrl=ctrl.ss(sys.A-sys.B@K-L@sys.C,L,-K,0)
ctrl.tf(Dcsrl)
\[\frac{-93.59 s^2 - 982 s - 1873}{s^3 + 19.22 s^2 + 150.7 s + 632.6}\]
Dcsrl.pole()
array([-10.64805029+0.j        ,  -4.28485298+6.40706271j,
        -4.28485298-6.40706271j])
Dcsrl.zero()
array([-2.50686229+0.j, -7.98559378+0.j])
_=ctrl.bode((-sys*Dc,-sys*Dcr,-sys*Dcsrl),omega_limits=(1e-2,1e2),dB=True)
plt.gcf().set_size_inches(12,8)
../../../_images/d7bcad154bacfe816b349c10409e857363c2f6ba74a9ca5e73eb11cf0969a3a7.png
print(ctrl.margin(-sys*Dc))
print(ctrl.margin(-sys*Dcr))
print(ctrl.margin(-sys*Dcsrl))
(0.6817283208674565, 13.183302483769978, 1.3027826533915898, 2.608292172554886)
(1.3198762960800097, -35.208651061693615, 2.078898635880656, 4.058211662618286)
(3.7818445925924267, 60.09561708472057, 5.49748749557239, 1.7117848527163622)
T1=ctrl.feedback(-sys*Dc)
T2=ctrl.feedback(-sys*Dcr)
T3=ctrl.feedback(-sys*Dcsrl)
print(f"Los polos de T1 son: {T1.pole()}")
print(f"Los polos de T2 son: {T2.pole()}")
print(f"Los polos de T3 son: {T3.pole()}")
Los polos de T1 son: [-3.12+6.42j -3.12-6.42j -1.04+2.14j -1.04-2.14j -1.42+0.j   -4.26+0.j  ]
Los polos de T2 son: [-4.242+4.24328128j -4.242-4.24328128j -1.04 +2.14j
 -1.04 -2.14j       -1.42 +0.j        ]
Los polos de T3 son: [-9.16842047+0.j         -8.04131959+0.j         -4.00280684+4.90432763j
 -4.00280684-4.90432763j -2.00120126+1.52846879j -2.00120126-1.52846879j]

Respuesta al escalón del sistema «controlado» (a partir de una salida distinta de 0)#

t1,y1 = ctrl.initial_response(T1, X0=np.matrix([0,0,0,-1,0,0]).T,T=np.linspace(0,5,1000))
t2,y2 = ctrl.initial_response(T2, X0=np.matrix([0,0,-1,0,0]).T,T=np.linspace(0,5,1000))
t3,y3 = ctrl.initial_response(T3, X0=np.matrix([0,0,0,-1,0,0]).T,T=np.linspace(0,5,1000))
fig, ax = plt.subplots(figsize=(12,4))
ax.plot(t1,y1,label="T1")
ax.plot(t2,y2,label="T2")
ax.plot(t3,y3,label="T3")
plt.legend()
ax.set_title('Respuesta a condiciones iniciales')
ax.set_xlabel("Tiempo")
ax.set_ylabel("Salida")
ax.grid()
../../../_images/81276d774ed4b0edf117eed6e35d471829b048d51161949e277e3382c231655a.png

Conexión de sistemas entrada/salida#

Podemos ver en el caso anterior que mediante el uso de la función ctrl.feedback hemos perdido, al menos parcialmente, saber de que manera están ordenados los estados del sistema.

Par aun mayor control de como están ubicados los estados, las entradas y la salidas es conveniente usar la función ctrl.append y ctrl.connect.

ctrl.connect?
sys_conectado_1 = ctrl.connect(ctrl.append(sys,Dc),
                               [[1,2],[2,1]],[1],[1,2])
sys_conectado_1
\[\begin{split} \left(\begin{array}{rllrllrllrllrllrll|rll} -10\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ -16\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&464\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-57.&\hspace{-1em}6&\hspace{-1em}\phantom{\cdot}&6.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&10\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 0.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-10.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 61.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-77.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 217\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&247\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-57.&\hspace{-1em}6&\hspace{-1em}\phantom{\cdot}&6.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \hline 1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&46.&\hspace{-1em}4&\hspace{-1em}\phantom{\cdot}&-5.&\hspace{-1em}76&\hspace{-1em}\phantom{\cdot}&0.&\hspace{-1em}65&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \end{array}\right) \end{split}\]
sys_conectado_2 = ctrl.connect(ctrl.append(sys,Dcr),[[1,2],[2,1]],[1],[1,2])
sys_conectado_2
\[\begin{split} \left(\begin{array}{rllrllrllrllrll|rll} -10\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ -16\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 209\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-57.&\hspace{-1em}6&\hspace{-1em}\phantom{\cdot}&6.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&10\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 32.&\hspace{-1em}9&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-8.&\hspace{-1em}48&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 264\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-93.&\hspace{-1em}6&\hspace{-1em}\phantom{\cdot}&6.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \hline 1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 20.&\hspace{-1em}9&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-5.&\hspace{-1em}76&\hspace{-1em}\phantom{\cdot}&0.&\hspace{-1em}65&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \end{array}\right) \end{split}\]
sys_conectado_3 = ctrl.connect(ctrl.append(sys, Dcsrl), [[1,2], [2,1]], [1], [1,2])
sys_conectado_3
\[\begin{split} \left(\begin{array}{rllrllrllrllrllrll|rll} -10\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ -16\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&2.&\hspace{-1em}59&\hspace{-1em}\phantom{\cdot}&-2.&\hspace{-1em}09&\hspace{-1em}\phantom{\cdot}&-2.&\hspace{-1em}04&\hspace{-1em}\phantom{\cdot}&10\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 7.&\hspace{-1em}17&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-17.&\hspace{-1em}2&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 97.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-113\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 367\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-365\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-2.&\hspace{-1em}09&\hspace{-1em}\phantom{\cdot}&-2.&\hspace{-1em}04&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \hline 1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0.&\hspace{-1em}259&\hspace{-1em}\phantom{\cdot}&-0.&\hspace{-1em}209&\hspace{-1em}\phantom{\cdot}&-0.&\hspace{-1em}204&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \end{array}\right) \end{split}\]

La manera en que ctrl.connect trabaja es:

  1. El primer argumento es un sistema de muchas entradas y muchas salidas que se tienen que interconectar. Para esto, agrupamos todos los sistemas que queremos interconectar mediante la función ctrl.append. Esta función nos va a devolver un único sistema en general de muchas entradas y muchas salidas.

  2. El segundo argumento es una matriz de interconexión, donde cada fila nos dice que entrada se conecta con que salida. Las entradas y las salidas quedan ordenadas según el orden que hayamos puesto en la función ctrl.append, y están númeradas a partir de 1.

  3. El tercer argumento, nos dice que entradas van a ser tomadas como entradas del sistema.

  4. El cuarto y último argumento son las salidas del sistema.

Revisemos la utilización de ctrl.connect en nuestro ejemplo:

  1. El primer argumento es un sistema construído a partir de ctrl.append que incluye a sys (la planta que queremos controlar) y a Dc (el controlador). Esta función nos va a devolver un sistema cuyos primeros 3 estados serán los estados de sys y los restantes son los del observador; tendrá dos donde la primer entrada es la de sys y la segunda entrada es la de Dc; y la primer salida es la de sys y la segunda salida es la de Dc.

  2. El segundo argumento es la matriz de interconexión. Primero conecto la entrada de sys con la salida de Dc. Como sys en ctrl.append está primero, la entrada 1 corresponde a la de sys y la salida 2 corresponde a la salida de Dc. De esta manera tenemos la primer fila de Q. La segunda fila de Q conecta la entrada de Dc con la salida de sys.

  3. El sistema que estamos generando no tiene entradas, pero el módulo de control tiene algunos problemas en sistemas que no tienen entradas o que no tiene salidas, por eso el tercer argumento vamos a poner [1], que significa una entrada que se sumará a la salida de Dc en la entrada de sys.

  4. El último argumento son las salidas. Voy a tomar como salidas de mi sistema el esfuerzo de control, es decir la salida del sistema Dc, y la salida de la planta, es decir la salida de sys.

Vamos a realizar nuevamente las simulaciones con los sistemas definidos mediante el connect.

t1,y1 = ctrl.initial_response(sys_conectado_1, X0=np.matrix([1,0,0,0,0,0]).T,T=np.linspace(0,5,1000))
t2,y2 = ctrl.initial_response(sys_conectado_2, X0=np.matrix([1,0,0,0,0]).T,T=np.linspace(0,5,1000))
t3,y3 = ctrl.initial_response(sys_conectado_3, X0=np.matrix([1,0,0,0,0,0]).T,T=np.linspace(0,5,1000))
fig, ax = plt.subplots(figsize=(12,4))
ax.plot(t1,y1[0,:],label="sys conectado 1")
ax.plot(t2,y2[0,:],label="sys conectado 2")
ax.plot(t3,y3[0,:],label="sys conectado 3")
plt.legend()
ax.set_title('Respuesta a condiciones iniciales')
ax.set_xlabel("Tiempo")
ax.set_ylabel("Salida")
ax.grid()
../../../_images/b1e3c35756b00110fad7979046e548607fb248a75b5c3a09f5dff297b84670b2.png

Podemos también mirar el esfuerzo de control, ya que es salida de la planta.

fig, ax = plt.subplots(figsize=(12,4))
ax.plot(t1,y1[1,:],label="sys conectado 1")
ax.plot(t2,y2[1,:],label="sys conectado 2")
ax.plot(t3,y3[1,:],label="sys conectado 3")
plt.legend()
ax.set_title('Respuesta a condiciones iniciales')
ax.set_xlabel("Tiempo")
ax.set_ylabel("Esfuerzo de control")
ax.grid()
../../../_images/20f94d761330cc0adff3aaa901376e658253ee6d4a846cc380551d3666bb0127.png

Este ejemplo muestra claramente como la elección de los polos usando criterios de optimización como son los de lugar simétrico de las raíces nos da un control mucho mejor, tanto en tiempo de respuesta como en el esfuerzo de control.

psys_controlado_con_ref = ctrl.connect(ctrl.append(sys,Dcr_ref), [[1, 2],[2,1]], [3], [1,2])
psys_controlado_con_ref.pole()
array([-4.242+4.24328128j, -4.242-4.24328128j, -1.04 +2.14j      ,
       -1.04 -2.14j      , -1.42 +0.j        ])
ctrl.dcgain(psys_controlado_con_ref)
array([[1.0000000e+00],
       [1.0658141e-14]])
t,y = ctrl.step_response(psys_controlado_con_ref)
fig, ax = plt.subplots(figsize=(12,4))
ax.plot(t,y[0,:].T,label="psys conectado con ref")
ax.set_title('Respuesta al escalón en la referencia')
ax.set_xlabel("Tiempo")
ax.set_ylabel("Salida")
ax.grid()
../../../_images/ace6ccf2c87ef07f4299418803e1df551a6f61c753392cb5db57d28147e072f6.png
fig, ax = plt.subplots(figsize=(12,4))
ax.plot(t,y[1,:].T,label="psys conectado con ref")
ax.set_title('Respuesta al escalón en la referencia')
ax.set_xlabel("Tiempo")
ax.set_ylabel("Esfuerzo de control")
ax.grid()
../../../_images/2328c163af5c03c067546331503e8dff26b7ec30962253f2d17b200f42f3f30f.png

Control integral y estimador de orden completo#

np.hstack((np.zeros((1,1)), sys.C))
np.hstack((np.zeros((3,1)), sys.A))
array([[  0., -10.,   1.,   0.],
       [  0., -16.,   0.,   1.],
       [  0.,  -0.,   0.,   0.]])
Au=np.vstack((np.hstack((np.zeros((1,1)), sys.C)),
              np.hstack((np.zeros((3,1)), sys.A))))
Au
array([[  0.,   1.,   0.,   0.],
       [  0., -10.,   1.,   0.],
       [  0., -16.,   0.,   1.],
       [  0.,  -0.,   0.,   0.]])
Bu = np.vstack((0,sys.B))
Bu
array([[ 0.],
       [ 0.],
       [ 0.],
       [10.]])
Ku = ctrl.place(Au,Bu, np.array([-1.42, -1.04+2.14j,-1.04-2.14j, -3])) 
Ku
array([[  2.4116712, -29.1264696,   3.81148  ,  -0.35     ]])
Ki=Ku[0,0]
Ki
2.4116711999999563
integrador=ctrl.ss([[0]],[[Ki,-Ki]],[1],[0, 0])
integrador
\[\begin{split} \left(\begin{array}{rll|rllrll} 0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&2.&\hspace{-1em}41&\hspace{-1em}\phantom{\cdot}&-2.&\hspace{-1em}41&\hspace{-1em}\phantom{\cdot}\\ \hline 1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \end{array}\right) \end{split}\]
# Estimado  mas ley de control

L=ctrl.place(sys.A.T, sys.C.T, np.array([-1.42, -1.04+2.14j,-1.04-2.14j])*3).T
L
array([[  0.5     ],
       [ 61.5332  ],
       [217.050408]])
Ae=sys.A-L@sys.C
Ae
array([[ -10.5     ,    1.      ,    0.      ],
       [ -77.5332  ,    0.      ,    1.      ],
       [-217.050408,    0.      ,    0.      ]])
Be=np.hstack((L,sys.B))
Be
array([[  0.5     ,   0.      ],
       [ 61.5332  ,   0.      ],
       [217.050408,  10.      ]])
Ce=-Ku[0:1,1:]
Ce
array([[29.1264696, -3.81148  ,  0.35     ]])
De=0
estim = ctrl.ss(Ae,Be,Ce,0)
estim
Hide code cell output
\[\begin{split} \left(\begin{array}{rllrllrll|rllrll} -10.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ -77.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&61.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ -217\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&217\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&10\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \hline 29.&\hspace{-1em}1&\hspace{-1em}\phantom{\cdot}&-3.&\hspace{-1em}81&\hspace{-1em}\phantom{\cdot}&0.&\hspace{-1em}35&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \end{array}\right) \end{split}\]
planta_controlada = ctrl.connect(ctrl.append(sys, estim, integrador), 
                                 [[1,2],[1,3],[2,1],[3,2],[3,3],[5,1]],[4],[1,2,3])
planta_controlada
Hide code cell output
\[\begin{split} \left(\begin{array}{rllrllrllrllrllrllrll|rll} -10\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ -16\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&291\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-38.&\hspace{-1em}1&\hspace{-1em}\phantom{\cdot}&3.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&10\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 0.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-10.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 61.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&-77.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 217\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&74.&\hspace{-1em}2&\hspace{-1em}\phantom{\cdot}&-38.&\hspace{-1em}1&\hspace{-1em}\phantom{\cdot}&3.&\hspace{-1em}5&\hspace{-1em}\phantom{\cdot}&10\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ -2.&\hspace{-1em}41&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&2.&\hspace{-1em}41&\hspace{-1em}\phantom{\cdot}\\ \hline 1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&29.&\hspace{-1em}1&\hspace{-1em}\phantom{\cdot}&-3.&\hspace{-1em}81&\hspace{-1em}\phantom{\cdot}&0.&\hspace{-1em}35&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ 0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&1\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}&0\phantom{.}&\hspace{-1em}&\hspace{-1em}\phantom{\cdot}\\ \end{array}\right) \end{split}\]
t,y = ctrl.step_response(planta_controlada)
Hide code cell source
fig, ax = plt.subplots(figsize=(12,4))
ax.plot(t,y[0,:].T,label="psys conectado con ref")
ax.set_title('Respuesta al escalón en la referencia')
ax.set_xlabel("Tiempo")
ax.set_ylabel("Salida")
ax.grid()
../../../_images/99f4972b432bbadbab34642a45848c17d07ee55ded18ab1a7060a4177a1f23df.png
planta_controlada.pole()
array([-3.12+6.42j, -3.12-6.42j, -1.04+2.14j, -1.04-2.14j, -4.26+0.j  ,
       -3.  +0.j  , -1.42+0.j  ])
fig, ax = plt.subplots(figsize=(12,4))
ax.plot(t,y[1,:].T,label="psys conectado con ref")
ax.set_title('Respuesta al escalón en la referencia')
ax.set_xlabel("Tiempo")
ax.set_ylabel("Esfuerzo de control")
ax.grid()
../../../_images/014fe5a29c9a7a53d161532a4d257bb3df0ff45e46563b23e2f9993c3e0c89bd.png

`