35.1 Ver una oscilación no alcanza
Un programa puede producir una curva suave y, aun así, tener un período incorrecto, ganar energía lentamente o depender demasiado del paso temporal.
Verificar exige formular preguntas medibles: ¿coincide con un caso conocido?, ¿el error disminuye al reducir Δt?, ¿respeta los balances físicos?, ¿permanece estable durante el intervalo de interés?
35.2 Verificación y validación
- Verificación: comprobar que el algoritmo resuelve correctamente las ecuaciones elegidas.
- Validación: comprobar que esas ecuaciones describen adecuadamente el sistema real.
Una integración exacta de un modelo inadecuado está verificada, pero no validada. Una ecuación apropiada programada con signos incorrectos puede estar validada conceptualmente, pero no verificada.
35.3 Construir una referencia
El mejor primer caso de prueba es uno con solución analítica. Para un sistema masa-resorte ideal:
x(t) = x₀ cos(ω₀t) + (v₀/ω₀)sen(ω₀t)
v(t) = −x₀ω₀ sen(ω₀t) + v₀ cos(ω₀t)
La solución permite calcular el error en cada instante, no sólo comparar una imagen.
35.4 Una prueba de referencia automática
function casiIguales(actual, esperado, tolerancia) {
return Math.abs(actual - esperado) <= tolerancia;
}
const masaKg = 1;
const kNpm = 25;
const omega0 = Math.sqrt(kNpm / masaKg);
const periodo = 2 * Math.PI / omega0;
const posicionInicialM = 0.1;
const posicionTrasUnPeriodoM = posicionInicialM * Math.cos(omega0 * periodo);
console.log({
posicionTrasUnPeriodoM,
pruebaSuperada: casiIguales(posicionTrasUnPeriodoM, posicionInicialM, 1e-12)
});Esta prueba comprueba la fórmula analítica. Para probar el integrador reemplazamos el valor calculado por el estado numérico obtenido tras un período.
35.5 Casos simples que revelan errores
x = 0,v = 0y sin fuerza externa: el estado debe permanecer igual.k = 0,b = 0: la velocidad debe ser constante.- Estados opuestos
(−x, −v): deben evolucionar con signos opuestos en un modelo simétrico. - Fuerza externa nula: el simulador forzado debe coincidir con el libre.
Estos casos no reemplazan una prueba completa, pero localizan signos, actualizaciones y condiciones iniciales incorrectas.
35.6 Verificar el período
En un oscilador ideal esperamos:
Podemos medir el tiempo entre máximos consecutivos del mismo signo o entre cruces del equilibrio con el mismo sentido. Comparar cruces ascendentes con descendentes mediría medio período.
35.7 Interpolar un cruce
Si xi < 0 y xi+1 ≥ 0, el cruce ocurrió dentro del paso. Una interpolación lineal estima:
function crucesAscendentes(muestras) {
const tiempos = [];
for (let i = 0; i < muestras.length - 1; i += 1) {
const a = muestras[i], b = muestras[i + 1];
if (a.x < 0 && b.x >= 0) {
const fraccion = -a.x / (b.x - a.x);
tiempos.push(a.t + fraccion * (b.t - a.t));
}
}
return tiempos;
}
const datos = [
{ t: 0, x: 0.2 }, { t: 1, x: -0.1 }, { t: 2, x: 0.1 },
{ t: 3, x: -0.2 }, { t: 4, x: 0.2 }
];
console.log(crucesAscendentes(datos));35.8 Promediar varios períodos
Si detectamos cruces t₀, t₁, …, tN, una estimación robusta es:
Usar extremos alejados equivale a promediar los N períodos intermedios y reduce la sensibilidad a la resolución temporal de un solo evento.
35.9 Energía como invariante
Para un masa-resorte sin amortiguamiento ni fuerza externa:
Para un péndulo ideal:
La energía es una comprobación global del estado, pero no detecta todo: dos estados con fase distinta pueden tener exactamente la misma energía.
35.10 Cuando la energía no debe conservarse
Con rozamiento viscoso, exigir energía constante sería una prueba equivocada:
Con fuerza externa:
La prueba correcta compara el cambio de energía con el trabajo acumulado de las fuerzas no conservativas.
35.11 Error de balance energético
Entre el inicio y el final definimos:
Con Wviscoso = ∫−bv²dt. En un cálculo discreto, aproximamos ambas integrales y esperamos que el residuo disminuya al refinar Δt.
35.12 Error absoluto, relativo y normalizado
error relativo = |xnum − xref|/|xref|
El error relativo explota cuando la referencia cruza cero. Para una oscilación conviene normalizar por una escala característica A:
A puede ser la amplitud inicial o √(x₀² + (v₀/ω₀)²).
35.13 Error máximo y error RMS
ERMS = √[(1/N)Σei²]
El máximo muestra el peor punto muestreado. RMS resume el error típico y penaliza más los errores grandes. Deben compararse en los mismos instantes.
function metricasError(calculados, referencias) {
if (calculados.length !== referencias.length || calculados.length === 0) {
throw new RangeError("Las series deben tener igual longitud no nula");
}
let maximo = 0, sumaCuadrados = 0;
for (let i = 0; i < calculados.length; i += 1) {
const error = calculados[i] - referencias[i];
maximo = Math.max(maximo, Math.abs(error));
sumaCuadrados += error ** 2;
}
return { maximo, rms: Math.sqrt(sumaCuadrados / calculados.length) };
}
console.log(metricasError([1, 0.1, -0.9], [1, 0, -1]));35.14 Error de amplitud y error de fase
Una curva puede conservar casi bien la amplitud pero adelantar cada ciclo. En evoluciones largas, un pequeño error de período se acumula como error de fase.
Por eso conviene informar por separado:
- variación de máximos o de energía, relacionada con amplitud;
- diferencia en tiempos de cruce o período, relacionada con fase.
35.15 Error local y error global
El error local pertenece a un solo paso suponiendo exacto el estado de partida. El error global es la diferencia acumulada después de muchos pasos.
Euler tiene error global de primer orden: al reducir Δt a la mitad, esperamos aproximadamente la mitad del error en el régimen asintótico. RK4 tiene orden global cuatro: esperamos alrededor de 1/16.
35.16 Estudio de refinamiento
- Elegí parámetros, estado inicial y tiempo final fijos.
- Simulá con Δt, Δt/2 y Δt/4.
- Calculá la misma métrica contra una referencia.
- Comprobá que el error disminuya regularmente.
- Repetí hasta que redondeo, tolerancias u otra fuente dominen.
Cambiar simultáneamente duración, muestreo o condiciones iniciales invalida la comparación.
35.17 Orden observado
Si el error cumple aproximadamente E(h) = Chp:
function ordenObservado(errorPaso, errorMedioPaso) {
if (errorPaso <= 0 || errorMedioPaso <= 0) return null;
return Math.log2(errorPaso / errorMedioPaso);
}
console.log({
ejemploEuler: ordenObservado(0.02, 0.01),
ejemploRK4: ordenObservado(0.016, 0.001)
});Obtener 1 y 4 en estos datos artificiales ilustra la interpretación. En una prueba real los valores sólo se aproximan al orden teórico.
35.18 Estabilidad no es exactitud
Un método es estable para cierto problema y paso si los errores no crecen de manera descontrolada. Una solución puede permanecer acotada y, sin embargo, tener un período o amplitud poco precisos.
Euler explícito aplicado al oscilador ideal gana energía para cualquier paso positivo. Euler semimplícito mantiene una respuesta acotada sólo dentro de su región estable; para el oscilador ideal requiere ω₀Δt < 2.
35.19 Muestreo y aliasing
Guardar o dibujar pocos puntos puede hacer que una oscilación rápida parezca más lenta. Ese error de muestreo es distinto del error del integrador.
La frecuencia de muestreo debe superar ampliamente la de la señal para medir picos y cruces con precisión. Conservar muchos pasos internos y pocas muestras visuales es válido si el análisis usa los datos adecuados.
35.20 Tolerancias y punto flotante
No esperamos igualdad exacta después de miles de operaciones. Una comparación útil combina tolerancia absoluta y relativa:
La tolerancia debe derivarse de la escala y del objetivo. Elegirla después de ver el error sólo para aprobar una prueba elimina su valor.
35.21 Pruebas de propiedades y regresión
Además de casos con respuesta exacta podemos comprobar propiedades: energía no negativa, simetría, continuidad, disipación esperada y finitud del estado.
Una prueba de regresión conserva un resultado previamente aceptado para detectar cambios inesperados. Debe almacenar también parámetros, versión del algoritmo y tolerancia; un número aislado carece de contexto.
35.22 Laboratorio de verificación
El laboratorio compara un masa-resorte ideal con su solución analítica. La gráfica superior muestra posición; la inferior, energía respecto de su valor inicial.
Las métricas se calculan en todos los pasos de integración.
35.23 Cómo interpretar el laboratorio
- Dividí Δt por dos y comprobá si los errores disminuyen.
- Euler explícito muestra crecimiento energético, aunque al principio la posición parezca razonable.
- Euler semimplícito mantiene la energía en un intervalo acotado, pero acumula error de fase.
- RK4 obtiene errores mucho menores con el mismo paso en este problema suave.
- Aumentá la duración: un pequeño error de período se vuelve una diferencia grande de posición.
35.24 Informe reproducible
Un resultado de verificación debería registrar:
- ecuación y versión del código;
- parámetros y condiciones iniciales;
- integrador, Δt, duración y frecuencia de muestreo;
- referencia utilizada;
- métricas y tolerancias;
- entorno de ejecución si influye en el resultado.
Esto permite repetir el experimento y distinguir una mejora real de un cambio accidental de configuración.
35.25 Errores frecuentes y ejercicio
- Aprobar por apariencia: una curva suave puede ser físicamente incorrecta.
- Usar sólo energía: no detecta por sí sola errores de fase.
- Calcular error relativo cerca de cero: el cociente pierde significado.
- Comparar diferentes tiempos: las series deben alinearse o interpolarse.
- Confundir estabilidad con precisión: una solución acotada puede ser inexacta.
- Refinar también otros parámetros: ya no se aísla el efecto de Δt.
- Elegir tolerancias después del resultado: la prueba deja de ser independiente.
Una simulación produce errores máximos de posición 8,0×10⁻³ m, 4,1×10⁻³ m y 2,05×10⁻³ m para pasos h, h/2 y h/4. Estimá el orden entre cada par y decidí si es compatible con un método de primer orden.
Ver solución y explicación
p₂ = log₂(0,0041/0,00205) = 1,000
Ambos valores están próximos a 1, por lo que los datos son compatibles con convergencia global de primer orden.
const erroresM = [8e-3, 4.1e-3, 2.05e-3];
const ordenes = [];
for (let i = 0; i < erroresM.length - 1; i += 1) {
ordenes.push(Math.log2(erroresM[i] / erroresM[i + 1]));
}
const compatibleConOrdenUno = ordenes.every(p => Math.abs(p - 1) < 0.1);
console.log({ ordenes, compatibleConOrdenUno });35.26 Ideas para recordar
- Verificar el algoritmo y validar el modelo son tareas diferentes.
- Los casos analíticos proporcionan referencias cuantitativas.
- El período mide fase; la energía ayuda a medir amplitud y balance.
- Una fuerza disipativa exige balance, no conservación de energía mecánica.
- Los errores máximo y RMS describen aspectos complementarios.
- Refinar Δt permite comprobar convergencia y estimar el orden observado.
- Estabilidad, precisión y muestreo son problemas distintos.
- Una verificación útil debe ser automática, reproducible y asociada a tolerancias justificadas.