Objetivos de aprendizaje
Plantear la ecuación diferencial de un circuito RLC serie y escribirla como un sistema de dos ecuaciones de primer orden.
Reconocer los regímenes sobreamortiguado, crítico y subamortiguado, y relacionarlos con las raíces de la ecuación característica.
Relacionar el amortiguamiento y la frecuencia natural con los valores de , y .
Interpretar la forma de onda de un desfibrilador de onda amortiguada como la descarga de un circuito RLC.
Teoría: Volumen I, Anexo C (condensador e inductor) y Anexo A (números complejos) (Miguel-Medina, 2026). Los circuitos de segundo orden se desarrollan en el Volumen II: este cuaderno sirve de puente. Tiempo: ~2 h
import sys
if "google.colab" in sys.modules:
%pip install -q git+https://github.com/telmomm/math-tools-biomedical-electronicsimport ipywidgets as widgets
import matplotlib.pyplot as plt
import numpy as np
import schemdraw
import schemdraw.elements as elm
import sympy as sp
from scipy import integrate
from circuitmath.plotting import use_style
use_style()Idea clave¶
Un circuito con un condensador y un inductor tiene dos almacenes de energía, y la energía puede pasar de uno a otro. Eso abre una posibilidad que el circuito RC no tenía: oscilar.
Para el circuito RLC serie de la figura, la ley de Kirchhoff de tensiones, con y , da una ecuación diferencial de segundo orden para la tensión del condensador:
Dos números resumen su comportamiento:
dice a qué ritmo intercambian energía el inductor y el condensador; , cuánta se lleva la resistencia en cada vaivén. Según el valor de la respuesta es de tres tipos: subamortiguada (, oscila), crítica () o sobreamortiguada (, lenta y sin oscilar).
with schemdraw.Drawing() as d:
d.config(unit=2.5, fontsize=12)
fuente = elm.SourceV().up().label("$V_s$")
elm.Switch().right().label("$t = 0$")
elm.Resistor().right().label("$R$")
elm.Inductor2().right().label("$L$")
elm.Capacitor().down().label("$C$", loc="bottom").label("$v(t)$", loc="top")
elm.Line().left().tox(fuente.start)
elm.Ground()L = 100e-3 # henrios
C = 10e-6 # faradios
VS = 5.0 # voltios
OMEGA_0 = 1 / np.sqrt(L * C)
R_CRITICA = 2 * np.sqrt(L / C)
print(f"Frecuencia natural: {OMEGA_0:.0f} rad/s ({OMEGA_0 / (2 * np.pi):.1f} Hz)")
print(f"Resistencia crítica (ζ = 1): {R_CRITICA:.0f} Ω")Frecuencia natural: 1000 rad/s (159.2 Hz)
Resistencia crítica (ζ = 1): 200 Ω
1. Predice¶
El condensador está descargado y el interruptor se cierra en .
Si la resistencia fuera nula, ¿qué haría la tensión del condensador?
La fuente es de 5 V. ¿Puede la tensión del condensador superar los 5 V en algún momento? ¿De dónde saldría la energía?
¿Qué resistencia lleva antes la tensión a su valor final sin pasarse: una muy pequeña, una muy grande o una intermedia?
Tu predicción:
2. Ejecuta y explora¶
2.1 La ecuación característica¶
Las soluciones de una ecuación diferencial lineal son exponenciales . Al sustituir en la ecuación (sin la fuente), cada derivada aporta un factor y queda una ecuación algebraica, la ecuación característica:
Es de segundo grado: tiene dos raíces, que pueden ser reales o complejas.
s = sp.symbols("s")
Rs, Ls, Cs = sp.symbols("R L C", positive=True)
raices = sp.solve(Ls * Cs * s**2 + Rs * Cs * s + 1, s)
raices[0]for R in (50.0, 200.0, 800.0):
valores = [complex(raiz.subs({Rs: R, Ls: L, Cs: C})) for raiz in raices]
zeta = R / R_CRITICA
print(f"R = {R:5.0f} Ω (ζ = {zeta:.2f}): s = {valores[0]:.1f} y {valores[1]:.1f}")R = 50 Ω (ζ = 0.25): s = -250.0-968.2j y -250.0+968.2j
R = 200 Ω (ζ = 1.00): s = -1000.0+0.0j y -1000.0+0.0j
R = 800 Ω (ζ = 4.00): s = -7873.0+0.0j y -127.0+0.0j
El signo de lo que hay dentro de la raíz cuadrada decide el tipo de respuesta:
Con Ω, dos raíces reales negativas: dos exponenciales que decaen, una rápida y otra lenta.
Con Ω, la resistencia crítica, las dos raíces coinciden.
Con Ω, dos raíces complejas conjugadas. Una exponencial con exponente complejo es una oscilación (Anexo A): la parte real da la rapidez con que se apaga y la parte imaginaria, la frecuencia con que oscila.
2.2 Solución numérica¶
solve_ivp resuelve ecuaciones de primer orden. Una de segundo orden se convierte en dos de primer orden eligiendo como incógnitas las dos magnitudes que almacenan energía, la tensión del condensador y la corriente del inductor:
def simular(R, L, C, v_fuente, v_inicial=0.0, t_final=0.04, puntos=2000):
"""Circuito RLC serie: devuelve el tiempo, la tensión del condensador y la corriente."""
def pendiente(t, x):
v, i = x
return [i / C, (v_fuente - R * i - v) / L]
t = np.linspace(0, t_final, puntos)
solucion = integrate.solve_ivp(
pendiente, (0, t_final), [v_inicial, 0.0], t_eval=t, rtol=1e-8, atol=1e-10
)
return solucion.t, solucion.y[0], solucion.y[1]
fig, ax = plt.subplots()
for R in (50.0, 200.0, 800.0):
t, v, i = simular(R, L, C, VS)
ax.plot(t * 1e3, v, label=f"R = {R:.0f} Ω (ζ = {R / R_CRITICA:.2f})")
ax.axhline(VS, color="gray", linestyle=":", linewidth=1)
ax.set(xlabel="Tiempo (ms)", ylabel="Tensión del condensador (V)", title="Los tres regímenes")
ax.legend()
plt.show()
Con poca resistencia la tensión sobrepasa los 5 V de la fuente y oscila; con mucha, sube despacio. La resistencia crítica es la frontera: la respuesta más rápida que no se pasa.
2.3 Las raíces, vistas como autovalores¶
Las dos ecuaciones de primer orden se escriben como un sistema matricial, en el lenguaje del Bloque B:
Las raíces de la ecuación característica son los autovalores de . Lo comprobamos y, de paso, vemos cómo se mueven por el plano complejo al aumentar la resistencia.
def autovalores(R):
A = np.array([[0, 1 / C], [-1 / L, -R / L]])
return np.linalg.eigvals(A)
print("Autovalores con R = 50 Ω:", np.round(autovalores(50.0), 1))
resistencias = np.logspace(0.5, 3, 300)
raices_plano = np.array([autovalores(R) for R in resistencias])
fig, ax = plt.subplots()
puntos = ax.scatter(
raices_plano.real.ravel(),
raices_plano.imag.ravel(),
c=np.repeat(resistencias, 2),
s=6,
norm="log",
)
ax.axvline(0, color="gray", linewidth=1)
ax.set(
xlabel="Parte real (1/s)",
ylabel="Parte imaginaria (rad/s)",
title="Raíces al variar R",
xlim=(-3000, 100),
)
fig.colorbar(puntos, ax=ax, label="R (Ω)")
plt.show()Autovalores con R = 50 Ω: [-250.+968.2j -250.-968.2j]

Con poca resistencia, las dos raíces están cerca del eje imaginario: mucha oscilación y poca atenuación. Al aumentar recorren un arco de radio hasta encontrarse sobre el eje real cuando es la resistencia crítica. A partir de ahí se separan: una se aleja (la exponencial rápida) y la otra vuelve hacia el origen. Esa raíz lenta es la que hace perezoso al circuito sobreamortiguado.
Todas las raíces tienen parte real negativa: el transitorio siempre se apaga, porque la resistencia siempre disipa.
2.4 Anatomía de una respuesta subamortiguada¶
Con , la respuesta al escalón es una oscilación de pulsación encerrada en una envolvente exponencial . El primer pico sobrepasa el valor final en una fracción que solo depende de :
R = 50.0
zeta = R / R_CRITICA
omega_d = OMEGA_0 * np.sqrt(1 - zeta**2)
t, v, i = simular(R, L, C, VS)
envolvente = VS * np.exp(-zeta * OMEGA_0 * t) / np.sqrt(1 - zeta**2)
fig, ax = plt.subplots()
ax.plot(t * 1e3, v, label="Tensión del condensador")
ax.plot(t * 1e3, VS + envolvente, "k--", linewidth=1, label="Envolvente")
ax.plot(t * 1e3, VS - envolvente, "k--", linewidth=1)
ax.set(xlabel="Tiempo (ms)", ylabel="Tensión (V)")
ax.set_title(f"Respuesta subamortiguada (ζ = {zeta:.2f})")
ax.legend()
plt.show()
print(f"Sobreimpulso medido: {(v.max() - VS) / VS:.1%}")
print(f"Sobreimpulso teórico: {np.exp(-np.pi * zeta / np.sqrt(1 - zeta**2)):.1%}")
print(f"Periodo de la oscilación: {2 * np.pi / omega_d * 1e3:.2f} ms")
Sobreimpulso medido: 44.4%
Sobreimpulso teórico: 44.4%
Periodo de la oscilación: 6.49 ms
2.5 ¿Dónde está la energía?¶
La tensión supera a la de la fuente porque el inductor, una vez que lleva corriente, se resiste a detenerla y sigue cargando el condensador. Para verlo, calculamos la energía de cada elemento con las fórmulas del cuaderno C2.
energia_C = 0.5 * C * v**2
energia_L = 0.5 * L * i**2
energia_R = integrate.cumulative_trapezoid(R * i**2, t, initial=0)
energia_fuente = integrate.cumulative_trapezoid(VS * i, t, initial=0)
fig, ax = plt.subplots()
ax.plot(t * 1e3, energia_C * 1e6, label="Condensador, $\\frac{1}{2}Cv^2$")
ax.plot(t * 1e3, energia_L * 1e6, label="Inductor, $\\frac{1}{2}Li^2$")
ax.plot(t * 1e3, energia_R * 1e6, label="Disipada en R")
ax.plot(t * 1e3, energia_fuente * 1e6, "k--", linewidth=1, label="Entregada por la fuente")
ax.set(xlabel="Tiempo (ms)", ylabel="Energía (µJ)", title="Balance de energía (R = 50 Ω)")
ax.legend(fontsize="small")
plt.show()
desajuste = np.max(np.abs(energia_fuente - (energia_C + energia_L + energia_R)))
print(f"Desajuste máximo del balance: {desajuste * 1e6:.3f} µJ")
for R_prueba in (50.0, 200.0, 800.0):
t_p, v_p, i_p = simular(R_prueba, L, C, VS, t_final=0.2, puntos=20000)
disipada = integrate.trapezoid(R_prueba * i_p**2, t_p)
almacenada = 0.5 * C * v_p[-1] ** 2
print(
f"R = {R_prueba:4.0f} Ω: disipada = {disipada * 1e6:.1f} µJ, "
f"almacenada = {almacenada * 1e6:.1f} µJ"
)
Desajuste máximo del balance: 0.012 µJ
R = 50 Ω: disipada = 125.0 µJ, almacenada = 125.0 µJ
R = 200 Ω: disipada = 125.0 µJ, almacenada = 125.0 µJ
R = 800 Ω: disipada = 125.0 µJ, almacenada = 125.0 µJ
La energía va y viene entre el inductor y el condensador, y en cada viaje la resistencia se queda una parte. El balance cuadra en todo momento: lo que entrega la fuente es la suma de las otras tres curvas, salvo el pequeño error de la integral numérica.
El resultado final es llamativo: al terminar, el condensador almacena y la resistencia ha disipado exactamente lo mismo, sea cual sea su valor. Cargar un condensador desde una fuente de tensión constante cuesta siempre el doble de la energía que se almacena.
2.6 Explorador interactivo¶
La función siguiente dibuja a la vez la respuesta y las raíces para una resistencia dada.
def explorador(R=50.0):
"""Respuesta al escalón y raíces del circuito RLC para una resistencia R."""
t, v, _ = simular(R, L, C, VS)
raices_R = autovalores(R)
fig, (ax_t, ax_s) = plt.subplots(1, 2, figsize=(9, 3.6))
ax_t.plot(t * 1e3, v)
ax_t.axhline(VS, color="gray", linestyle=":", linewidth=1)
ax_t.set(xlabel="Tiempo (ms)", ylabel="Tensión (V)", ylim=(0, 10))
ax_t.set_title(f"R = {R:.0f} Ω, ζ = {R / R_CRITICA:.2f}")
ax_s.plot(raices_R.real, raices_R.imag, "x", markersize=10, markeredgewidth=2)
ax_s.axhline(0, color="gray", linewidth=1)
ax_s.axvline(0, color="gray", linewidth=1)
ax_s.set(xlabel="Parte real (1/s)", ylabel="Parte imaginaria (rad/s)", title="Raíces")
ax_s.set(xlim=(-3000, 300), ylim=(-1200, 1200))
fig.tight_layout()
plt.show()
explorador(50.0)
La celda siguiente le añade un control deslizante: muévelo y observa cómo cambian la respuesta y las raíces al pasar por la resistencia crítica. El control solo funciona con el cuaderno en ejecución (en Binder, en Colab o en tu ordenador), no en la versión web del libro.
control = widgets.FloatLogSlider(value=50, base=10, min=0.5, max=3, step=0.05, description="R (Ω)")
widgets.interact(explorador, R=control);2.7 Hilo biomédico: la onda de un desfibrilador¶
En el cuaderno C2, el desfibrilador era un condensador que se descargaba directamente sobre el paciente: un pico de corriente inmediato que decae como una exponencial. Los desfibriladores clásicos intercalaban un inductor en serie para dar forma al pulso. El resultado es la onda senoidal amortiguada (onda de Lown), que se usó durante décadas.
Es un circuito RLC serie sin fuente, cuya condición inicial es el condensador cargado y cuya resistencia es el propio paciente. Los valores son los típicos de esos equipos. La impedancia del tórax varía mucho de una persona a otra, así que simulamos tres casos.
C_DESFIB = 16e-6 # faradios
L_DESFIB = 100e-3 # henrios
ENERGIA = 200.0 # julios
V_CARGA = np.sqrt(2 * ENERGIA / C_DESFIB)
print(f"Tensión de carga: {V_CARGA:.0f} V")
fig, ax = plt.subplots()
for R_paciente in (25.0, 50.0, 100.0):
zeta = R_paciente / 2 * np.sqrt(C_DESFIB / L_DESFIB)
t, v, i = simular(R_paciente, L_DESFIB, C_DESFIB, 0.0, v_inicial=V_CARGA, t_final=0.02)
i_paciente = -i # la corriente sale del condensador
entregada = integrate.trapezoid(R_paciente * i**2, t)
ax.plot(t * 1e3, i_paciente, label=f"{R_paciente:.0f} Ω (ζ = {zeta:.2f})")
print(
f"Paciente de {R_paciente:3.0f} Ω: pico de {i_paciente.max():.0f} A "
f"a los {t[i_paciente.argmax()] * 1e3:.1f} ms, energía en 20 ms = {entregada:.0f} J"
)
ax.axhline(0, color="gray", linewidth=1)
ax.set(xlabel="Tiempo (ms)", ylabel="Corriente por el paciente (A)")
ax.set_title("Onda senoidal amortiguada")
ax.legend(title="Impedancia del paciente")
plt.show()Tensión de carga: 5000 V
Paciente de 25 Ω: pico de 50 A a los 1.8 ms, energía en 20 ms = 199 J
Paciente de 50 Ω: pico de 42 A a los 1.7 ms, energía en 20 ms = 200 J
Paciente de 100 Ω: pico de 31 A a los 1.5 ms, energía en 20 ms = 200 J

Compara con la descarga exponencial de C2. El inductor impide que la corriente salte de golpe. Sin él, este condensador cargado a 5000 V daría sobre 50 Ω un pico inmediato de 100 A; con él, el pulso sube de forma suave hasta unos 40 A y dura unos milisegundos. La energía entregada es la misma, porque no hay otro sitio donde disiparla, pero repartida de otra manera.
La forma de la onda depende del paciente. Con una impedancia baja el circuito es claramente subamortiguado y la corriente llega a invertirse; con una alta, el pico es menor y la onda apenas oscila. El mismo equipo, con la misma energía seleccionada, entrega corrientes distintas a personas distintas: es una de las razones por las que los desfibriladores actuales miden la impedancia del paciente y adaptan la descarga.
3. Explica¶
Relaciona cada régimen con el tipo de raíces de la ecuación característica. ¿Qué parte de una raíz compleja determina la frecuencia de la oscilación y cuál la rapidez con que se apaga?
En la figura de las raíces, por encima de la resistencia crítica una raíz se acerca al origen. ¿Por qué eso hace más lenta la respuesta, si la otra raíz es cada vez más rápida?
Explica con el balance de energía por qué la tensión del condensador puede superar a la de la fuente.
La energía disipada al cargar el condensador es siempre , valga lo que valga . ¿Qué ocurre en el límite ? ¿Hay contradicción?
Las raíces de la ecuación característica son los autovalores de la matriz . ¿Qué diría de un circuito un autovalor con parte real positiva? ¿Puede ocurrir con resistencias, condensadores e inductores?
En el desfibrilador, ¿qué impedancia del paciente haría crítica la descarga? ¿Qué cambiaría en la onda si se usara un inductor de 20 mH?
4. Ejercicios¶
Básico. Un circuito RLC serie tiene mH y µF.
Calcula y la resistencia crítica.
Clasifica el régimen para Ω, 200 Ω y 1 kΩ calculando y las raíces.
Simula la respuesta a un escalón de 1 V en los tres casos y comprueba el sobreimpulso del caso subamortiguado con la fórmula.
Aplicación. En el laboratorio no se conocen y : se miden. Genera una respuesta subamortiguada con
simular(elige tú la resistencia), añádele un poco de ruido y olvida los valores que usaste.Localiza los máximos sucesivos de la oscilación con
scipy.signal.find_peaks.El decremento logarítmico , donde y son las alturas de dos picos consecutivos sobre el valor final, cumple . Estima .
Con el tiempo entre picos, estima y, de ahí, . Compara con los valores reales.
Reto biomédico. La presión arterial invasiva se mide con un catéter lleno de suero conectado a un transductor. El conjunto se comporta como un sistema de segundo orden: la masa del líquido hace de inductor, la elasticidad del tubo y del diafragma hace de condensador y el rozamiento, de resistencia. Su respuesta cumple , con la presión real e la medida.
Simula la respuesta a un escalón (la «prueba de lavado rápido» que se hace en la UCI) para una frecuencia natural de 15 Hz y .
Estima y la frecuencia natural a partir de la curva, como en el ejercicio anterior.
Simula la respuesta a una onda de presión sencilla (por ejemplo, un pulso triangular de 0,3 s entre 80 y 120 mmHg repetido cada segundo) con y con . ¿Cuánto se sobrestima la presión sistólica en cada caso? ¿Qué le ocurre a la medida si una burbuja de aire reduce la frecuencia natural a 5 Hz?
Resumen¶
Un circuito con un inductor y un condensador obedece a una ecuación diferencial de segundo orden; dos números, y , resumen su respuesta.
El tipo de respuesta lo deciden las raíces de la ecuación característica: reales (sobreamortiguada), iguales (crítica) o complejas conjugadas (subamortiguada, con oscilación).
Escrito como dos ecuaciones de primer orden, el circuito es un sistema matricial cuyos autovalores son esas raíces: aquí se encuentran los números complejos, las matrices y el cálculo.
La oscilación es energía que va y viene entre el inductor y el condensador mientras la resistencia la disipa. Ese mismo circuito da forma al pulso de un desfibrilador.
Con este cuaderno terminan los transitorios y el Bloque C. Los circuitos dinámicos, con su análisis completo, son el tema del Volumen II.
- Miguel-Medina, T. (2026). Electrónica en Ingeniería Biomédica — Volumen I. Autopublicación. 10.5281/zenodo.22913382