Skip to content
cfd-lab:~/es/posts/2026-05-25-lbm-equilibri…online
NOTE #054DAY MON CFD기법DATE 2026.05.25READ 6 min readWORDS 1,029#CFD#LBM#Lattice-Boltzmann#Kinetic-Theory#Hermite-Polynomial

Maxwell–Boltzmann en nueve flechas — por qué el equilibrio del LBM es un polinomio

Un truncamiento Hermite de segundo orden construye D2Q9 y ata el LBM a flujos de bajo Mach

En 1986, Frisch, Hasslacher y Pomeau colocaron partículas sobre una retícula y las hicieron imitar a Navier–Stokes. Aquello era el LGCA (Lattice Gas Cellular Automaton). Murió antes de cumplir cinco años — la condición entera de cero o una partícula por dirección generaba ruido imposible de borrar. En 1992, McNamara y Zanetti cambiaron enteros por reales. Llenaron la retícula con funciones de distribución fif_i en lugar de bits. El ruido desapareció, pero llegó otra pregunta. ¿Cómo pueden nueve números reales sustituir a la distribución infinito-dimensional de Maxwell–Boltzmann? Este artículo sigue la respuesta — un truncamiento Hermite de segundo orden hace de equilibrio en el LBM, y el mismo truncamiento lo encadena al régimen de bajo Mach.

De enteros a reales — el LGCA murió en 1986 y nació el LBM#

La idea del LGCA era elegante. Retícula cuadrada, seis direcciones de partícula, una sola regla de colisión. Promediada a escala macroscópica devolvía Navier–Stokes. Pero las partículas booleanas (cero o uno) amplificaban el ruido estadístico. Para matarlo hacían falta promedios temporales largos, y entonces el transitorio que se buscaba ver también desaparecía.

McNamara y Zanetti pusieron distribuciones reales fi(x,t)f_i(\mathbf{x}, t) en cada nodo. fif_i es el recuento esperado de partículas que en el instante tt, en la posición x\mathbf{x}, se mueven a lo largo de la dirección ci\mathbf{c}_i. El ruido se evapora por construcción. Cada paso se parte en dos — colisión y streaming.

fi(x+ciΔt,t+Δt)=fi(x,t)fi(x,t)fieq(ρ,u)τf_i(\mathbf{x} + \mathbf{c}_i \Delta t, t + \Delta t) = f_i(\mathbf{x}, t) - \frac{f_i(\mathbf{x}, t) - f_i^{eq}(\rho, \mathbf{u})}{\tau}

τ\tau es el tiempo de relajación y fieqf_i^{eq} es la distribución de equilibrio. La colisión pela la parte de no-equilibrio a escala τ\tau, y el streaming desplaza la distribución pelada una celda. Toda la cuestión profunda se concentra en fieqf_i^{eq} — ¿qué hace que basten nueve números reales?

Maxwell–Boltzmann carga una bomba de tiempo#

En la teoría cinética continua, el equilibrio es Maxwell–Boltzmann.

fMB(c)=ρ(2πRT)D/2exp ⁣((cu)22RT)f^{MB}(\mathbf{c}) = \rho \, (2\pi R T)^{-D/2} \exp\!\left( -\frac{(\mathbf{c} - \mathbf{u})^2}{2 R T} \right)

c\mathbf{c} es la velocidad molecular, u\mathbf{u} la velocidad macroscópica, DD la dimensión espacial, TT la temperatura, RR la constante de los gases. La bomba es que c\mathbf{c} es continua. Reducirla a nueve o diecinueve direcciones discretas exige cribar la distribución con cuidado.

Intento ingenuo — aproximar la integral gaussiana por una suma de Riemann en malla fija. Falla. Los momentos que necesita Navier–Stokes — ρ\rho, ρu\rho \mathbf{u}, el tensor de cantidad de movimiento ρuu\rho \mathbf{u}\mathbf{u}, la energía — no coinciden con la suma reticular. En cuanto se rompe la conservación, el LBM queda inservible.

La respuesta correcta es expansión funcional. Desarrollar Maxwell–Boltzmann en una serie de polinomios ortogonales, conservar los órdenes que llevan los momentos necesarios y dejar caer el resto. Esos polinomios son los de Hermite.

Los polinomios de Hermite cortan la distribución a tajadas#

Los polinomios probabilísticos de Hermite Hen(c)He_n(c) son ortogonales bajo el peso gaussiano estándar w(c)=(2π)1/2ec2/2w(c) = (2\pi)^{-1/2} e^{-c^2/2}.

Hen(c)Hem(c)w(c)dc=n!δnm\int He_n(c)\, He_m(c)\, w(c)\, dc = n!\, \delta_{nm}

Los primeros son He0=1He_0 = 1, He1=cHe_1 = c, He2=c21He_2 = c^2 - 1, He3=c33cHe_3 = c^3 - 3c. Si se asume isotermia en 1D (RT=1RT = 1 tras adimensionalizar), la función generadora exponencial da de inmediato la identidad siguiente.

fMB(c)=w(c)ρexp ⁣(ucu22)=w(c)ρn=0unn!Hen(c)f^{MB}(c) = w(c)\, \rho \exp\!\left( u c - \frac{u^2}{2} \right) = w(c)\, \rho \sum_{n=0}^{\infty} \frac{u^n}{n!} He_n(c)

Cada término atrapa una rebanada del mundo. n=0n=0 es el gaussiano estacionario; n=1n=1 es una pequeña deriva; n=2n=2 es la corrección de energía cinética media. Cuanto mayor el nn, más asimétricos son los efectos de cola. Todo el juego del LBM consiste en cortar esta suma en un orden finito.

Maxwell–Boltzmann과 그 Hermite 절단의 비교. 표의 세 모멘트(밀도·운동량·에너지)가 같아지는 차수가 바로 LBM이 멈추는 자리다.
N=2면 ρ·ρu·에너지 세 모멘트가 정확히 일치한다. u가 |u|/c_s ≈ 1을 넘어가면 절단오차가 폭주하며 격자가 깨진다 — LBM이 저속(낮은 마하수)에 묶이는 이유.

Toca la simulación de arriba. Sube la deriva uu a 0.4 y elige el orden de truncamiento N=2N=2: los tres primeros momentos (densidad, cantidad de movimiento y energía) coinciden con Maxwell–Boltzmann al detalle. Empuja uu por encima de 1.0 y la curva discontinua se separa. Allí está, en una sola figura, el origen de la restricción de Mach del LBM, u/cs0.3|\mathbf{u}|/c_s \lesssim 0.3.

Qué compra el truncamiento de segundo orden#

¿Qué momentos hacen falta para Navier–Stokes con esfuerzo viscoso de primer orden? Justo tres órdenes — ρ\rho, ρu\rho \mathbf{u} y el flujo de cantidad de movimiento Παβ=ρuαuβ+pδαβ\Pi_{\alpha\beta} = \rho u_\alpha u_\beta + p \delta_{\alpha\beta}. Como ρuu\rho \mathbf{u}\mathbf{u} es de orden u2u^2, la distribución debe acarrear un término en u2u^2.

Cortemos entonces la serie en N=2N=2.

feq(c)=w(c)ρ[1+uc+u22(c21)]f^{eq}(c) = w(c)\, \rho \left[ 1 + uc + \frac{u^2}{2}(c^2 - 1) \right]

Esta es la forma continua del equilibrio LBM. N=3N=3 y mayores sirven para momentos no viscosos más altos (flujo de calor), pero son redundantes en el LBM isotérmico estándar. Lo descartado explica los dos límites conocidos — la hipótesis isotérmica y el techo de Mach 0.3.

Cómo se construyó D2Q9#

Cambiar la integral continua feq(c)ϕ(c)dc\int f^{eq}(c) \phi(c)\, dc por la suma reticular iwifieqϕ(ci)\sum_i w_i f_i^{eq} \phi(\mathbf{c}_i) exige una cuadratura. Hecho clave — una cuadratura exacta hasta orden NN basta con que integre exactamente polinomios de ese orden.

En 2D, ser exactos hasta el término u2u^2 obliga a integrar exactamente polinomios de orden cinco bajo el peso gaussiano (el tensor de cantidad de movimiento produce un término c2×u2c^2 \times u^2). La cuadratura Gauss–Hermite de tres puntos hace justamente ese trabajo.

En 1D, tres nodos c{3,0,+3}c \in \{-\sqrt{3}, 0, +\sqrt{3}\} con pesos {1/6,2/3,1/6}\{1/6, 2/3, 1/6\}. En 2D el producto tensorial da 3×3=93 \times 3 = 9 nodos — eso es D2Q9. Reescalando a unidades de retícula, cs=1/3c_s = 1/\sqrt{3} y los vectores de velocidad reticular caen en coordenadas enteras (0,0),(±1,0),(0,±1),(±1,±1)(0,0), (\pm 1, 0), (0, \pm 1), (\pm 1, \pm 1). Los pesos reticulares wiw_i absorben el factor gaussiano en los pesos Gauss–Hermite.

Índiceci\mathbf{c}_iwiw_i
0(0,0)(0, 0)4/94/9
1–4(±1,0),(0,±1)(\pm 1, 0), (0, \pm 1)1/91/9
5–8(±1,±1)(\pm 1, \pm 1)1/361/36

Sustituyendo cs2=1/3c_s^2 = 1/3 en la forma continua, queda el equilibrio sobre la retícula.

fieq=wiρ[1+3(ciu)+92(ciu)232uu]f_i^{eq} = w_i\, \rho \left[ 1 + 3 (\mathbf{c}_i \cdot \mathbf{u}) + \frac{9}{2}(\mathbf{c}_i \cdot \mathbf{u})^2 - \frac{3}{2}\, \mathbf{u} \cdot \mathbf{u} \right]

Esta línea es el corazón de todo código LBM isotérmico. Un polinomio modesto, pero encierra los tres primeros momentos de Maxwell–Boltzmann.

Python — un paso de colisión BGK#

Un paso de colisión sobre un solo nodo.

import numpy as np
 
cx = np.array([0, 1, 0, -1, 0, 1, -1, -1, 1])
cy = np.array([0, 0, 1, 0, -1, 1, 1, -1, -1])
w  = np.array([4/9, 1/9, 1/9, 1/9, 1/9, 1/36, 1/36, 1/36, 1/36])
 
def equilibrium(rho, ux, uy):
    """Equilibrio D2Q9 — nueve polinomios"""
    ciu = cx * ux + cy * uy            # producto escalar
    usq = ux * ux + uy * uy
    return w * rho * (1 + 3 * ciu + 4.5 * ciu**2 - 1.5 * usq)
 
def bgk_collision(f, tau):
    rho = f.sum()
    ux  = (cx * f).sum() / rho
    uy  = (cy * f).sum() / rho
    feq = equilibrium(rho, ux, uy)
    return f - (f - feq) / tau, rho, ux, uy
 
# distribución inicial fuera de equilibrio
f = w * 1.0
f[1] += 0.05; f[3] -= 0.04          # ligero sesgo hacia el este
 
for step in range(20):
    f, rho, ux, uy = bgk_collision(f, tau=0.8)
    err = np.linalg.norm(f - equilibrium(rho, ux, uy))
    print(f"step {step:2d}: rho={rho:.4f}, u=({ux:+.4f},{uy:+.4f}), ||delta||={err:.2e}")

En unos veinte pasos el residuo cae por debajo de 10610^{-6} — los nueve fif_i se asientan sobre el polinomio de equilibrio. ¿Qué sobrevive en cada paso? La densidad ρ\rho y la cantidad de movimiento ρu\rho \mathbf{u}. La colisión solo recorta los momentos de no-equilibrio.

D2Q9 격자 위에서 9개 분포 함수가 BGK 충돌을 통해 평형으로 끌려가는 과정. 노란 화살표는 거시 속도 u, 가는 화살표는 각 격자 방향 c_i의 분포 크기.
τ→0.5에 가까울수록 한 스텝에 평형으로 끌려가지만, 점성 ν = c_s²(τ−1/2)도 작아져 안정성이 흔들린다.

Arrastra el deslizador de τ\tau hacia 0.55 y el residuo se anula en uno o dos pasos. La viscosidad es ν=cs2(τ1/2)\nu = c_s^2 (\tau - 1/2), así que cuando τ1/2\tau \to 1/2 la viscosidad desaparece y la retícula se vuelve inestable. Empujar τ\tau hacia arriba aumenta la viscosidad pero ralentiza la relajación. Esta es la perilla que toda persona que trabaja con LBM termina ajustando.

Tres líneas para recordar#

  • El equilibrio fieqf_i^{eq} del LBM es Maxwell–Boltzmann desarrollado en polinomios de Hermite y cortado en segundo orden — ese corte conserva exactamente los momentos ρ\rho, ρu\rho \mathbf{u} y el flujo de cantidad de movimiento.
  • D2Q9 se deduce como el producto tensorial 2D de la cuadratura Gauss–Hermite de tres puntos, la regla mínima que integra exactamente el equilibrio de segundo orden. El 9 no es arbitrario; es un subproducto de la integración ortogonal.
  • El orden de truncamiento fija todos los límites. La hipótesis isotérmica y el techo u/cs0.3|\mathbf{u}|/c_s \lesssim 0.3 se siguen automáticamente de una sola frase: "cortamos la serie en N=2N=2".

Comparte si te resultó útil.