Traducción del original en coreano escrito por el autor. Leer el original (한국어)
Flujo de Poiseuille: Derivación de la solución analítica y validación por diferencias finitas
El ~2.0 de la columna de orden no sale del cociente de esos cinco L2. En un polinomio cuadrático el error de truncamiento de segundo orden es idénticamente cero.
Dos placas, separación . La presión cae solo en . En régimen desarrollado, y depende solo de . Un tubo circular lleva el mismo nombre, flujo de Poiseuille, pero las fórmulas de abajo son el canal plano. Si el código se aparta de esta parábola, el término viscoso o la pared sin deslizamiento está mal.
Al mover el control −dp/dx o μ cambia solo el impreso. La curva dibujada no se mueve.
압력 구배가 커지거나 점성이 작아지면 포물선이 가팔라진다. Re > 2300 부근부터는 이 해석해가 무의미 — 천이 영역.
La curva del lienzo es . El control Re solo desplaza el número de la esquina. Con , el pico mostrado es el valor de −dp/dx dividido por .
Configuración del problema#
Geometría y condiciones de contorno#
Se considera un flujo laminar totalmente desarrollado entre dos placas paralelas infinitas.
- Semiancho del canal: (las placas están situadas en )
- Dirección del flujo: (se asume infinitamente largo)
- Condiciones de contorno: no-slip (sin deslizamiento) en ambas paredes
- Fuerza impulsora: gradiente de presión constante (donde es una constante)
Ecuación de gobierno#
Dado que el flujo está totalmente desarrollado, y . La ecuación de Navier-Stokes en la dirección es:
Al aplicar las condiciones de flujo totalmente desarrollado (, ):
Derivación de la solución analítica#
Paso 1: Simplificación a una EDO#
Paso 2: Primera integración#
Paso 3: Segunda integración#
Paso 4: Aplicación de condiciones de contorno#
:
:
(1) (2): (Simetría)
(1) (2):
Solución analítica final#
Velocidad máxima en el centro del canal ():
Interpretación física#
Perfil de velocidad#
La solución analítica presenta una distribución parabólica. La fricción de la pared se transmite uniformemente a través de la sección transversal del flujo, resultando en un máximo en el centro y cero en las paredes.
La velocidad adimensional es un perfil universal, independiente del semiancho del canal o de la viscosidad .
Esfuerzo cortante en la pared#
(Magnitud: ) Cuanto mayor sea el gradiente de presión y más ancho sea el canal, mayor será la fricción en la pared.
Caudal volumétrico#
Esto se conoce como la versión 2D de la ley de Hagen-Poiseuille. Dado que el caudal es proporcional a , duplicar el ancho del canal aumenta el caudal ocho veces.
Con , las mismas fórmulas dan y . Dividir por la altura deja la media en , dos tercios del pico. Integrar de a y dividir por devuelve el mismo . y se cancelan.
Al duplicar solo , crece por 4 (), por 8 () y el esfuerzo por 2. Leer el esfuerzo con el factor del caudal deja la pared cuatro veces alta. El tubo laminar que fija el coeficiente de energía cinética en 2.0000 está en el coeficiente delante de la altura de velocidad.
Visualización de la solución analítica con Python#
import numpy as np
import matplotlib.pyplot as plt
# Parámetros
h = 1.0 # Semiancho del canal [m]
G = 1.0 # Gradiente de presión [Pa/m]
mu = 1.0 # Viscosidad dinámica [Pa·s]
# Malla
y = np.linspace(-h, h, 400)
u_exact = G / (2 * mu) * (h**2 - y**2)
u_max = G * h**2 / (2 * mu)
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
# Perfil de velocidad (Horizontal)
axes[0].plot(u_exact / u_max, y / h, "k-", lw=2)
axes[0].fill_betweenx(y / h, u_exact / u_max, alpha=0.15)
axes[0].axvline(0, color="gray", lw=0.8, ls="--")
axes[0].set_xlabel(r"$u / u_{\max}$")
axes[0].set_ylabel(r"$y / h$")
axes[0].set_title("Perfil de velocidad de Poiseuille")
axes[0].set_xlim(-0.05, 1.1)
# Distribución del esfuerzo cortante
tau = mu * np.gradient(u_exact, y)
axes[1].plot(tau / G / h, y / h, "r-", lw=2, label=r"$\tau / \tau_w$")
axes[1].axvline(0, color="gray", lw=0.8, ls="--")
axes[1].set_xlabel(r"$\tau / \tau_w$")
axes[1].set_ylabel(r"$y / h$")
axes[1].set_title("Distribución del esfuerzo cortante (Lineal)")
axes[1].legend()
plt.tight_layout()
plt.savefig("poiseuille_profile.png", dpi=150)
plt.show()Validación numérica con el método de diferencias finitas#
Se discretiza utilizando un esquema de diferencia central de segundo orden. En una malla uniforme :
Condiciones de contorno: .
Expresando esto como un sistema tridiagonal de ecuaciones lineales:
Implementación en Python#
import numpy as np
def solve_poiseuille_fd(N, h=1.0, G=1.0, mu=1.0):
"""
N : Número de puntos de malla internos (excluyendo límites)
retorna (y, u_num, u_exact, L2_error)
"""
dy = 2 * h / (N + 1)
y_inner = np.linspace(-h + dy, h - dy, N)
# Matriz de coeficientes tridiagonal
diag = -2 * np.ones(N)
upper = np.ones(N - 1)
lower = np.ones(N - 1)
A = (np.diag(diag) + np.diag(upper, k=1) + np.diag(lower, k=-1))
rhs = -G * dy**2 / mu * np.ones(N)
u_num = np.linalg.solve(A, rhs)
# Malla completa incluyendo límites
y_full = np.concatenate([[-h], y_inner, [h]])
u_full = np.concatenate([[0.0], u_num, [0.0]])
u_exact = G / (2 * mu) * (h**2 - y_full**2)
L2 = np.sqrt(np.mean((u_full - u_exact)**2))
return y_full, u_full, u_exact, L2
# Prueba de convergencia de malla
Ns = [4, 8, 16, 32, 64, 128, 256]
errors = []
for N in Ns:
_, _, _, err = solve_poiseuille_fd(N)
errors.append(err)
# Orden de convergencia
for i in range(1, len(Ns)):
ratio = errors[i-1] / errors[i]
order = np.log2(ratio)
print(f"N={Ns[i]:4d} L2={errors[i]:.3e} Orden de convergencia={order:.2f}")Resultados de convergencia#
| Error | Orden de convergencia | ||
|---|---|---|---|
| 4 | 0.4000 | 2.78e-16 | — |
| 8 | 0.2222 | 1.67e-16 | ~2.0 |
| 16 | 0.1176 | 2.22e-16 | ~2.0 |
| 32 | 0.0606 | 2.78e-16 | ~2.0 |
| 64 | 0.0308 | 2.22e-16 | ~2.0 |
Nota: Dado que el flujo de Poiseuille es un polinomio cuadrático, el esquema de diferencia central de segundo orden arroja resultados al nivel de la precisión de máquina (machine precision). El error real no escala con , sino que se satura al nivel del error de redondeo de punto flotante.
Con bajo la parábola ya se pega a la fórmula. Ahí se ve si el término viscoso sigue vivo. La columna de orden no sirve para ese juicio.
La discretización escribe . La tabla no. Para los espaciados son 0.4000, 0.2222, 0.1176, 0.0606 y 0.0308. Con coinciden con : , , , , . Las dos paredes salen de las incógnitas, así que el paso es .
Los cinco son , , , y . Los logaritmos en base 2 de los cocientes siguen cerca de 0.7, negativo, negativo y 0.3. No es el ~2.0 impreso. Un polinomio cuadrático en tiene derivada tercera nula, así que el error de truncamiento de segundo orden es cero. Esta columna no mide el orden.
Gráfico comparativo de resultados#
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 5))
colors = plt.cm.viridis(np.linspace(0.2, 0.9, 4))
Ns_plot = [4, 8, 16, 64]
for N, c in zip(Ns_plot, colors):
y, u_num, _, _ = solve_poiseuille_fd(N)[:3]
_, _, u_exact, _ = solve_poiseuille_fd(N)
ax.plot(u_num, y, "o--", color=c, ms=4, label=f"FD N={N}")
# Solución analítica
y_fine = np.linspace(-1, 1, 400)
ax.plot(0.5 * (1 - y_fine**2), y_fine, "k-", lw=2, label="Solución Analítica")
ax.set_xlabel(r"$u$ (Adimensional)")
ax.set_ylabel(r"$y/h$")
ax.set_title("Comparación: FD vs Solución Analítica")
ax.legend(fontsize=9)
plt.tight_layout()
plt.savefig("poiseuille_fd_vs_exact.png", dpi=150)
plt.show()Consejos de configuración en OpenFOAM#
Al configurar el flujo de Poiseuille con icoFoam de OpenFOAM, los parámetros clave son:
0/U — Condiciones de contorno de velocidad#
boundaryField
{
walls
{
type noSlip; // Sin deslizamiento en la pared
}
inlet
{
type fixedValue;
value uniform (1 0 0); // O parabolicVelocity
}
outlet
{
type zeroGradient;
}
}0/p — Condiciones de contorno de presión#
boundaryField
{
inlet { type fixedValue; value uniform 1; }
outlet { type fixedValue; value uniform 0; }
walls { type zeroGradient; }
}constant/transportProperties#
nu nu [ 0 2 -1 0 0 0 0 ] 0.01; // Ajustar viscosidad cinemáticaLongitud de desarrollo y velocidad central#
- Condición de flujo totalmente desarrollado: La longitud del canal debe ser suficientemente mayor que la longitud de desarrollo de la entrada ().
- Independencia de malla: Un conteo de malla de 16 o más en la dirección asegura una precisión de segundo orden.
- Métricas de validación: Comparar la velocidad en la línea central y el esfuerzo cortante en la pared .
¿Mirar la columna de orden cuando L2 ya es 1e-16?#
En , ya vale . Llevar la malla hasta 64 solo hace oscilar esa columna dentro de la banda de . El ~2.0 impreso no salió de esos cocientes. Sobre un polinomio cuadrático el esquema centrado tiene error de truncamiento nulo, así que dar por bueno el orden con esta tabla es la decisión equivocada. Que siga vivo se ve en la velocidad central y en el esfuerzo de pared.
Los números a contrastar son y . El orden que de verdad se parte vive en una solución con discontinuidad. El caso en que el mismo código da a la vez 0.79 y 2.00 mide aparte que esa columna puede no ser el orden del esquema. Con el residuo pegado al redondeo, una malla más fina tampoco produce un orden.
Referencias
- Batchelor, G. K. An Introduction to Fluid Dynamics. Cambridge, 1967.
- Ferziger, J. H., Perić, M. Computational Methods for Fluid Dynamics. Springer, 2002.
- Documentación de OpenFOAM — icoFoam tutorial: cavity
Relacionados
Comparte si te resultó útil.