Objetivos de aprendizaje
Calcular el valor medio y el valor eficaz (RMS) de una señal periódica de forma analítica (SymPy) y numérica.
Programar la suma de rectángulos y la regla de los trapecios, y compararlas con la regla de Simpson.
Explicar de qué depende el error de una integral numérica y cómo se reduce.
Relacionar el valor eficaz con la potencia y la energía, y usarlo para medir la activación de un músculo en una señal de EMG.
Teoría: Volumen I, Anexo C (la integral: concepto, integrales habituales, energía) (Miguel-Medina, 2026). Tiempo: ~2 h
import sys
if "google.colab" in sys.modules:
%pip install -q git+https://github.com/telmomm/math-tools-biomedical-electronicsimport matplotlib.pyplot as plt
import numpy as np
import sympy as sp
from scipy import integrate, signal
from circuitmath.plotting import use_style
use_style()Idea clave¶
La integral definida es el área bajo una curva (Anexo C del Volumen I). En electrónica, casi todas las magnitudes que resumen una señal en un solo número son integrales:
| Magnitud | Definición | Qué responde |
|---|---|---|
| Valor medio | ¿Qué componente continua tiene la señal? | |
| Valor eficaz (RMS) | ¿Qué tensión continua daría la misma potencia? | |
| Energía | ¿Cuánta energía se ha entregado? |
El ordenador ofrece dos caminos. El simbólico da la fórmula exacta cuando la señal tiene una expresión sencilla. El numérico sustituye el área por una suma de trozos pequeños, y es el único posible cuando la señal son muestras tomadas con un instrumento, como un EMG.
1. Predice¶
Tres señales periódicas con la misma amplitud : una senoidal, una cuadrada y una triangular.
Ordénalas de mayor a menor valor eficaz. ¿Alguna tiene un valor eficaz igual a ?
El valor medio de las tres es cero. ¿Lo es también el de su potencia sobre una resistencia?
Una señal de EMG tiene valor medio nulo tanto en reposo como durante una contracción. ¿Qué medida usarías para saber cuánto se está contrayendo el músculo?
Tu predicción:
2. Ejecuta y explora¶
2.1 El camino simbólico¶
Definimos las tres señales en un periodo y dejamos que SymPy integre. La cuadrada y la triangular se definen a trozos.
t, T, Vm = sp.symbols("t T V_m", positive=True)
senoidal = Vm * sp.sin(2 * sp.pi * t / T)
cuadrada = sp.Piecewise((Vm, t < T / 2), (-Vm, True))
triangular = sp.Piecewise(
(4 * Vm * t / T, t < T / 4),
(2 * Vm - 4 * Vm * t / T, t < 3 * T / 4),
(4 * Vm * t / T - 4 * Vm, True),
)
def valor_medio(v):
return sp.simplify(sp.integrate(v, (t, 0, T)) / T)
def valor_eficaz(v):
return sp.simplify(sp.sqrt(sp.integrate(v**2, (t, 0, T)) / T))
for nombre, v in [("Senoidal", senoidal), ("Cuadrada", cuadrada), ("Triangular", triangular)]:
print(f"{nombre:<11} valor medio = {valor_medio(v)} valor eficaz = {valor_eficaz(v)}")Senoidal valor medio = 0 valor eficaz = sqrt(2)*V_m/2
Cuadrada valor medio = 0 valor eficaz = V_m
Triangular valor medio = 0 valor eficaz = sqrt(3)*V_m/3
Son las fórmulas clásicas: para la senoidal, para la cuadrada y para la triangular. El periodo no aparece en ningún resultado: el valor eficaz depende de la forma de la señal, no de su frecuencia.
2.2 El camino numérico¶
Una señal medida no tiene fórmula: es una lista de muestras separadas un intervalo . El área se aproxima sumando trozos. Las dos reglas más sencillas caben en una línea cada una:
Rectángulos: cada trozo es un rectángulo con la altura de la muestra de la izquierda.
Trapecios: cada trozo es un trapecio que une dos muestras consecutivas.
def suma_rectangulos(y, dt):
"""Integral aproximada con rectángulos: cada muestra por el intervalo."""
return np.sum(y[:-1]) * dt
def regla_trapecios(y, dt):
"""Integral aproximada con trapecios: media de dos muestras consecutivas por el intervalo."""
return np.sum((y[:-1] + y[1:]) / 2) * dt
# Comprobación con un área conocida: la integral de t^2 entre 0 y 3 es 9
x = np.linspace(0, 3, 31)
dx = x[1] - x[0]
print("Rectángulos:", suma_rectangulos(x**2, dx))
print("Trapecios: ", regla_trapecios(x**2, dx))
print("SciPy (trapecios):", integrate.trapezoid(x**2, x))
print("SciPy (Simpson): ", integrate.simpson(x**2, x=x))Rectángulos: 8.555
Trapecios: 9.005
SciPy (trapecios): 9.004999999999999
SciPy (Simpson): 9.0
Con treinta trozos, los rectángulos se quedan cortos (la función crece y se toma siempre la altura de la izquierda), los trapecios se pasan un poco y la regla de Simpson, que une las muestras con parábolas, acierta: la función es una parábola. Tu regla de los trapecios coincide con la de SciPy.
Ahora muestreamos las tres señales, con 200 muestras por periodo, y calculamos su valor eficaz.
VM = 1.0 # voltios, amplitud
F = 50.0 # hercios
PERIODO = 1 / F
formas = {
"Senoidal": lambda t: VM * np.sin(2 * np.pi * F * t),
"Cuadrada": lambda t: VM * signal.square(2 * np.pi * F * t),
"Triangular": lambda t: VM * signal.sawtooth(2 * np.pi * F * t + np.pi / 2, width=0.5),
}
exactos = {"Senoidal": VM / np.sqrt(2), "Cuadrada": VM, "Triangular": VM / np.sqrt(3)}
def eficaz(v, t):
"""Valor eficaz de una señal muestreada, con la regla de los trapecios."""
return np.sqrt(integrate.trapezoid(v**2, t) / (t[-1] - t[0]))
tiempo = np.linspace(0, PERIODO, 201)
fig, ax = plt.subplots()
for nombre, forma in formas.items():
v = forma(tiempo)
ax.plot(tiempo * 1e3, v, label=nombre)
print(f"{nombre:<11} numérico = {eficaz(v, tiempo):.5f} V exacto = {exactos[nombre]:.5f} V")
ax.set(xlabel="Tiempo (ms)", ylabel="Tensión (V)", title="Tres señales de la misma amplitud")
ax.legend()
plt.show()Senoidal numérico = 0.70711 V exacto = 0.70711 V
Cuadrada numérico = 1.00000 V exacto = 1.00000 V
Triangular numérico = 0.57741 V exacto = 0.57735 V

2.3 ¿Cuánto se equivoca una integral numérica?¶
El error depende de cuántos trozos se usen y de la regla. Para medirlo hace falta una integral cuyo valor exacto se conozca. Usamos una con sentido físico: la energía que disipa una resistencia mientras se descarga un condensador a través de ella.
Si el condensador parte de , su tensión cae como , con , y la potencia en la resistencia es . La energía disipada hasta es
prácticamente toda la que almacenaba el condensador, .
R = 1e3 # ohmios
C = 100e-6 # faradios
V0 = 10.0 # voltios
TAU = R * C
energia_exacta = 0.5 * C * V0**2 * (1 - np.exp(-10))
print(f"Energía exacta: {energia_exacta * 1e3:.6f} mJ")
trozos = 2 ** np.arange(2, 17) # de 4 a 65 536 trozos
errores = {"Rectángulos": [], "Trapecios": [], "Simpson": []}
for n in trozos:
tiempo = np.linspace(0, 5 * TAU, n + 1)
dt = tiempo[1] - tiempo[0]
potencia = V0**2 / R * np.exp(-2 * tiempo / TAU)
errores["Rectángulos"].append(abs(suma_rectangulos(potencia, dt) - energia_exacta))
errores["Trapecios"].append(abs(regla_trapecios(potencia, dt) - energia_exacta))
errores["Simpson"].append(abs(integrate.simpson(potencia, x=tiempo) - energia_exacta))
fig, ax = plt.subplots()
for nombre, error in errores.items():
ax.loglog(trozos, np.array(error) / energia_exacta, "o-", markersize=4, label=nombre)
ax.set(xlabel="Número de trozos", ylabel="Error relativo", title="Error de discretización")
ax.legend()
plt.show()Energía exacta: 4.999773 mJ

En escala logarítmica las tres curvas son rectas, y su pendiente es lo que distingue a cada regla. Cada vez que se duplica el número de trozos, el error de los rectángulos se divide por 2, el de los trapecios por 4 y el de Simpson por 16. Con mil trozos, los rectángulos dan apenas dos cifras correctas; los trapecios, cinco, y Simpson, diez.
Hay un caso especial que conviene conocer. Al medir el valor eficaz de una señal periódica, el error no lo decide solo el número de muestras, sino cuánto dura la ventana de medida. Medimos la senoidal de 50 Hz con ventanas de distinta duración.
duraciones = np.linspace(0.5, 10, 400) * PERIODO
medidas = []
for duracion in duraciones:
tiempo = np.linspace(0, duracion, 2001)
medidas.append(eficaz(formas["Senoidal"](tiempo), tiempo))
fig, ax = plt.subplots()
ax.plot(duraciones / PERIODO, medidas)
ax.axhline(VM / np.sqrt(2), color="k", linestyle="--", linewidth=1, label="$V_m/\\sqrt{2}$")
ax.set(
xlabel="Duración de la ventana (periodos)",
ylabel="Valor eficaz medido (V)",
title="El valor eficaz depende de la ventana de medida",
)
ax.legend()
plt.show()
La medida solo es exacta para ciertas duraciones de la ventana (aquí, los múltiplos de un cuarto de periodo); en las demás, el trozo de ciclo que sobra desvía el resultado. El error se reduce al alargar la ventana, porque el trozo que sobra pesa cada vez menos. Por eso un polímetro tarda un momento en estabilizar una lectura de alterna.
2.4 Por qué el valor eficaz: potencia¶
La potencia instantánea en una resistencia es . Su valor medio es
Esa es la razón de ser del valor eficaz: es la tensión continua que calentaría igual la resistencia. Lo comprobamos con la tensión de la red eléctrica, de 325 V de amplitud, sobre una resistencia de 100 Ω.
V_RED = 325.0 # voltios de amplitud
R_CARGA = 100.0 # ohmios
tiempo = np.linspace(0, 2 * PERIODO, 801)
v = V_RED * np.sin(2 * np.pi * F * tiempo)
p = v**2 / R_CARGA
potencia_media = integrate.trapezoid(p, tiempo) / (tiempo[-1] - tiempo[0])
v_eficaz = eficaz(v, tiempo)
fig, ax = plt.subplots()
ax.plot(tiempo * 1e3, p, label="Potencia instantánea")
ax.axhline(potencia_media, color="k", linestyle="--", linewidth=1, label="Potencia media")
ax.set(xlabel="Tiempo (ms)", ylabel="Potencia (W)", title="Potencia en una resistencia")
ax.legend()
plt.show()
print(f"Valor eficaz de la tensión: {v_eficaz:.1f} V")
print(f"Potencia media (integrando p): {potencia_media:.1f} W")
print(f"V_ef² / R: {v_eficaz**2 / R_CARGA:.1f} W")
Valor eficaz de la tensión: 229.8 V
Potencia media (integrando p): 528.1 W
V_ef² / R: 528.1 W
Los «230 V» de un enchufe son un valor eficaz. La potencia oscila al doble de la frecuencia de la red y nunca es negativa; su valor medio es exactamente .
2.5 Hilo biomédico: el valor eficaz de un EMG¶
El electromiograma (EMG) de superficie es la suma de los potenciales de muchas fibras musculares que se activan sin sincronía. El resultado se parece a un ruido cuya amplitud crece con la fuerza de la contracción. Su valor medio es siempre nulo, así que no sirve; su valor eficaz, en cambio, mide cuánta señal hay.
La señal siguiente es sintética: tres contracciones de distinta intensidad. La función que la genera devuelve también la activación que se le impuso, para poder comparar.
from circuitmath.signals import emg
t_emg, v_emg, activacion = emg()
fs = 1 / (t_emg[1] - t_emg[0])
print(f"Frecuencia de muestreo: {fs:.0f} Hz, duración: {t_emg[-1]:.1f} s")
print(f"Valor medio de toda la señal: {v_emg.mean() * 1e6:8.2f} µV")
print(f"Valor eficaz de toda la señal: {eficaz(v_emg, t_emg) * 1e6:8.2f} µV")Frecuencia de muestreo: 1000 Hz, duración: 6.0 s
Valor medio de toda la señal: 0.02 µV
Valor eficaz de toda la señal: 471.27 µV
Un único valor eficaz para los seis segundos tampoco dice mucho: mezcla el reposo con las contracciones. Lo que interesa es cómo cambia con el tiempo. Para eso se calcula en una ventana móvil: en cada instante, el valor eficaz de las muestras de su alrededor.
def eficaz_movil(v, fs, ventana):
"""Valor eficaz en una ventana deslizante de la duración indicada (en segundos)."""
n = int(ventana * fs)
return np.sqrt(np.convolve(v**2, np.ones(n) / n, mode="same"))
fig, (ax_senal, ax_eficaz) = plt.subplots(2, 1, sharex=True, figsize=(6.4, 5.6))
ax_senal.plot(t_emg, v_emg * 1e3, linewidth=0.5)
ax_senal.set(ylabel="EMG (mV)", title="EMG sintético y su valor eficaz")
for ventana in (0.02, 0.25):
etiqueta = f"Ventana de {ventana * 1e3:.0f} ms"
ax_eficaz.plot(t_emg, eficaz_movil(v_emg, fs, ventana) * 1e3, label=etiqueta)
ax_eficaz.plot(t_emg, activacion * 1e3, "k--", linewidth=1, label="Activación impuesta")
ax_eficaz.set(xlabel="Tiempo (s)", ylabel="Valor eficaz (mV)")
ax_eficaz.legend(loc="upper left", fontsize="small")
plt.show()
El valor eficaz en ventana móvil recupera la activación del músculo a partir de una señal que a simple vista es ruido. La duración de la ventana es un compromiso, el mismo de la figura del apartado 2.3: una ventana corta responde rápido pero da una medida inquieta; una larga da una medida estable pero redondea los comienzos y los finales de cada contracción.
3. Explica¶
La señal cuadrada tiene un valor eficaz igual a su amplitud y la triangular, el menor de las tres. Explícalo sin fórmulas, pensando en cuánto tiempo pasa cada señal cerca de su valor máximo.
En la figura del error de discretización, ¿qué pendiente tiene cada recta? Si necesitas una energía con un error relativo de 10-6, ¿cuántos trozos hacen falta, aproximadamente, con cada regla?
La curva de Simpson se detiene en torno a 10-16 y no baja más por muchos trozos que se añadan. ¿Qué error, que no es de discretización, marca ese límite? (Recuerda el cuaderno B5.)
Una señal es la suma de una componente continua de 3 V y una senoidal de 4 V de valor eficaz. ¿Su valor eficaz es 7 V? Calcúlalo numéricamente y explica el resultado.
Para el EMG, ¿qué ventana elegirías para controlar una prótesis que debe reaccionar deprisa? ¿Y para comparar la activación media de dos ejercicios de rehabilitación?
4. Ejercicios¶
Básico. Un rectificador de media onda deja pasar solo los semiciclos positivos de una senoidal de amplitud . Calcula su valor medio y su valor eficaz con SymPy (deben salir y ) y compruébalos numéricamente. Repite para el rectificador de onda completa.
Aplicación. Una señal PWM vale durante una fracción del periodo (el ciclo de trabajo) y cero el resto.
Calcula numéricamente su valor medio y su valor eficaz para entre 0,05 y 0,95 y represéntalos.
Comprueba que siguen las leyes y .
Un LED de fototerapia se regula con PWM. Si la potencia luminosa es proporcional a la corriente media, ¿qué ciclo de trabajo da la mitad de luz? ¿Y si lo que interesa es la mitad de potencia disipada en una resistencia en serie?
Reto biomédico. Un estimulador neuromuscular entrega pulsos de corriente bifásicos: una fase positiva de 20 mA durante 200 µs seguida de una fase negativa de −5 mA durante 800 µs. El tejido se modela como una resistencia de 500 Ω.
Genera el pulso muestreado y calcula, integrando, la carga de cada fase y la carga neta. ¿Por qué interesa que la carga neta sea nula?
Calcula la energía que se disipa en el tejido en cada pulso y la potencia media si se repite 50 veces por segundo.
Si la segunda fase durase 700 µs por un error de temporización, ¿cuánta carga neta se acumularía en un minuto de estimulación?
Resumen¶
Valor medio, valor eficaz y energía son integrales; el ordenador las calcula con una fórmula (SymPy) o con una suma (NumPy, SciPy).
El error de una integral numérica cae con el número de trozos a un ritmo que depende de la regla: orden 1 los rectángulos, 2 los trapecios, 4 Simpson.
El valor eficaz es la tensión continua que entrega la misma potencia: . Depende de la forma de la señal, no de su frecuencia.
Medido en una ventana móvil, el valor eficaz convierte una señal de EMG en una medida de la activación muscular.
→ Siguiente: C2 · Condensadores e inductores: derivar e integrar
- Miguel-Medina, T. (2026). Electrónica en Ingeniería Biomédica — Volumen I. Autopublicación. 10.5281/zenodo.22913382