Traducción del original en coreano escrito por el autor. Leer el original (한국어)
La cuerda doblada aguantó, la cuerda cortada se pasó un 9% — el final numérico de la disputa de 1747
La forma de representar la solución decide qué tipo de error aparece. Las ondas viajeras transportan la forma; la suma de modos oscila en cada esquina.
En 1747, tres hombres se dividieron por una sola cuerda#
d'Alembert escribió en 1747 la ecuación de la cuerda vibrante. Fue la primera ecuación en derivadas parciales de la historia. La pelea que vino después no era sobre la ecuación. Era sobre qué aspecto podían tener sus soluciones. Euler y Daniel Bernoulli presentaron respuestas distintas, y ninguno de los tres cedió en treinta años.
Los tres tenían razón. Las respuestas solo se separan al truncar la serie en un número finito de términos.
Al apagar halves la curva blanca se parte en dos viajeras de media altura. Con jump las esquinas siguen afiladas.
La cuerda es la suma de esas dos mitades. El perfil que no redondea las esquinas es la solución de d'Alembert. La suma de modos deja el 9% para más adelante.
El repique del 9% de los métodos espectrales y los esquemas de alto orden empieza aquí.
d'Alembert no desarrolló nada#
Al aplicar la segunda ley de Newton a un tramo pequeño de cuerda con tensión y densidad lineal se obtiene lo siguiente.
es el desplazamiento transversal y la velocidad de onda. d'Alembert notó que el cambio , convierte la ecuación en . Dos integraciones y la solución cae sola.
es el desplazamiento inicial extendido de forma impar respecto a ambos extremos, con periodo . La condición de extremo fijo nunca se impone aparte. La propia extensión impar invierte el signo en cada pared. Sin desarrollo, sin coeficientes, sin frecuencias. Toda la solución consiste en partir la forma inicial por la mitad y llevarla hacia ambos lados. La advección no suaviza nada.
Bernoulli reescribió la misma respuesta con senos#
La objeción de Daniel Bernoulli vino de la música. Una cuerda suena con su fundamental y sus armónicos a la vez. Entonces la solución también debe ser una superposición de ondas estacionarias.
es la amplitud del modo y su frecuencia angular. Que las frecuencias modales estén en la razón entera se sabía desde Pitágoras. En el París de entonces se discutía la teoría de la armonía de Rameau, y el propio d'Alembert estaba en el bando que la defendía con mecánica newtoniana. La base física de la escala musical salió de esta ecuación.
Lo que Euler cuestionó fue la palabra "función"#
Euler se puso del lado de d'Alembert, pero por otro motivo. Al pulsar una cuerda con el dedo, la forma inicial es un triángulo con un pico. En ese punto no existe. d'Alembert ni siquiera quería admitir esa curva como solución, porque para él solo era función una curva expresable mediante una única fórmula analítica. Euler insistió en que cualquier curva dibujada a mano es un dato inicial legítimo.
Bernoulli fue aún más lejos: toda curva, afirmaba, se puede escribir como suma infinita de senos. En su momento parecía optimismo sin fundamento. La cuestión no se zanjó hasta Fourier, en 1822. Una onda lineal solo transporta la forma. Cuando las características se cruzan, un problema no lineal fabrica su propio choque aunque el dato inicial sea suave. La intuición de d'Alembert acertaba aquí solo a medias.
Python, con las dos representaciones en el mismo instante#
Se preparan tres desplazamientos iniciales: una función caja con saltos, un triángulo con solo un pico y una campana suave. En el mismo instante se compara la solución de d'Alembert con la serie de senos de términos.
import numpy as np
L, c, T = 1.0, 1.0, 0.15
X = np.linspace(0.0, L, 2001)
def hat_profile(x, a=0.35, b=0.55):
"""Salto: vale 1 en [a,b] y 0 fuera - la banda que golpea el martillo"""
return np.where((x >= a) & (x <= b), 1.0, 0.0)
def kink_profile(x, a=0.45):
"""Pico: continua, pero la pendiente salta en x=a - cuerda pulsada"""
return np.where(x < a, x / a, (L - x) / (L - a))
def bell_profile(x, a=0.45, s=0.055):
"""Suave: campana infinitamente derivable"""
return np.exp(-((x - a) ** 2) / (2 * s ** 2))
def odd_extend(f0, xq):
"""Interpola sobre la extension impar y 2L-periodica que exigen los extremos fijos"""
xs = np.mod(xq, 2 * L)
sign = np.where(xs > L, -1.0, 1.0)
xs = np.where(xs > L, 2 * L - xs, xs)
return sign * np.interp(xs, X, f0)
def dalembert_wave(f0, t):
"""Solucion de d'Alembert - dos ondas de media altura que viajan en sentidos opuestos"""
return 0.5 * (odd_extend(f0, X - c * t) + odd_extend(f0, X + c * t))
def modal_wave(f0, t, n_modes):
"""Solucion de Bernoulli - superposicion de n_modes modos senoidales"""
n = np.arange(1, n_modes + 1)[:, None]
k = n * np.pi / L
b = 2.0 / L * np.trapezoid(f0[None, :] * np.sin(k * X[None, :]), X, axis=1)
return (b[:, None] * np.sin(k * X[None, :]) * np.cos(k * c * t)).sum(axis=0)
def overshoot_pct(u, exact):
"""Exceso maximo sobre el pico exacto, en % de la amplitud exacta"""
return 100.0 * (u.max() - exact.max()) / (exact.max() - exact.min())
for name, f0 in (("jump ", hat_profile(X)),
("kink ", kink_profile(X)),
("smooth", bell_profile(X))):
exact = dalembert_wave(f0, T)
print(f"[{name}] t*c/L = {T}")
for n_modes in (8, 32, 128, 512):
u = modal_wave(f0, T, n_modes)
print(f" N={n_modes:4d} max|modal - dAlembert| = {np.abs(u - exact).max():.5f}"
f" overshoot = {overshoot_pct(u, exact):+6.2f} %")[jump ] t*c/L = 0.15
N= 8 max|modal - dAlembert| = 0.30480 overshoot = +21.01 %
N= 32 max|modal - dAlembert| = 0.26454 overshoot = +12.07 %
N= 128 max|modal - dAlembert| = 0.23847 overshoot = +9.86 %
N= 512 max|modal - dAlembert| = 0.18738 overshoot = +8.94 %
[kink ] t*c/L = 0.15
N= 8 max|modal - dAlembert| = 0.02073 overshoot = -0.23 %
N= 32 max|modal - dAlembert| = 0.00639 overshoot = -0.19 %
N= 128 max|modal - dAlembert| = 0.00157 overshoot = -0.03 %
N= 512 max|modal - dAlembert| = 0.00038 overshoot = -0.01 %
[smooth] t*c/L = 0.15
N= 8 max|modal - dAlembert| = 0.04435 overshoot = -6.25 %
N= 32 max|modal - dAlembert| = 0.00000 overshoot = -0.00 %
N= 128 max|modal - dAlembert| = 0.00000 overshoot = +0.00 %
N= 512 max|modal - dAlembert| = 0.00000 overshoot = -0.00 %Al llevar modes N de 8 a 512, el sobrepico de jump se queda cerca del 9% y el repique rojo solo se afina. El error de smooth se apaga en 32. En kink el error baja a cerca de un cuarto cada vez que N se multiplica por cuatro.
Los tres bloques cuentan tres historias distintas. La campana suave toca el cero de doble precisión con 32 términos. El triángulo con pico divide su error por cuatro cada vez que se multiplica por cuatro: primer orden. Solo el salto conserva un sobrepico, y este se asienta cerca del 9% en lugar de reducirse.
El error máximo del salto baja de 0.30480 en a 0.18738 en . Multiplicar los términos por 64 solo compra un factor de cerca de 1.6. El sobrepico cae de +21.01% a +8.94%, a 0.01 puntos del 8.95% teórico. En el mismo tramo el pico imprime 0.02073, 0.00639, 0.00157 y 0.00038. Los cocientes rondan 3.24, 4.07 y 4.13, cerca de la caída por cuatro que corresponde a multiplicar por cuatro. La campana tiene error 0.04435 y sobrepico −6.25% en , y 0.00000 en . En las ondas viajeras apenas recorrieron el 15% de la longitud. La cicatriz de la serie truncada ya está sentada en la esquina.
El 9% no baja aunque se añadan términos#
Ese número es el fenómeno de Gibbs. Wilbraham lo encontró en 1848, Gibbs lo redescubrió en 1899 y el nombre quedó. El valor teórico es el 8.95% del salto. El 8.94% que imprime la corrida con 512 términos es esa constante.
El sobrepico se estrecha sin bajar nunca de altura. Al añadir términos, la zona de oscilación se encoge como . Por eso una integral, o una norma , sí converge. Medido en norma del máximo, no. Esa brecha entre normas es lo que en la práctica aparece como densidad negativa. Lo único que cambió fue el dato inicial.
La tasa de decaimiento de los coeficientes lo explica todo. Con un salto, ; con solo un pico, ; con un perfil suave, más rápido que cualquier potencia. La cola truncada es el error, así que cuanto más gruesa la cola, mayor la cicatriz que deja el corte.
1755, cuando el mismo hombre se topó con lo no lineal#
Euler escribió el movimiento de un fluido como ecuación en derivadas parciales por primera vez en 1755: las ecuaciones de Euler. A diferencia de la ecuación de ondas, aquí la pendiente de una característica depende de la propia solución. Por suave que sea el dato inicial, el cruce de características genera una discontinuidad en tiempo finito. Es la misma estructura que explica por qué un flujo supersónico no sabe nada de lo que hay aguas arriba.
Por eso, en cálculo compresible, elegir un dato inicial suave no sirve de nada. La onda de choque fabrica su propio salto, y desde ese instante un esquema de alto orden vuelve al problema de 1747. Que von Neumann emborronara los choques a propósito en 1950 apuntaba exactamente a este repique. Los limitadores TVD y los pesos WENO bajan el orden solo cerca del choque, porque recuperar suavidad de forma local es la única manera de borrar ese 9%.
El orden en norma del máximo desaparece en cuanto hay un salto#
Cuando un esquema nuevo repica, el limitador no es el primer sospechoso. Se mira si el campo inicial es constante por celda, si la interfaz entró como un salto y si la entrada es solo en el tiempo. Un dato cuyo sobrepico sigue en +8.94% con 512 términos está pagando la representación.
Los casos de verificación se cortan con el mismo criterio. La campana devuelve el orden de diseño sin rodeos: error 0.00000 en . En cuanto entra un salto, la convergencia en norma del máximo desaparece y solo queda . Los tres hombres de 1747 no tenían nombre para esa separación. El nombre es la elección de norma.
Relacionados
Comparte si te resultó útil.