Efecto de los polos adicionales y de los ceros#
Hasta ahora hemos estudiado el comportamiento de los sistemas de segundo orden. Ahora estudiaremos como afectan a la respuesta temporal agregar un cero o un polo.
Estudiemos el siguiente caso, tenemos una funci贸n de transferencia de la siguiente forma:
Separando en fracciones simples queda:
Vemos que ambas exponenciales tienen una amplitud similar.
Agreguemos un cero en -1.1. La funci贸n de transferencia quedar谩 de la forma:
Y separando en fracciones simples nos queda:
Como vemos, la exponencial m谩s r谩pida disminuy贸 su amplitud en m谩s de 10 veces.
Hagamos un an谩lisis m谩s detallado:
Tengamos en cuenta la funci贸n de transferencia normalizada de la siguiente manera:
Observemos que el cero lo agregamos a un factor \(\alpha\) con respecto a la parte real de los polos complejos conjugados: \(s = -\alpha\zeta\omega_n = -\alpha\sigma\)
Efecto Cero adicional#
Si queremos analizar como se comporta con el cero sobre el eje real positivo (se lo llama cero de no minima fase):
De la figura conclu铆mos que a medida que el cero se acerca al valor de la parte real de los polos, el sobrepico aumenta. En la figura anterior. vemos como aumenta el sobrepico al disminuir el valor de \(\alpha\) para distintos valores de \(\zeta\) . De la misma podemos afirmar que el valor del sobrepico no es muy afectado por el cero si el mismo se encuentra m谩s all谩 de un factor 4 de la parte real de los polos complejos conjugados.
Si escribimos la funci贸n de transferencia de la siguiente manera:
Notamos que el primer t茅rmino es la funci贸n de transferencia original (sin el cero), y el segundo t茅rmino es la derivada de la funci贸n de transferencia original afectada por una constante \(\dfrac{1}{\alpha\zeta}\). Por lo tanto, la respuesta a un escal贸n de la funci贸n de transferencia \(G(s)\) ser谩 la respuesta a un escal贸n de la funci贸n de transferencia sin el cero, m谩s la derivada de esa respuesta por la constante. De esta manera podemos explicar la presencia de un sobrepico mayor. En la figura siguiente muestra la respuesta a un escal贸n para el sistema original, su derivada y la suma de ambas (respuesta al sistema con el cero).
Para el caso de un cero en el semiplano derecho, debemos considerar \(\alpha < 0\), y sigue valiendo el mismo an谩lisis. La pr贸xima figura, mostramos la evoluci贸n de la respuesta a un escal贸n del sistema original, su derivada cambiada de signo y la respuesta del sistema con un cero en el semiplano derecho (un cero de no m铆nima fase). De esta figura observamos que la respuesta al escal贸n puede comenzar en sentido contrario a la referencia y luego se corrige.
En la siguiente celda, al ejecutarla, se muestra una figura interactiva donde se puede cambiar el valor del \(\alpha\) y ver como afecta la respuesta temporal, el cero adicional. En rojo punteado se grafica la salida del sistema de orden 2 puro.
Nota importante: es necesario instalar el paquete ipywidgets, y es posible que no funciones en Jupyter Lab, si no aparecen los 芦slider bar禄 para modificar el \(\alpha\) buscar la soluci贸n en la web, o abrir el notebook en Jupyter notebook donde deber铆a funcionar correctamente.
#Orden 2 + Cero adicional
from ipywidgets import interact
import control as ctrl
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
%matplotlib inline
def draw_figure(poleG,zeroG,t,y,yord2):
fig = plt.figure(figsize=(12,4))
gs = gridspec.GridSpec(1, 2, height_ratios=[1], width_ratios=[1,2])
ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1])
ax1.set_title("Polos y Ceros")
ax1.set_xlabel("Parte Real")
ax1.set_ylabel("Parte imaginaria")
ax1.spines['left'].set_color('none')
ax1.spines['right'].set_color('none')
ax1.spines['top'].set_color('none')
ax1.spines['bottom'].set_color('none')
ax2.set_title("Respuesta Temporal")
ax2.set_xlabel("Tiempo")
ax2.set_ylabel("Amplitud")
fig.tight_layout()
ax1.scatter(np.real(zeroG), np.imag(zeroG), marker='o')
ax1.scatter(np.real(poleG), np.imag(poleG), marker='x')
ax2.plot(t,y)
ax2.plot(t,yord2,'--r')
ax2.grid()
def update(alpha=1, wn=1, zeta=0.5,tmax=10):
G=ctrl.tf([1/wn/alpha/zeta,1],[1/wn**2,2*zeta/wn,1])
Gord2=ctrl.tf([1],[1/wn**2,2*zeta/wn,1])
alpha=0.001 if alpha==0 else alpha
t=np.linspace(0,tmax,501)
_,y=ctrl.step_response(G,T=t)
_,yord2=ctrl.step_response(Gord2,T=t)
polesG=G.pole()
zeroG=G.zero()
draw_figure(polesG,zeroG,t,y,yord2)
interact(update, alpha=(-20.01,50,0.1),wn=(0.01,10,0.1),zeta=(0.001,1.01,0.02),tmax=(1, 20));
Efecto Polo Adicional#
Analicemos ahora el caso de agregar un polo. Escribamos la funci贸n de transferencia de la siguiente forma:
Como podemos observar de la figura, la presencia de un polo adicional afecta sensiblemente al tiempo de crecimiento, y el mismo se hace m谩s grande cuanto el polo adicional se acerca m谩s al origen.
En la figura que sigue muestra el comportamiento del tiempo de crecimiento en funci贸n del valor de a parametrizada con \(\zeta\). Del mismo podemos inferir que si el polo adicional est谩 m谩s lejos que 4 veces la parte real de los polos complejos conjugados, el tiempo de crecimiento no es pr谩cticamente afectado.
En la siguiente celda, al ejecutarla, se muestra una figura interactiva donde se puede cambiar el valor del \(\alpha\) y ver como afecta la respuesta temporal la ubicaci贸n del polo adicional. En rojo punteado se grafica la salida del sistema de orden 2 puro.
Nota importante: es necesario instalar el paquete ipywidgets, y es posible que no funciones en Jupyter Lab, si no aparecen los 芦slider bar禄 para modificar el \(\alpha\) buscar la soluci贸n en la web, o abrir el notebook en Jupyter notebook donde deber铆a funcionar correctamente.
#Orden 2 + Polo adicional
from ipywidgets import interact
import control as ctrl
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
%matplotlib inline
def draw_figure(poleG,zeroG,t,y,yord2):
fig = plt.figure(figsize=(12,4))
gs = gridspec.GridSpec(1, 2, height_ratios=[1], width_ratios=[1,2])
ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1])
ax1.set_title("Polos y Ceros")
ax1.set_xlabel("Parte Real")
ax1.set_ylabel("Parte imaginaria")
ax1.spines['left'].set_color('none')
ax1.spines['right'].set_color('none')
ax1.spines['top'].set_color('none')
ax1.spines['bottom'].set_color('none')
ax2.set_title("Respuesta Temporal")
ax2.set_xlabel("Tiempo")
ax2.set_ylabel("Amplitud")
fig.tight_layout()
ax1.scatter(np.real(zeroG), np.imag(zeroG), marker='o')
ax1.scatter(np.real(poleG), np.imag(poleG), marker='x')
ax2.plot(t,y)
ax2.plot(t,yord2,'--r')
ax2.grid()
def update(alpha=1, wn=1, zeta=0.5,tmax=10):
G=ctrl.tf(1,[1/wn/alpha/zeta,1])*ctrl.tf(1,[1/wn**2,2*zeta/wn,1])
Gord2=ctrl.tf([1],[1/wn**2,2*zeta/wn,1])
alpha=0.001 if alpha==0 else alpha
t=np.linspace(0,tmax,501)
_,y=ctrl.step_response(G,T=t)
_,yord2=ctrl.step_response(Gord2,T=t)
polesG=G.pole()
zeroG=G.zero()
draw_figure(polesG,zeroG,t,y,yord2)
interact(update, alpha=(-20.01,50,0.1),wn=(0.01,10,0.1),zeta=(0.001,1.01,0.02),tmax=(1, 20));