Unos minutos después de un temblor, el Servicio Sismológico Nacional ya publica una cifra: magnitud 5.8, 7.1… Detrás de ese número no hay una sola medida, sino un cálculo. Se parte de lo que registran los sismógrafos, se corrige por la distancia y se combina lo de muchas estaciones. Vemos qué fórmulas se usan, por qué hay varias escalas y cómo es el algoritmo, con un programa en Python que lo hace paso a paso.
La primera escala la publicó Charles Richter en 1935, en el Instituto Tecnológico de California. Quería ordenar por tamaño los sismos del sur de California, y para eso eligió algo que se pudiera medir igual siempre: la amplitud máxima que dejaba cada sismo en un sismógrafo concreto, el Wood-Anderson. Como esa amplitud varía de un sismo pequeño a uno grande en un factor de millones, usó su logaritmo. De ahí viene lo que todavía se dice hoy: un grado más de magnitud es una sacudida diez veces mayor.
La escala de Richter funcionaba bien para sismos cercanos y moderados, pero se quedaba corta con los grandes: a partir de cierto tamaño, la amplitud de las ondas deja de crecer aunque el sismo siga creciendo. Por eso hoy los sismos importantes se miden con la magnitud de momento (Mw), que no parte de la amplitud de las ondas sino de la física de la ruptura: qué superficie de falla se rompió y cuánto se deslizó. Las cifras que da son comparables con las de Richter, pero no se saturan.

Claves para calcular la magnitud
1. Lo que mide el sismógrafo
Un sismógrafo registra cómo se mueve el suelo a lo largo del tiempo. De un sismo llegan primero las ondas P, de compresión, que son las más rápidas, y después las ondas S, de cizalla, más lentas y casi siempre más fuertes. Del registro salen dos datos: la amplitud máxima, que dice cuánto se movió el suelo, y el tiempo entre P y S, que dice a qué distancia estaba el sismo.
2. La distancia sale del retraso entre ondas
Las dos ondas salen del mismo punto a la vez, pero la S viaja más despacio. Cuanto más lejos esté el sismo, más tiempo le saca la P. Con las velocidades de las dos ondas se despeja la distancia:
Una sola estación sabe a qué distancia está el sismo, pero no en qué dirección: el sismo puede estar en cualquier punto de un círculo a su alrededor. Con tres estaciones, los tres círculos se cortan en un punto, el epicentro. En la práctica se usan decenas de estaciones y se resuelve con el método de Geiger (1910): se parte de una posición aproximada y se corrige por mínimos cuadrados hasta que los tiempos calculados coinciden con los observados, lo que da también la profundidad.
3. La fórmula de Richter
Con la amplitud y la distancia ya se puede calcular la magnitud local (ML):
El primer término es la amplitud medida, en escala logarítmica; el segundo resta lo que se esperaría a esa distancia. Richter tenía A0 en una tabla. Hoy se usan fórmulas calibradas para cada región; esta es la más conocida:
Comprobación rápida: con r = 100 km y A = 1 mm, los dos términos de distancia valen cero y ML = 3.0, la definición de Richter. Los sismógrafos modernos no son Wood-Anderson, así que su registro se transforma antes, por cálculo, en el que habría dado uno de ellos.
4. Muchas estaciones, una sola cifra
Cada estación calcula su propia magnitud, y nunca salen iguales: el terreno bajo cada una amplifica o atenúa las ondas, y la ruptura no radia lo mismo en todas las direcciones. Por eso la cifra oficial es una combinación, normalmente la mediana de todas las estaciones, que no se deja arrastrar por una lectura disparatada.
5. El algoritmo, en Python
Este programa reproduce los pasos con un sismograma sintético. La detección usa el método STA/LTA, el habitual en las redes sísmicas: compara la energía media de una ventana corta (STA, medio segundo) con la de una larga (LTA, diez segundos). Mientras solo hay ruido, el cociente ronda 1; cuando llega una onda, se dispara.
import numpy as np
FS = 100 # muestras por segundo
rng = np.random.default_rng(7)
def ondicula(t, t0, frec, amp, decaimiento):
"""Un tren de ondas que empieza en t0 y se apaga poco a poco."""
dt = t - t0
return np.where(dt >= 0, amp * np.exp(-dt / decaimiento) * np.sin(2 * np.pi * frec * dt), 0.0)
def sintetico(t_p, t_s, amp_s, duracion=60):
t = np.arange(0, duracion, 1 / FS)
ruido = rng.normal(0, 0.004, t.size)
p = ondicula(t, t_p, 6.0, amp_s * 0.18, 2.5)
s = ondicula(t, t_s, 2.5, amp_s, 4.0)
return t, ruido + p + s
def sta_lta(x, corta=0.5, larga=10.0):
"""Cociente entre la energía media de la ventana corta y la de la larga."""
e = x ** 2
nc, nl = int(corta * FS), int(larga * FS)
acum = np.concatenate([[0.0], np.cumsum(e)])
sta = (acum[nc:] - acum[:-nc]) / nc
lta = (acum[nl:] - acum[:-nl]) / nl
n = min(sta.size - (nl - nc), lta.size)
return np.concatenate([np.zeros(nl), sta[nl - nc:nl - nc + n] / (lta[:n] + 1e-12)])
def detectar(t, x, umbral=4.0):
"""Llegada P: primer cruce del umbral. Llegada S: el siguiente cruce,
después de que el cociente haya vuelto a bajar."""
r = sta_lta(x)
i_p = int(np.argmax(r > umbral))
bajo = i_p + int(np.argmax(r[i_p:] < 1.5))
i_s = bajo + int(np.argmax(r[bajo:] > 2.0))
return t[i_p], t[i_s]Con las llegadas detectadas, se calcula la distancia, la magnitud de cada estación y la de la red:
import math
import numpy as np
from sismograma import sintetico, detectar
VP, VS = 6.0, 3.5 # velocidades típicas en la corteza, km/s
def distancia(ts_menos_tp):
"""Las dos ondas salen juntas; la S llega tarde. d = Δt · Vp·Vs / (Vp − Vs)."""
return ts_menos_tp * VP * VS / (VP - VS)
def magnitud_local(amplitud_mm, r_km):
"""Hutton y Boore (1987), sur de California. Amplitud en mm de un
sismógrafo Wood-Anderson; r = distancia hipocentral en km."""
return math.log10(amplitud_mm) + 1.110 * math.log10(r_km / 100) + 0.00189 * (r_km - 100) + 3.0
# --- una estación, paso a paso
t, x = sintetico(t_p=10.0, t_s=17.0, amp_s=2.0)
tp, ts = detectar(t, x)
d = distancia(ts - tp)
a = np.abs(x).max()
print(f"llegada P: {tp:.2f} s llegada S: {ts:.2f} s S-P: {ts - tp:.2f} s")
print(f"distancia: {d:.1f} km amplitud máxima: {a:.2f} mm")
print(f"ML = {magnitud_local(a, d):.2f}")
print()
# --- la red: cada estación da su magnitud y se toma la mediana
estaciones = [("ACAP", 4.5, 7.80), ("CUER", 9.0, 2.85), ("PUEB", 14.0, 1.60),
("OAXA", 21.0, 0.55), ("TLAX", 30.0, 0.39)]
mags = []
for nombre, sp, amp in estaciones:
t, x = sintetico(t_p=10.0, t_s=10.0 + sp, amp_s=amp)
tp, ts = detectar(t, x)
d = distancia(ts - tp)
m = magnitud_local(np.abs(x).max(), d)
mags.append(m)
print(f"{nombre} S-P {ts - tp:5.2f} s d {d:6.1f} km A {np.abs(x).max():5.2f} mm ML {m:.2f}")
print(f"ML de la red (mediana): {np.median(mags):.2f} (media: {np.mean(mags):.2f})")python magnitud.pyllegada P: 10.02 s llegada S: 17.04 s S-P: 7.02 s distancia: 59.0 km amplitud máxima: 1.94 mm ML = 2.96 ACAP S-P 4.52 s d 38.0 km A 7.48 mm ML 3.29 CUER S-P 9.02 s d 75.8 km A 2.77 mm ML 3.26 PUEB S-P 14.00 s d 117.6 km A 1.56 mm ML 3.31 OAXA S-P 20.99 s d 176.3 km A 0.54 mm ML 3.15 TLAX S-P 29.98 s d 251.8 km A 0.38 mm ML 3.31 ML de la red (mediana): 3.29 (media: 3.26)
Las cinco estaciones están a distancias muy distintas y registran amplitudes muy distintas, de 7.48 mm a 0.38 mm, pero una vez corregida la distancia todas coinciden en una magnitud cercana a 3.3. Esa es la idea de toda la fórmula. Los códigos de estación son inventados.
6. Por qué hay varias escalas
La fórmula de Richter sirve para sismos cercanos. Para sismos lejanos se inventaron otras con la misma lógica, amplitud más corrección por distancia, pero con otras ondas: la de ondas superficiales (MS) y la de ondas de cuerpo (mb).
Todas tienen el mismo problema: cada una mide ondas de un periodo concreto, y a partir de cierto tamaño el sismo sigue creciendo pero esas ondas ya no. Es la saturación. Según el USGS:
| Escala | Qué mide | Para qué tamaños | Se satura hacia |
|---|---|---|---|
| ML (local, Richter) | Amplitud máxima, hasta 600 km | De 2 a 6.5; fiable sobre todo por debajo de 4 | — |
| mb (ondas de cuerpo) | Primeras ondas P, de periodo 1 s | De 4 a 6.5 | 6.5 |
| MS (ondas superficiales) | Ondas Rayleigh de unos 20 s | De 5 a 8.5 | 8.3 |
| Mw (momento) | El tamaño físico de la ruptura | Cualquiera; la del USGS, desde 5 | No se satura |
7. La magnitud de momento
En lugar de medir una onda, Mw estima el momento sísmico, M0, que depende del tamaño de la ruptura:
Y de ahí, la magnitud:
Los sismólogos no miden el área ni el deslizamiento con una regla: obtienen M0 ajustando las ondas de periodo muy largo registradas en todo el mundo (la llamada inversión del tensor de momento; para sismos grandes, el USGS usa la fase W). Pero la fórmula se puede recorrer al revés para ver qué tamaño de falla corresponde a cada magnitud:
import math
def momento_sismico(rigidez_pa, largo_km, ancho_km, desliz_m):
"""M0 = μ · A · D, en newton·metro."""
return rigidez_pa * (largo_km * 1e3) * (ancho_km * 1e3) * desliz_m
def magnitud_momento(m0):
"""Mw = 2/3 · (log10 M0 − 9.1), con M0 en N·m (estándar IASPEI)."""
return 2 / 3 * (math.log10(m0) - 9.1)
MU = 3e10 # rigidez típica de la corteza, Pa
for largo, ancho, desliz in [(1, 1, 0.02), (10, 5, 0.5), (50, 20, 2.0), (400, 150, 10.0)]:
m0 = momento_sismico(MU, largo, ancho, desliz)
print(f"falla {largo:>3} x {ancho:>3} km, desliz {desliz:>5} m -> M0 = {m0:.2e} N·m -> Mw {magnitud_momento(m0):.1f}")
print()
def energia_j(m):
"""Gutenberg y Richter: log10 E = 1.5 M + 4.8, con E en julios."""
return 10 ** (1.5 * m + 4.8)
for m in [4, 5, 6, 7, 8]:
print(f"M{m}: {energia_j(m):.1e} J ({energia_j(m) / energia_j(4):,.0f} veces la de un M4)")
print(f"\nun grado más = {10 ** 1.5:.1f} veces la energía y 10 veces la amplitud")python momento.pyfalla 1 x 1 km, desliz 0.02 m -> M0 = 6.00e+14 N·m -> Mw 3.8 falla 10 x 5 km, desliz 0.5 m -> M0 = 7.50e+17 N·m -> Mw 5.9 falla 50 x 20 km, desliz 2.0 m -> M0 = 6.00e+19 N·m -> Mw 7.1 falla 400 x 150 km, desliz 10.0 m -> M0 = 1.80e+22 N·m -> Mw 8.8 M4: 6.3e+10 J (1 veces la de un M4) M5: 2.0e+12 J (32 veces la de un M4) M6: 6.3e+13 J (1,000 veces la de un M4) M7: 2.0e+15 J (31,623 veces la de un M4) M8: 6.3e+16 J (1,000,000 veces la de un M4) un grado más = 31.6 veces la energía y 10 veces la amplitud
Una falla de 50 × 20 km que se desliza 2 m da Mw 7.1, la misma magnitud que el sismo del 19 de septiembre de 2017 en Puebla y Morelos. Para llegar a 8.8 hace falta una ruptura de cientos de kilómetros, que solo se da en las grandes zonas de subducción, como la costa del Pacífico mexicano.
La energía usa la relación de Gutenberg y Richter:
Cada grado multiplica la energía por 101.5, unas 31.6 veces, y dos grados, por 1,000. Por eso un sismo de magnitud 7 no es «un poco más» que uno de 6: libera unas 32 veces más energía.
Por qué importa
La magnitud es una medida del sismo en su origen, y no depende de dónde estés. Lo que se siente en cada lugar es la intensidad, que se mide con otra escala, la de Mercalli Modificada, y depende de la distancia, la profundidad y el terreno. Un sismo de magnitud 7 lejano y profundo puede sentirse menos que uno de 6 justo debajo de una ciudad. En el Valle de México, el suelo blando del antiguo lago amplifica las ondas, y por eso sismos con epicentro a cientos de kilómetros, como el de 1985 (M8.1), causaron tanto daño en la capital.
Entender la escala logarítmica también ayuda a leer las noticias. La ley de Gutenberg-Richter dice que, en una región, los sismos de cada grado son unas diez veces más frecuentes que los del grado siguiente:
Por cada sismo de magnitud 7 hay unos diez de magnitud 6 y unos cien de 5. Que haya muchos sismos pequeños no «descarga» la falla lo suficiente como para evitar los grandes: harían falta unos mil de magnitud 5 para liberar la energía de uno de 7.
Por eso la cifra que se publica minutos después del temblor puede corregirse en las horas siguientes: la primera estimación sale de las estaciones cercanas y de las escalas rápidas, y la magnitud de momento definitiva, de ajustar las ondas registradas en todo el mundo. Las dos cifras salen del mismo procedimiento que hemos visto: medir, corregir por la distancia y combinar las estaciones.
Fórmulas: Richter (1935); Hutton y Boore (1987), Bulletin of the Seismological Society of America; Kanamori (1977) y Hanks y Kanamori (1979); recomendaciones de la IASPEI sobre magnitudes (2013). El código se ejecutó con Python 3.14 y NumPy 2.5 en un contenedor limpio; las salidas están copiadas de esa ejecución. Foto de portada: sismógrafo histórico del Instituto de Geofísica de la Academia Checa de Ciencias, por Petr Brož, CC BY-SA 4.0, invertida y recortada.
Fuente: USGS, «Magnitude Types»
