In [2]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

Un sistema de segundo orden en su forma estándar se define:

$$\frac{Y(s)}{R(s)}=\frac{\omega_{n}^{2}}{s^{2}+2\,\zeta\omega_{n}s + \omega_{n}^{2}}$$

Luego el comportamiento dinámico del sistema de segundo orden se describe en términos de dos parámetros $\zeta$ y $\omega_{n}$.

Si $0< \zeta < 1$, los polos a lazo cerrado son complejos conjugados y se encuentran en el semiplano izquierdo del plano $s$

falta

La señal de error para este sistema es la diferencia entre la entrada y la salida y es:

$$e(t) = r(t) - y(t) = e^{-\zeta \omega_{n}t}(cos(\omega_{d} \, t)+\frac{\zeta}{\sqrt{1-\zeta^{2}}}sin(\omega_{d} \, t))$$

Ya que $$y(t) =1 - e^{-\zeta \omega_{n}t}(cos(\omega_{d} \, t)+\frac{\zeta}{\sqrt{1-\zeta^{2}}}sin(\omega_{d} \, t)) $$


In [3]:
def y(t, zeta, omega_d):
    
    return  1 - np.exp(-zeta * omega_d * t) * (np.cos(omega_d * t) + (zeta / np.sqrt(1 - zeta**2)) * np.sin(omega_d * t))

In [4]:
def error(t, zeta, omega_d):
    
    return  np.exp(-zeta * omega_d * t) * (np.cos(omega_d * t) + (zeta / np.sqrt(1 - zeta**2)) * np.sin(omega_d * t))

Sabemos que finalmente la discretización del controlador PID queda:

$$u(t_{k})=u(t_{k-1})+[u_{0}(t_{k})-u_{0}(t_{k-1})]+K_{p}[e(t_{k})-e(t_{k-1})]+\frac{K_{p}T_{s}}{T_{i}}e(t_{k})+\frac{K_{p}T_{d}}{T_{s}}[e(t_{k})-2e(t_{k-1})+e(t_{k-2})] $$

Luego el controlador total o incrmental se calcula:

$$u(t_{k})=u(t_{k-1})+\Delta u(t_{k})$$

In [7]:
T_s = .1
N = 100  # numero de muestras
u = np.zeros(N)

In [5]: