Sistemas de Segundo Orden
Chapter Index
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
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
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
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
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
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
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
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
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
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
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
4.6. Referencias#
[1] Ingenieria de Control - 2da edicion - William Bolton - 2001