34.1 Del modelo analítico al numérico
Las soluciones sinusoidales permiten comprender muchos fenómenos, pero no todas las condiciones iniciales y fronteras tienen una fórmula sencilla.
Una simulación numérica reemplaza el dominio continuo por una cantidad finita de puntos y avanza la solución en pequeños pasos de tiempo.
34.2 Ecuación de onda unidimensional
Para una velocidad constante c, la ecuación ideal es:
∂²u/∂t² = c² ∂²u/∂x²
u(x,t) representa desplazamiento, presión u otra perturbación compatible con el modelo. La segunda derivada espacial determina la aceleración local.
34.3 Dominio espacial
Dividimos una longitud L en N puntos, incluidos los extremos. La separación uniforme es:
Δx = L/(N − 1)
El punto i corresponde a xᵢ = iΔx, con i desde 0 hasta N − 1.
34.4 Niveles temporales
La solución se almacena en instantes separados por Δt. Usaremos tres arreglos:
previous[i]: valor en el paso n − 1.current[i]: valor en el paso n.next[i]: valor que calcularemos para n + 1.
34.5 Segunda derivada espacial
En un punto interior, la diferencia central aproxima la curvatura:
∂²u/∂x² ≈ (ui+1 − 2uᵢ + ui−1)/Δx²
Una región recta tiene curvatura cercana a cero; un máximo local tiene curvatura negativa.
34.6 Segunda derivada temporal
También usamos una diferencia central en el tiempo:
∂²u/∂t² ≈ (uᵢn+1 − 2uᵢn + uᵢn−1)/Δt²
Esta expresión conecta el futuro desconocido con dos estados ya disponibles.
34.7 Regla de actualización
Sustituyendo ambas aproximaciones y despejando el paso siguiente:
uᵢn+1 = 2uᵢn − uᵢn−1 + C²(ui+1n − 2uᵢn + ui−1n)
C es el número de Courant.
34.8 Número de Courant
C = cΔt/Δx
Durante un paso temporal, la onda física avanza cΔt. C compara esa distancia con el espaciado de la grilla.
34.9 Condición de estabilidad
Para este esquema explícito unidimensional, la condición fundamental es:
C ≤ 1
Si C supera 1, pequeños errores crecen rápidamente y la solución suele explotar. La inestabilidad no representa una onda física con energía creciente.
34.10 Elegir el paso temporal
Una vez elegidos L, N y c, puede fijarse C y calcular:
Δt = CΔx/c
Usar un Δt pequeño no corrige una grilla espacial incapaz de representar las longitudes de onda relevantes.
34.11 Resolución espacial
Una onda necesita varios puntos por longitud de onda. Con muy pocos puntos, la forma y la velocidad numérica se apartan del modelo continuo.
La condición de Courant garantiza estabilidad, no precisión. Una simulación estable todavía puede ser inexacta.
34.12 Dispersión numérica
El esquema puede propagar componentes de distintas longitudes de onda con velocidades numéricas diferentes. Un pulso contiene muchas componentes y puede deformarse.
Refinar la grilla y elegir parámetros adecuados reduce el error, a costa de más memoria y operaciones.
34.13 Condición inicial de desplazamiento
Podemos comenzar con una campana gaussiana:
u(x,0) = exp[−(x − x₀)²/(2σ²)]
σ controla el ancho. Un pulso estrecho contiene componentes espaciales de número de onda más alto y exige mayor resolución.
34.14 Condición inicial de velocidad
La ecuación es de segundo orden en el tiempo, por lo que hacen falta desplazamiento y velocidad iniciales.
Una campana con velocidad inicial cero se divide en pulsos que viajan en sentidos opuestos. Para lanzar un pulso principalmente hacia la derecha hay que preparar coherentemente el estado anterior.
34.15 Inicialización de un pulso viajero
Una solución hacia la derecha tiene forma g(x − ct). En el instante anterior t = −Δt:
u(x,−Δt) = g(x + cΔt)
Equivale a ubicar el centro anterior una distancia cΔt a la izquierda del centro actual.
34.16 Inicialización con velocidad nula
Copiar simplemente previous = current introduce un error de primer paso. Una aproximación simétrica usa la ecuación para estimar:
u−1 ≈ u⁰ + (C²/2)(ui+1⁰ − 2uᵢ⁰ + ui−1⁰)
Así los pasos positivo y negativo quedan consistentes con velocidad inicial cero a segundo orden.
34.17 Extremos fijos
Una condición fija impone:
u(0,t) = 0 y u(L,t) = 0
El pulso reflejado invierte su signo. Numéricamente se asigna cero a los extremos después de calcular los puntos interiores.
34.18 Extremos libres
Un extremo libre ideal impone derivada espacial nula:
∂u/∂x = 0
Una aproximación sencilla copia el punto vecino en el extremo. La reflexión conserva el signo, aunque el tratamiento discreto de la frontera también introduce error.
34.19 Frontera absorbente aproximada
Para simular un dominio abierto se intenta dejar salir la onda sin reflejarla. Una condición absorbente de primer orden aproxima una onda viajera en cada extremo.
No es perfecta: funciona mejor para componentes y ángulos compatibles con su derivación. En una dimensión evita gran parte del retorno, pero puede quedar una reflexión residual.
34.20 Amortiguamiento numérico
Puede agregarse un término que reduzca la velocidad entre pasos. Una forma simple modifica los coeficientes de current y previous.
El amortiguamiento es parte del modelo, no un sustituto de la estabilidad. Un C mayor que 1 puede seguir siendo problemático aunque se pierda energía.
34.21 Energía discreta
Una estimación de la energía suma contribuciones cinética y elástica:
E ≈ Σ ½[(Δu/Δt)² + c²(Δu/Δx)²]Δx
Con fronteras reflectantes y sin amortiguamiento debería permanecer aproximadamente constante. Su deriva ayuda a diagnosticar errores numéricos.
34.22 Actualizar sin sobrescribir
Todos los valores de next deben calcularse a partir del mismo arreglo current. Si se escriben resultados sobre current durante el recorrido, los puntos siguientes usan una mezcla de tiempos.
Al terminar, se rotan referencias: previous recibe current, current recibe next y el arreglo antiguo puede reutilizarse.
34.23 Núcleo del paso numérico
function stepWave(previous, current, next, courant) {
const c2 = courant ** 2;
for (let i = 1; i < current.length - 1; i += 1) {
const laplacian = current[i + 1] - 2 * current[i] + current[i - 1];
next[i] = 2 * current[i] - previous[i] + c2 * laplacian;
}
next[0] = 0;
next[next.length - 1] = 0;
}Esta versión usa extremos fijos y no incluye amortiguamiento.
34.24 Estructuras de datos
Float64Array ofrece precisión cómoda para explorar estabilidad y energía. Float32Array reduce memoria y puede ser suficiente para visualización.
Reutilizar tres arreglos evita asignaciones en cada paso y reduce trabajo del recolector de memoria.
34.25 Tiempo simulado y tiempo de pantalla
Un cuadro visual puede ejecutar varios pasos numéricos. El tiempo físico avanzado es pasos·Δt, independientemente de la frecuencia de la pantalla.
La simulación no tiene por qué correr en tiempo real. Lo importante es informar el tiempo simulado y no confundirlo con segundos de espera.
34.26 Visualización espacio-tiempo
La curva instantánea muestra u frente a x. Un historial apila fotografías: el eje horizontal sigue siendo posición y el vertical representa pasos sucesivos.
Las trayectorias diagonales revelan el movimiento. Una reflexión cambia la inclinación de esas trayectorias.
34.27 Ejemplo de parámetros
Para L = 10 m, N = 201 y c = 5 m/s:
Δx = 10/200 = 0,05 m
Con C = 0,9, Δt = 0,9·0,05/5 = 0,009 s. El esquema cumple la condición de estabilidad.
34.28 Implementación con amortiguamiento
function stepDamped(previous, current, next, courant, damping) {
const c2 = courant ** 2;
for (let i = 1; i < current.length - 1; i += 1) {
const laplacian = current[i + 1] - 2 * current[i] + current[i - 1];
next[i] = (2 - damping) * current[i]
- (1 - damping) * previous[i]
+ c2 * laplacian;
}
}El parámetro es una pérdida por paso, no un coeficiente físico universal. Cambiar Δt sin reinterpretarlo cambia el amortiguamiento por segundo.
34.29 Errores frecuentes
- Usar N en vez de N − 1 al calcular Δx con ambos extremos incluidos.
- Superar C = 1 y confundir la explosión con un fenómeno físico.
- Actualizar
currenten el mismo recorrido que calcula el futuro. - Creer que estabilidad garantiza precisión.
- Ignorar la condición inicial de velocidad.
- Aplicar una frontera sin comprobar el signo de su reflexión.
- Comparar energías sin considerar amortiguamiento o fronteras abiertas.
34.30 Laboratorio de la ecuación de onda
Probá pulsos divididos o viajeros, distintos extremos y valores de Courant. El mapa inferior conserva las últimas fotografías de la grilla.
Grilla: Δx = 10/(201−1) = 0,0500 m; Δt = 0,90·0,0500/5 = 0,0090 s.
C ≤ 1: el esquema satisface la condición de estabilidad unidimensional.
34.31 Ejercicio resuelto: diseñar una grilla estable
Queremos simular L = 12 m con N = 241 puntos y c = 6 m/s. Calculemos el mayor Δt permitido.
const lengthM = 12;
const points = 241;
const speedMps = 6;
const dxM = lengthM / (points - 1);
const maximumDtS = dxM / speedMps;
const chosenCourant = 0.8;
const chosenDtS = chosenCourant * maximumDtS;
console.log({ dxM, maximumDtS, chosenDtS });Δx = 12/240 = 0,05 m. Para C ≤ 1, Δt ≤ 0,05/6 ≈ 0,00833 s. Con C = 0,8 elegimos Δt ≈ 0,00667 s.
34.32 Verificación y convergencia
Una simulación debe compararse con casos conocidos: velocidad de un pulso, signo de reflexiones y conservación aproximada de energía.
Después se repite con Δx y Δt menores manteniendo C. Si las soluciones se acercan entre sí, hay evidencia de convergencia hacia el modelo continuo.
34.33 Límites del modelo
El esquema supone velocidad constante y una dimensión. No incluye no linealidad, dispersión física, geometría tridimensional ni materiales complejos.
La condición absorbente es aproximada y la energía mostrada es un estimador discreto. Una aplicación científica requiere análisis de error y validación más rigurosos.
34.34 Ejercicio propuesto
Diseñá una simulación para L = 15 m, c = 3 m/s y N = 151.
- Calculá Δx.
- Calculá el Δt máximo estable.
- Elegí C = 0,75 y calculá Δt.
- Estimá cuántos pasos necesita un pulso para recorrer todo el dominio.
- Explicá qué ocurrirá en un extremo fijo y en uno libre.
- Probá C = 1,10 en el laboratorio e interpretá el resultado.
Ver solución y explicación
Δx = 15/(151−1) = 0,10 m. El máximo estable es Δt = Δx/c ≈ 0,0333 s. Con C = 0,75, Δt = 0,025 s.
El tiempo físico de recorrido es L/c = 5 s, equivalente a unos 5/0,025 = 200 pasos. El extremo fijo invierte el pulso; el libre conserva su signo. Con C = 1,10, los errores crecen y la solución se vuelve inestable.
34.35 Ideas para recordar
- La grilla usa
Δx = L/(N−1)cuando incluye ambos extremos. - El esquema necesita estados anterior y actual para calcular el siguiente.
- El número de Courant es
C = cΔt/Δx. - Para este esquema unidimensional debe cumplirse C ≤ 1.
- Estabilidad y precisión son requisitos diferentes.
- Las condiciones iniciales determinan si el pulso se divide o viaja en una dirección.
- Las fronteras controlan el signo y la magnitud de las reflexiones.