4. Sistemas de Segundo Orden#

Version 0.1

Contenido Original creado por Ezequiel Leonardo Castaño

Este contenido está INCOMPLETO y puede estar incompleto y/o sufrir modificaciones

Material faltante en este capítulo:

  • Representación en Simulink

  • Sistema de Segundo orden en Lazo Cerrado

%plot inline --format=png -w 1600 -h 500
format compact;

4.1. Sistemas de Segundo Orden#

Dado un Porcentaje de Overshoot (PO)

PO = 15
PO =
    15

4.2. Calculando ζ#

Despejamos el factor de amortiguanmiento relativo de la fórmula de overshoot

Se definen las dos variables

overshoot = sym("PO", 'positive'); 
zeta = sym("zeta", 'positive');

Se escribe la fómula de overshoot relativo

overshoot_equation = overshoot == exp((-zeta * pi) / sqrt(1 - zeta^2));

Se despeja y se muestra la solución

zeta_equation = simplify(solve(overshoot_equation, zeta, 'Real', true));
Warning: Solutions are only valid under certain conditions. To include parameters and conditions in the solution, specify the 'ReturnConditions' value as 'true'.
> In sym/solve>warnIfParams (line 478)
  In sym/solve (line 357)
pretty(zeta_equation)
        |log(PO)|
-------------------------
        2          0.5000
(log(PO)  + 9.8696)

Se escribe la fórmula en código y se calcula ζ

zeta = abs(log(PO/100)) / sqrt(pi^2 + log(PO/100)^2)
zeta =
    0.5169

4.3. Definiendo sistema de Segundo Orden#

Se asume un valor arbitrario para ω

omega = 3;

Se define la variable de la función de transferencia \(s\)

s = tf("s");

Ecuación general para un sistema de segundo orden en el plano \(s\)

segundo_orden = omega^2 / (s^2 + 2*omega*zeta*s + omega^2)
segundo_orden =
 
          9
  -----------------
  s^2 + 3.102 s + 9
 
Continuous-time transfer function.

4.3.1. Respuesta escalón#

figure;
step(segundo_orden)
grid on

../_images/ELC04_Sistemas_Segundo_Orden_21_1.png

4.3.2. Conversión a Polos y Ceros#

[polos, ceros] = pzmap(segundo_orden);
polos, ceros
polos =
  -1.5508 + 2.5681i
  -1.5508 - 2.5681i
ceros =
  0x1 empty double column vector

4.4. Medidas de Rendimiento#

4.4.1. Valor en Estado estable#

figure;
[y, t] = step(segundo_orden);
step(segundo_orden) % No encontré otra forma de ocultar salida y hacer plot
title("Valor en estado estable = " + num2str(round(y(end)), 2));
grid on

../_images/ELC04_Sistemas_Segundo_Orden_26_1.png

4.4.2. Delay Time#

Tiempo hasta llegar al 50% del valor estable

figure;
tiempo_delay =  (1 + 0.7 * zeta) / omega; % Aproximación
step(segundo_orden)
xline(tiempo_delay,'--r');
title("Tiempo hasta llegar al 50% = " + num2str(round(tiempo_delay, 2)))
grid on

../_images/ELC04_Sistemas_Segundo_Orden_28_1.png

4.4.3. Frecuencia Amortiguada y Ángulo del polo#

Varias medidas se expresan en función de la frecuencia amortiguada en vez de la frecuencia natural o utilizan el argumento del polo complejo o ángulo al eje real

frecuencia_amortiguada = omega * sqrt(1 - zeta^2)
frecuencia_amortiguada =
    2.5681
angulo_polo = acos(zeta)
angulo_polo =
    1.0275

4.4.4. Tiempo de Levantamiento#

Tiempo hasta pasar por el valor en estado estable

tiempo_levantamiento = (pi - angulo_polo) / frecuencia_amortiguada;

figure;
step(segundo_orden)
xline(tiempo_levantamiento,'--r');
title("Tiempo de Levantamiento = " + num2str(round(tiempo_levantamiento, 2)))
grid on

../_images/ELC04_Sistemas_Segundo_Orden_33_1.png

4.4.5. Tiempo del pico#

Tiempo hasta alcanzar el valor máximo o el valor de overshoot

tiempo_pico = pi / frecuencia_amortiguada;
procentaje_overshoot = exp(-zeta * pi / sqrt(1 - zeta^2));

figure;
step(segundo_orden)
xline(tiempo_pico,'--r');
title("Tiempo del pico = " + num2str(round(tiempo_pico, 2)))
grid on

../_images/ELC04_Sistemas_Segundo_Orden_35_1.png

4.4.6. Tiempo del segundo pico#

tiempo_segundo_pico = 2*pi / frecuencia_amortiguada;

figure;
step(segundo_orden)
xline(tiempo_segundo_pico,'--r');
title("Tiempo del segundo pico = " + num2str(round(tiempo_segundo_pico, 2)))
grid on

../_images/ELC04_Sistemas_Segundo_Orden_37_1.png

4.4.7. Tiempo de Asentamiento#

Al 5%

porcentaje_acentamiento = 5;

tiempo_asentamiento = -log(porcentaje_acentamiento/100) / (zeta * omega);

figure;
step(segundo_orden)
xline(tiempo_asentamiento,'--r');
title("Tiempo de Asentamiento al 5% = " + num2str(round(tiempo_asentamiento, 2)))
grid on

../_images/ELC04_Sistemas_Segundo_Orden_39_1.png
porcentaje_acentamiento = 2;

tiempo_asentamiento = -log(porcentaje_acentamiento/100) / (zeta * omega);

figure;
step(segundo_orden)
xline(tiempo_asentamiento,'--r');
title("Tiempo de Asentamiento al 2% = " + num2str(round(tiempo_asentamiento, 2)))
grid on

../_images/ELC04_Sistemas_Segundo_Orden_40_1.png

4.4.8. Consideraciones#

La frecuencia natural no afecta el overshoot

figure;

omega_values = [0.05, 0.10, 0.25, 0.50, 1.00];
for index = 1:length(omega_values)
    omega_ = omega_values(index);
    segundo_orden = (omega_^2) / (s^2 + 2*omega_*zeta*s + omega_^2);
    step(segundo_orden)
    legendInfo{index} = ['omega = ' num2str(omega_)]; 
    hold all
end

legend(legendInfo)
frecuencia_amortiguada = 0.05 * sqrt(1 - zeta^2); % Omega mínimo
tiempo_pico = pi / frecuencia_amortiguada;
xlim([0 tiempo_pico*1.1])

overshoot_magnitud = 1 * (1 + PO/100); % Asumiendo step = 1
ylim([overshoot_magnitud*0.95 overshoot_magnitud*1.05]) % Overshoot ± 5%

title("Overshoot para diferentes valores de Omega")
grid on

../_images/ELC04_Sistemas_Segundo_Orden_42_1.png

4.5. Polos y Zeros#

Para el sistema original

segundo_orden = omega^2 / (s^2 + 2*omega*zeta*s + omega^2);

figure;
pzmap(segundo_orden)
grid on

../_images/ELC04_Sistemas_Segundo_Orden_44_1.png

En el caso de tener distintos valores de la frecuencia natural, los polos se ubican sobre la recta que está a cos(zeta) grados del eje real

figure;
omega_values = [0.05, 0.10, 0.25, 0.50, 1.00];
for index = 1:length(omega_values)
    omega_ = omega_values(index);
    segundo_orden = (omega_^2) / (s^2 + 2*omega_*zeta*s + omega_^2);
    pzmap(segundo_orden)
    legendInfo{index} = ['omega = ' num2str(omega_)]; 
    hold all
end
legend(legendInfo, 'AutoUpdate', 'off')

% Rectas 

m = tan(angulo_polo); 
x = linspace(-1, 0);
plot(x, m*x, '--', "Color", [0 0 0])
plot(x, -m*x, '--', "Color", [0 0 0])
grid on

../_images/ELC04_Sistemas_Segundo_Orden_46_1.png

4.6. Referencias#

  • [1] Ingenieria de Control - 2da edicion - William Bolton - 2001