Tema 4 · Ecuaciones diferenciales y en diferencias
Departament d’Enginyeria Electrònica
Escola Tècnica Superior d’Enginyeria
Despatx 2.2.14
Grado en Ingeniería Electrónica de Telecomunicación (GIET)
Curso 2026/2027
Prerrequisitos
El uso de ecuaciones diferenciales en la ingeniería es fundamental.
Gobiernan el comportamiento de los sistemas físicos, como circuitos eléctricos, sistemas mecánicos y sistemas de control.
Permiten predecir la evolución de sistemas a lo largo del tiempo, lo que es crucial para el diseño y análisis de sistemas.
Pongamos de ejemplo la misión espacial Artemis:
¿Cómo calculamos la trayectoria de la nave espacial?
¿Cómo decidimos cuándo encender los motores y con qué intensidad?
Necesitamos una ecuación diferencial que relacione su posición (salida) con la fuerza de los motores (entrada).
Las leyes de cada dominio dan directamente la ecuación del sistema:
RC (primer orden)
\[RC\,\dot{v}_C + v_C = v_s\]
RLC serie (segundo orden)
\[LC\,\ddot{v}_C + RC\,\dot{v}_C + v_C = v_s\]
Masa-muelle (segundo orden)
\[m\,\ddot{y} + b\,\dot{y} + k\,y = f\]
Una ecuación diferencial lineal con coeficientes constantes se define mediante su ecuación y las condiciones iniciales:
\[ \begin{cases} a_n\dfrac{d^n y}{dt^n} + \cdots + a_1\dfrac{dy}{dt} + a_0 y = \varphi(t) \\[4pt] y(t_0) = y_0 \\ y'(t_0) = y_1 \\ y''(t_0) = y_2 \\ \quad\vdots \\ y^{(n-1)}(t_0) = y_{n-1} \end{cases} \]
El orden de la ecuación es \(n\), se corresponde con la derivada más alta
Se necesitan \(n\) condiciones iniciales para determinar la solución única
Como son lineales y además tienen coeficientes constantes, eso implica que los sistemas modelados son LTI
\[ y(t) = y_h(t) + y_p(t) \]
La solución homogénea \(y_h(t)\) representa la respuesta del sistema en ausencia de entradas externas
Su estructura depende de la ecuación característica
Sus constantes dependen de las condiciones iniciales
La solución particular \(y_p(t)\) representa la respuesta del sistema para una entrada externa dada
Su estructura depende de la estructura de la entrada
Es independiente de las condiciones iniciales
En sistemas estables:
\[ a_n\dfrac{d^n y_h}{dt^n} + \cdots + a_1\dfrac{dy_h}{dt} + a_0 y_h = 0\]
\[ a_n\dfrac{d^n y_p}{dt^n} + \cdots + a_1\dfrac{dy_p}{dt} + a_0 y_p = \varphi(t)\]
Resolución de la homogénea
| Tipo de raíz | Forma del modo |
|---|---|
| Real simple | \(K e^{s_k t}\) |
| Real multiplicidad \(m\) | \((K_1 + K_2 t + \dots + K_m t^{m-1}) e^{s_k t}\) |
| Compleja conjugada (\(s = \sigma \pm j\omega\)) | \(e^{\sigma t}\left(K_1 \cos(\omega t) + K_2 \sin(\omega t)\right)\) |
Resolución de la particular
| Entrada \(\varphi(t)\) | Forma de \(y_p(t)\) |
|---|---|
| Constante | \(C\) |
| Lineal | \(C_1 t + C_2\) |
| Exponencial | \(C e^{at}\) |
| Seno/Coseno | \(C_1 \cos(\omega t) + C_2 \sin(\omega t)\) |
Resolución completa
viewof tipo_ps = {
const control = Inputs.radio(["Reales simples", "Real doble", "Complejas conjugadas"],
{value: "Complejas conjugadas", label: "Raíces"});
// A lo ancho de la fila: con el ancho por omisión (etiqueta más control, y un tope de 640 px)
// las tres opciones se parten en dos líneas
control.style.width = "100%";
control.style.maxWidth = "none";
return control;
}// Los deslizadores dependen del tipo: al cambiarlo se crean de nuevo, con su etiqueta y su
// valor de partida. El primero es siempre una parte real.
viewof a_ps = Inputs.range([-1.2, 0.4], {
value: tipo_ps === "Reales simples" ? -0.3 : -0.4,
label: {"Reales simples": "s₁", "Real doble": "s₁ = s₂", "Complejas conjugadas": "σ = Re{s}"}[tipo_ps],
format: v => v.toFixed(2)
})// El segundo es la otra raíz real o la parte imaginaria. La raíz doble no lo necesita: en su
// lugar va un elemento vacío, que deja el hueco y da a la celda un valor que no se usa.
viewof b_ps = tipo_ps === "Reales simples"
? Inputs.range([-1.2, 0.4], {value: -1, label: "s₂", format: v => v.toFixed(2)})
: tipo_ps === "Complejas conjugadas"
? Inputs.range([0.2, 4], {value: 2, label: "ω_d = Im{s}", format: v => v.toFixed(2)})
: Object.assign(html`<div></div>`, {value: null})// Los dos modos de la homogénea de segundo orden, según el tipo de raíces. Los colores son
// los de las dos curvas, y con ellos se escriben los términos de la ecuación.
ps = {
const t = d3.range(0, 14.001, 0.02);
const c1 = "#2c7fb8", c2 = "#e74c3c";
let m1, m2, polos, doble = [], env = [], ecuacion;
if (tipo_ps === "Reales simples") {
m1 = v => Math.exp(a_ps * v);
m2 = v => Math.exp(b_ps * v);
polos = [{re: a_ps, im: 0}, {re: b_ps, im: 0}];
ecuacion = tex`y_h(t) = K_1\,{\color{${c1}}{e^{s_1 t}}} + K_2\,{\color{${c2}}{e^{s_2 t}}}`;
} else if (tipo_ps === "Real doble") {
m1 = v => Math.exp(a_ps * v);
m2 = v => v * Math.exp(a_ps * v);
polos = [{re: a_ps, im: 0}];
doble = polos;
ecuacion = tex`y_h(t) = K_1\,{\color{${c1}}{e^{s_1 t}}} + K_2\,{\color{${c2}}{t\,e^{s_1 t}}}`;
} else {
m1 = v => Math.exp(a_ps * v) * Math.cos(b_ps * v);
m2 = v => Math.exp(a_ps * v) * Math.sin(b_ps * v);
polos = [{re: a_ps, im: b_ps}, {re: a_ps, im: -b_ps}];
env = t.map(v => ({t: v, e: Math.exp(a_ps * v)}));
ecuacion = tex`y_h(t) = K_1\,{\color{${c1}}{e^{\sigma t}\cos(\omega_d t)}} + K_2\,{\color{${c2}}{e^{\sigma t}\sin(\omega_d t)}}`;
}
return {
modo1: t.map(v => ({t: v, y: m1(v)})),
modo2: t.map(v => ({t: v, y: m2(v)})),
env, polos, doble, ecuacion, c1, c2
};
}Plot.plot({
width: 400, height: 320, aspectRatio: null, marginTop: 36, // como la gráfica de al lado, para que los dos marcos empiecen a la vez
marginBottom: 44, // sitio para bajar el rótulo del eje x
x: {label: "Re{s}", labelOffset: 42, domain: [-1.4, 0.6], grid: true}, // por debajo de las marcas, sin pisarlas
y: {label: "Im{s}", domain: [-4.4, 4.4], grid: true},
marks: [
Plot.rect([{x1: -1.4, x2: 0}], {x1: "x1", x2: "x2", y1: -4.4, y2: 4.4, fill: "#41ab5d", fillOpacity: 0.12}),
Plot.ruleX([0], {strokeWidth: 2}),
Plot.ruleY([0]),
Plot.dot(ps.polos, {x: "re", y: "im", symbol: "times", r: 9, stroke: "#e74c3c", strokeWidth: 3}),
// La raíz doble es una sola aspa: su multiplicidad va rotulada al lado
Plot.text(ps.doble, {x: "re", y: "im", text: () => "(2)", fill: "#e74c3c", fontWeight: "bold", dx: 22, dy: -16}),
Plot.text([{x: -0.7, y: 4.0}], {x: "x", y: "y", text: () => "estable", fill: "#41ab5d"})
]
})Plot.plot({
width: 780, height: 320, marginTop: 36, // sitio para el rótulo del eje, que si no pisa la marca de 1,5
marginBottom: 44, // el mismo que el plano s, para que los marcos acaben a la vez
x: {label: "t (s)", labelOffset: 42, domain: [0, 14]},
y: {label: "modos", grid: true, domain: [-1.5, 1.5]},
marks: [
Plot.ruleY([0]),
Plot.line(ps.env, {x: "t", y: "e", stroke: "#555", strokeDasharray: "4 4", clip: true}),
Plot.line(ps.env, {x: "t", y: d => -d.e, stroke: "#555", strokeDasharray: "4 4", clip: true}),
Plot.line(ps.modo2, {x: "t", y: "y", stroke: ps.c2, strokeWidth: 2.5, clip: true}),
Plot.line(ps.modo1, {x: "t", y: "y", stroke: ps.c1, strokeWidth: 2.5, clip: true})
]
})📐 Ejemplo 4.1: Circuito RLC serie
Un circuito RLC serie con \(R = 3\ \Omega\), \(L = 1\) H y \(C = 0{,}5\) F. La entrada es la tensión de la fuente \(v_s(t)\), y la salida la tensión en bornes del condensador, \(v_C(t)\). El circuito está en reposo, es decir, el condensador está descargado y no circula corriente.
Calcula la tensión en el condesador \(v_c(t)\) si se enciende una fuente de alimentación en \(t = 0\) configurada como:
a) Tensión continua \(v_s(t) = 10 \, u(t)\) V
b) Tensión \(v_s(t) = 10 \cos(t) u(t)\) V
1) Ley de tensiones de Kirchhoff: la fuente se reparte entre los tres elementos.
\[v_s(t) = v_R(t) + v_L(t) + v_C(t)\]
2) Ley de cada elemento, con la misma corriente \(i(t)\) en los tres (están en serie):
\[v_R(t) = R\,i(t) \qquad v_L(t) = L\,\frac{di(t)}{dt} \qquad i(t) = C\,\frac{dv_C(t)}{dt}\]
3) Se elimina la corriente, sustituyendo \(i(t)\) en \(v_R(t)\) y \(v_L(t)\):
\[v_R(t) = RC\,\frac{dv_C(t)}{dt} \qquad\qquad v_L(t) = LC\,\frac{d^2 v_C(t)}{dt^2}\]
4) Se llevan a la ley de Kirchhoff, y queda una ecuación solo en \(v_C(t)\) y \(v_s(t)\):
\[LC\,\frac{d^2 v_C(t)}{dt^2} + RC\,\frac{dv_C(t)}{dt} + v_C(t) = v_s(t)\]
5) Con los valores del circuito, y con \(\varphi(t) = v_s(t)\) e \(y(t) = v_C(t)\):
\[\ 0{,}5\,y'' + 1{,}5\,y' + y = \varphi(t)\]
Ya sabemos que la ecuación diferencial es:
\[\ 0{,}5\,y'' + 1{,}5\,y' + y = \varphi(t)\]
1) Es una EDO de segundo orden, así que necesitamos dos CCII: \(y(0)\) e \(y'(0)\).
2) Recuerda, como \(y(t) = v_C(t)\), eso implica que debemos conocer \(v_c(0)\) y \(v_c'(0)\)
3) El condensador está descargado y por tanto, directamente: \[v_C(0) = 0 \quad\Longrightarrow\quad y(0) = 0\]
4) No circula corriente, es decir, \(i(0) = 0\), pero la corriente del circuito es la misma del condensador, y por tanto, a partir de su ecuación \(i(t) = C\,v_C'(t)\), se deduce que:
\[v_c'(0) = y'(0) = \frac{i(0)}{C} = 0\]
\[ 0{,}5\,y'' + 1{,}5\,y' + y = \varphi(t) , \qquad y(0) = 0, \quad y'(0) = 0 \]
Primer paso: solución homogénea
\[0{,}5\,s^2 + 1{,}5\,s + 1 = 0 \quad\Longrightarrow\quad s_1 = -1, \quad s_2 = -2\]
\[y_h(t) = K_1\,e^{-t} + K_2\,e^{-2t}\]
Segundo paso: solución particular
La entrada es constante, así que \(y_p(t) = C\).
Sustituir \(y_p\) en la ecuación y calcular \(C\):
\[0{,}5 \cdot 0 + 1{,}5 \cdot 0 + C = 10 \quad\Longrightarrow\quad y_p(t) = 10\]
Tercer paso: solución completa
Calcular la solución completa: \(y(t) = K_1\,e^{-t} + K_2\,e^{-2t} + 10\)
Usar las CCII para obtener \(K_1\) y \(K_2\):
\[\left.\begin{aligned} y(0) &= K_1 + K_2 + 10 = 0 \\ y'(0) &= -K_1 - 2K_2 = 0 \end{aligned}\right\} \quad\Longrightarrow\quad K_1 = -20, \quad K_2 = 10\]
\[{\color{#e74c3c}{y(t)}} = {\color{#9370db}{\underbrace{-20\,e^{-t} + 10\,e^{-2t}}_{y_h(t)}}} + {\color{#41ab5d}{\underbrace{10}_{y_p(t)}}} \ \text{V}, \quad t \geq 0\]
Primer paso: solución homogénea (¡es la misma!)
\[y_h(t) = K_1\,e^{-t} + K_2\,e^{-2t}\]
Segundo paso: solución particular
La entrada es senoidal, así que \(y_p(t) = C_1\cos(t) + C_2\sin(t)\).
Sustituir \(y_p\) en la ecuación (con sus derivadas \(y_p'\) e \(y_p''\)) y agrupar cosenos y senos:
\[ 0.5 y_p'' + 1.5 y_p' + y_p = x \implies C_1 = 2,\, C_2 = 6\]
Tercer paso: solución completa
\[y(t) = K_1\,e^{-t} + K_2\,e^{-2t} + 2\cos(t) + 6\sin(t)\]
\[\left.\begin{aligned} y(0) &= K_1 + K_2 + 2 = 0 \\ y'(0) &= -K_1 - 2K_2 + 6 = 0 \end{aligned}\right\} \quad\Longrightarrow\quad K_1 = -10, \quad K_2 = 8\]
\[{\color{#e74c3c}{y(t)}} = {\color{#9370db}{\underbrace{-10\,e^{-t} + 8\,e^{-2t}}_{y_h(t)}}} + {\color{#41ab5d}{\underbrace{2\cos(t) + 6\sin(t)}_{y_p(t)}}} \ \text{V}, \quad t \geq 0\]
Suma de senos y cosenos
Recuerda que \(a\cos(\omega t) + b\sin(\omega t) = \sqrt{a^2+b^2}\,\cos\!\left(\omega t - \phi\right)\) con \(\phi = -\arctan(b/a)\). Por ejemplo, en este caso, con \(a = 2\) y \(b = 6\): \(y_p(t) = 2\cos(t) + 6\sin(t) = 2\sqrt{10}\,\cos(t - \arctan 3)\).
La respuesta permanente del circuito RLC ya sabes calcularla mediante fasores:
La entrada \(\varphi(t) = 10\cos(t)\) tiene fasor \(\hat{V}_S = 10\) V
Aplicando el divisor de tensión tenemos que:
\[\begin{aligned} \hat{V}_C(j\omega) &= \frac{Z_C}{Z_R + Z_L + Z_C}\,\hat{V}_s(j\omega) = \frac{1/(j\omega C)}{R + j\omega L + 1/(j\omega C)}\,\hat{V}_s(j\omega) \\[6pt] &= \frac{1}{1 - \omega^2 LC + j\omega RC}\,\hat{V}_s(j\omega) = \frac{1}{1 - 0{,}5\,\omega^2 + j\,1{,}5\,\omega}\,\hat{V}_s(j\omega) \end{aligned}\]
\[\hat{V}_C = \frac{10}{0{,}5 + j\,1{,}5} = \frac{10\,(0{,}5 - j\,1{,}5)}{0{,}5^2 + 1{,}5^2} = 2 - j\,6 \begin{cases} |\hat{V}_C| = 2\sqrt{10} \, \text{V}\\ \angle\hat{V}_C = -\arctan(3) \end{cases}\]
Una de las principales aplicaciones de las ecuaciones en diferencias es el procesamiento digital de señales
Filtro paso bajo (IIR)
\[y[n] = (1-a)\,x[n] + a\,y[n-1]\]
Ecualizador de graves y agudos (FIR)
\[y[n] = g_G\,\frac{x[n] + x[n-1]}{2} + g_A\,\frac{x[n] - x[n-1]}{2}\]
Una ecuación en diferencias lineal con coeficientes constantes se define mediante su ecuación y las condiciones iniciales:
\[ \begin{cases} a_0\,y[n] + a_1\,y[n-1] + \cdots + a_N\,y[n-N] = \varphi[n] \\[4pt] y[-1] = y_1 \\ y[-2] = y_2 \\ \quad\vdots \\ y[-N] = y_N \end{cases} \]
El orden de la ecuación es \(N\), se corresponde con el retardo más grande de la salida
Se necesitan \(N\) condiciones iniciales para determinar la solución única
Como son lineales y además tienen coeficientes constantes, eso implica que los sistemas modelados son LTI
\[ y[n] = y_h[n] + y_p[n] \]
La solución homogénea \(y_h[n]\) representa la respuesta del sistema en ausencia de entradas externas
Su estructura depende de la ecuación característica
Sus constantes dependen de las condiciones iniciales
La solución particular \(y_p[n]\) representa la respuesta del sistema para una entrada externa dada
Su estructura depende de la estructura de la entrada
Es independiente de las condiciones iniciales
En sistemas estables:
\[ \small a_0y_h[n] + a_1y_h[n-1] + \cdots + a_Ny_h[n-N] = 0\]
\[ \small a_0y_p[n] + a_1y_p[n-1] + \cdots + a_Ny_p[n-N] = \varphi[n]\]
Resolución de la homogénea
| Tipo de raíz | Forma del modo |
|---|---|
| Real simple | \(K z_k^{\,n}\) |
| Real multiplicidad \(m\) | \((K_1 + K_2 n + \dots + K_m n^{m-1})\, z_k^{\,n}\) |
| Compleja conjugada (\(z = r\,e^{\pm j\Omega_0}\)) | \(r^{\,n}\left(K_1 \cos(\Omega_0 n) + K_2 \sin(\Omega_0 n)\right)\) |
Resolución de la particular
| Entrada \(\varphi[n]\) | Forma de \(y_p[n]\) |
|---|---|
| Constante | \(C\) |
| Lineal | \(C_1 n + C_2\) |
| Exponencial | \(C a^n\) |
| Seno/Coseno | \(C_1 \cos(\Omega n) + C_2 \sin(\Omega n)\) |
Resolución completa
viewof tipo_pz = {
const control = Inputs.radio(["Reales simples", "Real doble", "Complejas conjugadas"],
{value: "Complejas conjugadas", label: "Raíces"});
// A lo ancho de la fila, como en el plano s, para que las tres opciones quepan en una línea
control.style.width = "100%";
control.style.maxWidth = "none";
return control;
}// Como en el plano s, los deslizadores se crean de nuevo al cambiar de tipo. El primero es una
// raíz real o el módulo del par conjugado.
viewof a_pz = tipo_pz === "Complejas conjugadas"
? Inputs.range([0, 1.3], {value: 0.85, label: "r = |z|", format: v => v.toFixed(2)})
: Inputs.range([-1.3, 1.3], {
value: tipo_pz === "Reales simples" ? 0.85 : 0.7,
label: tipo_pz === "Reales simples" ? "z₁" : "z₁ = z₂",
format: v => v.toFixed(2)
})// El segundo es la otra raíz real o el ángulo. La raíz doble no lo necesita: en su lugar va un
// elemento vacío, que deja el hueco y da a la celda un valor que no se usa.
viewof b_pz = tipo_pz === "Reales simples"
? Inputs.range([-1.3, 1.3], {value: 0.5, label: "z₂", format: v => v.toFixed(2)})
: tipo_pz === "Complejas conjugadas"
? Inputs.range([0.1, 3], {value: 0.6, label: "Ω = arg{z}", format: v => v.toFixed(2)})
: Object.assign(html`<div></div>`, {value: null})// Los dos modos de la homogénea de segundo orden, según el tipo de raíces. Los colores son
// los de las dos secuencias, y con ellos se escriben los términos de la ecuación.
pz = {
const n = d3.range(0, 41);
const c1 = "#2c7fb8", c2 = "#e74c3c";
let m1, m2, raices, doble = [], env = [], ecuacion;
if (tipo_pz === "Reales simples") {
m1 = k => Math.pow(a_pz, k);
m2 = k => Math.pow(b_pz, k);
raices = [{re: a_pz, im: 0}, {re: b_pz, im: 0}];
ecuacion = tex`y_h[n] = K_1\,{\color{${c1}}{z_1^{\,n}}} + K_2\,{\color{${c2}}{z_2^{\,n}}}`;
} else if (tipo_pz === "Real doble") {
m1 = k => Math.pow(a_pz, k);
m2 = k => k * Math.pow(a_pz, k);
raices = [{re: a_pz, im: 0}];
doble = raices;
ecuacion = tex`y_h[n] = K_1\,{\color{${c1}}{z_1^{\,n}}} + K_2\,{\color{${c2}}{n\,z_1^{\,n}}}`;
} else {
m1 = k => Math.pow(a_pz, k) * Math.cos(b_pz * k);
m2 = k => Math.pow(a_pz, k) * Math.sin(b_pz * k);
raices = [{re: a_pz * Math.cos(b_pz), im: a_pz * Math.sin(b_pz)},
{re: a_pz * Math.cos(b_pz), im: -a_pz * Math.sin(b_pz)}];
env = n.map(k => ({n: k, e: Math.pow(a_pz, k)}));
ecuacion = tex`y_h[n] = K_1\,{\color{${c1}}{r^{\,n}\cos(\Omega n)}} + K_2\,{\color{${c2}}{r^{\,n}\sin(\Omega n)}}`;
}
return {
modo1: n.map(k => ({n: k, y: m1(k)})),
modo2: n.map(k => ({n: k, y: m2(k)})),
circulo: d3.range(0, 361).map(g => ({re: Math.cos(g * Math.PI / 180), im: Math.sin(g * Math.PI / 180)})),
env, raices, doble, ecuacion, c1, c2
};
}// El Plot que trae Quarto ignora `aspectRatio`, así que el círculo se cuadra con los márgenes:
// el área útil mide 400 − 91 − 61 = 248 px de ancho y 320 − 36 − 36 = 248 px de alto. Los
// márgenes laterales, además, centran el plano en su columna, y el de arriba es el de la
// gráfica de al lado, para que los dos marcos empiecen a la vez.
Plot.plot({
width: 400, height: 320,
marginLeft: 91, marginRight: 61, marginTop: 36, marginBottom: 36,
x: {label: "Re{z}", domain: [-1.45, 1.45], grid: true},
y: {label: "Im{z}", domain: [-1.45, 1.45], grid: true},
marks: [
Plot.area(pz.circulo, {x1: "re", y1: "im", y2: 0, fill: "#41ab5d", fillOpacity: 0.12}),
Plot.line(pz.circulo, {x: "re", y: "im", stroke: "#41ab5d", strokeWidth: 2}),
Plot.ruleX([0]), Plot.ruleY([0]),
Plot.dot(pz.raices, {x: "re", y: "im", symbol: "times", r: 9, stroke: "#e74c3c", strokeWidth: 3}),
// La raíz doble es una sola aspa: su multiplicidad va rotulada al lado
Plot.text(pz.doble, {x: "re", y: "im", text: () => "(2)", fill: "#e74c3c", fontWeight: "bold", dx: 22, dy: -16})
]
})// Las dos secuencias van separadas 3 px a cada lado de su muestra, para que no se tapen; el
// eje empieza un poco antes de n = 0 para que el recorte no se coma la primera
Plot.plot({
width: 780, height: 320, marginTop: 36, // sitio para el rótulo del eje, que si no pisa la marca de 1,5
x: {label: "n", domain: [-0.7, 40.7]},
y: {label: "modos", grid: true, domain: [-1.5, 1.5]},
marks: [
Plot.ruleY([0]),
Plot.line(pz.env, {x: "n", y: "e", stroke: "#555", strokeDasharray: "4 4", clip: true}),
Plot.line(pz.env, {x: "n", y: d => -d.e, stroke: "#555", strokeDasharray: "4 4", clip: true}),
Plot.ruleX(pz.modo2, {x: "n", y1: 0, y2: "y", stroke: pz.c2, strokeWidth: 2, dx: 3, clip: true}),
Plot.dot(pz.modo2, {x: "n", y: "y", fill: pz.c2, r: 3.5, dx: 3, clip: true}),
Plot.ruleX(pz.modo1, {x: "n", y1: 0, y2: "y", stroke: pz.c1, strokeWidth: 2, dx: -3, clip: true}),
Plot.dot(pz.modo1, {x: "n", y: "y", fill: pz.c1, r: 3.5, dx: -3, clip: true})
]
})Algo distintivo de las ecuaciones en diferencias es que se pueden resolver por recurrencia. Esto permite ver el patrón de la solución y deducir su fórmula general.
Por ejemplo, podemos calcular la respuesta impulsional del filtro paso bajo IIR
\[y[n] = 0{,}2\,x[n] + 0{,}8\,y[n-1]\]
\[\begin{aligned} y[0] &= 0{,}2\cdot 1 + 0{,}8\cdot 0 = 0{,}2 \\ y[1] &= 0{,}2\cdot 0 + 0{,}8\,y[0] = 0{,}8\cdot 0{,}2 \\ y[2] &= 0{,}2\cdot 0 + 0{,}8\,y[1] = 0{,}8^2\cdot 0{,}2 \\ y[3] &= 0{,}2\cdot 0 + 0{,}8\,y[2] = 0{,}8^3\cdot 0{,}2 \\ \dots \\ y[n] &= 0{,}8^n\cdot 0{,}2 \end{aligned}\]
\[h[n] = 0{,}2\cdot 0{,}8^{\,n}\,u[n]\]
📐 Ejemplo 4.2: Cuenta de ahorro con interés
Una cuenta da un \(2\,\%\) anual. La cuenta se abre con 1000 € y cada año se ingresan 500 € más.
a) Escribe la ecuación en diferencias que describe la evolución del saldo.
b) ¿Se puede resolver por recurrencia?
c) Resuelve la ecuación por el método habitual (homogénea y particular). ¿Cuál es el saldo a los 20 años?
Cada año el saldo anterior crece un \(2\,\%\) y se le suman los 500 € del ingreso:
\[y[n] = 1{,}02\,y[n-1] + 500, \quad n \geq 1, \qquad\text{con } y[0] = 1000\]
Es una ecuación de primer orden, \(y[n] - 1{,}02\,y[n-1] = \varphi[n]\), con término no homogéneo constante, \(\varphi[n] = 500\), y una condición inicial.
Se aplica la ecuación año a año sin operar, para que se vea el patrón:
\[\begin{aligned} y[1] &= 1{,}02\,y[0] + 500 \\ y[2] &= 1{,}02\,y[1] + 500 = (1{,}02)^2\,y[0] + 500\,(1{,}02 + 1) \\ y[3] &= 1{,}02\,y[2] + 500 = (1{,}02)^3\,y[0] + 500\,\big((1{,}02)^2 + 1{,}02 + 1\big) \\ y[n] &= (1{,}02)^n\,y[0] + 500 \sum_{k=0}^{n-1} (1{,}02)^k \end{aligned}\]
El último término es una suma geométrica finita de razón \(1{,}02\):
\[\sum_{k=0}^{n-1} (1{,}02)^k = \frac{(1{,}02)^{0} - (1{,}02)^{(n-1)+1}}{1 - 1{,}02} = \frac{1 - (1{,}02)^n}{-0{,}02} = 50 \,(1{,}02^n - 1)\]
Con \(y[0] = 1000\) y \(500 / 0{,}02 = 25\,000\), queda la fórmula del saldo para \(n \geq 0\):
\[y[n] = 1000 \cdot 1{,}02^n + 25\,000\,\big(1{,}02^n - 1\big) = 26\,000\cdot 1{,}02^n - 25\,000\]
Homogénea: la ecuación característica es \(z - 1{,}02 = 0\), con una raíz real simple, así que \(y_h[n] = K\,(1{,}02)^n\).
Particular: como \(\varphi[n]\) es constante, se prueba \(y_p[n] = C\):
\[C - 1{,}02\,C = 500 \quad\Longrightarrow\quad C = -\frac{500}{0{,}02} = -25\,000\]
Completa: con \(y[0] = K - 25\,000 = 1000\) sale \(K = 26\,000\), y por tanto
\[y[n] = 26\,000\,(1{,}02)^n - 25\,000, \qquad n \geq 0\]
Es la misma fórmula que da la recurrencia. A los 20 años, \(y[20] \approx 13\,635\) €.
📐 Ejemplo 4.3: Control digital de velocidad de un motor DC
Se tiene un controlador digital de velocidad en un motor DC. La velocidad \(y[n]\) (rpm) se lee mediante un encoder cada \(5\) ms. El bucle de control diseñado da lugar a la ecuación en diferencias
\[y[n] = y[n-1] - 0{,}5\,y[n-2] + 0{,}5\,x[n-2]\]
donde \(x[n]\) (rpm) es la velocidad deseada. La referencia deseada aparece con un retraso de dos muestras, debido al tiempo de procesamiento de la señal del encoder y del algoritmo de control.
El motor está inicialmente parado, \(y[-1] = y[-2] = 0\), y en \(n=0\) se pide una velocidad deseada de 150 rpm. Resuelve la ecuación:
a) Calcula la respuesta homogénea.
b) Calcula la respuesta particular.
c) Calcula la respuesta completa. ¿Se alcanza la velocidad deseada? ¿Cuál es la velocidad a los \(50\) ms de haber establecido la velocidad deseada?
Con la salida a un lado y la entrada al otro, es una ecuación de segundo orden:
\[y[n] - y[n-1] + 0{,}5\,y[n-2] = \varphi[n], \qquad \varphi[n] = 0{,}5\,x[n-2] = 75\,u[n-2]\]
La ecuación característica es \(z^2 - z + 0{,}5 = 0\), con raíces complejas conjugadas:
\[z = \frac{1 \pm \sqrt{1 - 2}}{2} = \frac{1 \pm j}{2} = \frac{1}{\sqrt{2}}\,e^{\pm j\pi/4}\]
Con \(r = 1/\sqrt{2}\) y \(\Omega_0 = \pi/4\), la respuesta homogénea es
\[y_h[n] = \left(\tfrac{1}{\sqrt{2}}\right)^{n}\left(K_1 \cos\!\left(\tfrac{\pi}{4}n\right) + K_2 \sin\!\left(\tfrac{\pi}{4}n\right)\right)\]
Como \(r < 1\), el modo se apaga: el lazo de control es estable.
La velocidad deseada tarda dos muestras (\(10\) ms) en notarse: \(\varphi[0] = \varphi[1] = 0\) y, desde \(n = 2\), \(\varphi[n] = 75\).
Para \(n \geq 2\) el término no homogéneo es constante, así que se prueba \(y_p[n] = C\):
\[C - C + 0{,}5\,C = 75 \quad\Longrightarrow\quad C = 150\]
Por tanto, \(y_p[n] = 150\) rpm: la velocidad deseada.
Completa: \(y[n] = 150 + \left(\tfrac{1}{\sqrt{2}}\right)^{n}\left(K_1 \cos\!\left(\tfrac{\pi}{4}n\right) + K_2 \sin\!\left(\tfrac{\pi}{4}n\right)\right)\).
Usando la propia ecuación con las CCII y teniendo en cuenta que \(x[-1] = x[-2] = 0\), se obtiene \(y[0] = 0\) y \(y[1] = 0\).
Por otro lado, con \(n = 0\) y \(n = 1\) en nuestra solución completa:
\[\begin{aligned} y[0] &= 150 + K_1 = 0 &&\Longrightarrow\quad K_1 = -150 \\ y[1] &= 150 + \tfrac{1}{\sqrt{2}}\left(\tfrac{\sqrt{2}}{2}K_1 + \tfrac{\sqrt{2}}{2}K_2\right) = 150 + \tfrac{K_1 + K_2}{2} = 0 &&\Longrightarrow\quad K_2 = -150 \end{aligned}\]
\[y[n] = 150\left[1 - \left(\tfrac{1}{\sqrt{2}}\right)^{n}\left(\cos\!\left(\tfrac{\pi}{4}n\right) + \sin\!\left(\tfrac{\pi}{4}n\right)\right)\right], \qquad n \geq 0\]
Como \(r < 1\), el transitorio se apaga y sí se alcanza la velocidad deseada: \(y[n] \to 150\) rpm. A los \(50\) ms, \(n = 10\) y \(y[10] = 150\,\big(1 - \tfrac{1}{32}\big) \approx 145{,}3\) rpm.
Tabla comparativa de ambos casos:
| Continuo | Discreto | |
|---|---|---|
| Operación básica | derivar | retrasar |
| Operador (temporal) | \(\dfrac{dy(t)}{dt}\) | \(y[n-1]\) |
| Operador (transformada) | \(s\) | \(z^{-1}\) |
| Ecuación característica | \(\sum a_k s^k = 0\) | \(\sum a_k z^{N-k} = 0\) |
| Estable si | \(\mathrm{Re}\{s_k\} < 0\) | \(\lvert z_k\rvert < 1\) |
Transformadas
Veremos más adelante que \(s\) es la variable de la transformada de Laplace y \(z\) es la variable de la transformada Z. Por eso, las transformadas son tan útiles para resolver ecuaciones diferenciales.
La condición de estabilidad dibuja zonas diferentes en el plano complejo en cada caso:
Señales y Sistemas Lineales - GIET - 2026/2027