Skip to content
cfd-lab:~/es/posts/2026-05-21-complex-poten…online
NOTE #050DAY THU 유체역학DATE 2026.05.21READ 6 min readWORDS 1,158#유체역학#Potential-Flow#Complex-Potential#Cauchy-Riemann#d-Alembert#유동현상

Sumamos dos funciones y apareció un cilindro — Potencial complejo y la paradoja de d'Alembert

Por qué una corriente uniforme más un punto diminuto basta para dibujar el flujo alrededor de un cilindro.

Sumar dos funciones, y un cilindro aparece de la nada. Tomemos una corriente uniforme y coloquemos encima un pequeño doblete puntual: en el centro emerge un círculo perfecto, aunque nadie ha trazado ningún círculo. Esta entrada se ocupa de mostrar que ese truco es, en realidad, una sola línea de análisis complejo del siglo XIX. Recorreremos por qué las ecuaciones de Cauchy–Riemann son la columna vertebral del flujo bidimensional no viscoso, cómo la fórmula única W=Uz+m/zW=Uz+m/z entrega el flujo exacto alrededor de un cilindro, y cómo ese resultado termina en la paradoja del "arrastre cero" que en 1752 desconcertó a d'Alembert. Al final, sesenta líneas de NumPy reproducen toda la figura.

Por qué las líneas de corriente y las equipotenciales se cruzan en ángulo recto#

En un flujo 2D incompresible, no viscoso e irrotacional, conviven dos campos escalares: el potencial de velocidades ϕ\phi y la función de corriente ψ\psi. La velocidad los enlaza:

u=ϕx=ψy,v=ϕy=ψxu = \frac{\partial \phi}{\partial x} = \frac{\partial \psi}{\partial y}, \qquad v = \frac{\partial \phi}{\partial y} = -\frac{\partial \psi}{\partial x}

La pendiente de una equipotencial ϕ=cte.\phi=\text{cte.} es u/v-u/v. La de una línea de corriente ψ=cte.\psi=\text{cte.} es v/uv/u. Su producto vale 1-1. Las dos familias son ortogonales en todas partes.

Esa cuadrícula perpendicular no es un adorno. Es exactamente la propiedad de las partes real e imaginaria de una función holomorfa. Una sola condición — que la derivada compleja dé el mismo valor sea cual sea la dirección de aproximación — basta para sujetar estos dos campos como una pareja inseparable.

Potencial complejo de velocidades — el puente que tendieron Cauchy y Riemann#

Sea z=x+iyz = x + iy y consideremos W(z)=ϕ(x,y)+iψ(x,y)W(z) = \phi(x,y) + i\psi(x,y). Para que WW sea derivable en sentido complejo, toda dirección de aproximación a zz debe dar la misma derivada. Igualando los límites a lo largo del eje real y del eje imaginario aparecen dos ecuaciones:

ϕx=ψy,ϕy=ψx\frac{\partial \phi}{\partial x} = \frac{\partial \psi}{\partial y}, \qquad \frac{\partial \phi}{\partial y} = -\frac{\partial \psi}{\partial x}

Son las relaciones de Cauchy–Riemann. Y resultan ser las mismas líneas que acabamos de escribir para las velocidades. Si empaquetamos el potencial y la función de corriente de un flujo 2D irrotacional en una sola función compleja, esa función es holomorfa. A esa W(z)W(z) se la llama potencial complejo de velocidades.

Su derivada compleja también tiene significado. De dW=(uiv)dzdW = (u - iv)\, dz sale

dWdz=uiv\frac{dW}{dz} = u - iv

Esa cantidad es la velocidad compleja. Es el conjugado del vector velocidad — y conserva ambas componentes intactas.

Una sola línea — W=Uz+m/zW = Uz + m/z dibuja el cilindro#

Empecemos por los dos ladrillos más simples. Corriente uniforme W=UzW = Uz. Separando parte real e imaginaria, ϕ=Ux\phi = Ux, ψ=Uy\psi = Uy. Las equipotenciales son rectas verticales; las líneas de corriente, horizontales. Doblete (el límite de un par fuente–sumidero que se acercan hasta solaparse) W=m/zW = m/z. En forma polar W=(m/r)(cosθisinθ)W = (m/r)(\cos\theta - i\sin\theta), es decir ϕ=(m/r)cosθ\phi = (m/r)\cos\theta, ψ=(m/r)sinθ\psi = -(m/r)\sin\theta.

Sumémoslos.

W(z)=Uz+mzW(z) = Uz + \frac{m}{z}

En polares,

ψ(r,θ)=U ⁣(rR2r)sinθ,RmU\psi(r,\theta) = U\!\left(r - \frac{R^2}{r}\right)\sin\theta, \qquad R \equiv \sqrt{\tfrac{m}{U}}

donde RR es la escala de longitud fijada por el cociente entre la intensidad del doblete y la velocidad de la corriente. Busquemos dónde se anula ψ\psi. O bien sinθ=0\sin\theta = 0 (eje xx), o bien r=Rr = R. La segunda condición es decisiva. El círculo completo de radio RR es una sola línea de corriente.

Bajo la hipótesis no viscosa, cualquier línea de corriente puede sustituirse por una pared sólida sin alterar el flujo fuera de ella. Promovemos pues r=Rr = R a la superficie del cilindro. Corriente uniforme más un doblete — la suma de dos funciones elementales — es la solución exacta no viscosa para el cilindro circular en una corriente uniforme. Nadie dibujó el círculo; lo dibujó la fórmula.

Probemos la simulación de abajo manipulándola directamente.

W(z) = Uz + m/z + iΓ/(2π)·ln(z). When Γ=0 the picture is symmetric — d'Alembert's zero drag. Slide Γ to break the symmetry and lift appears (Kutta–Joukowski).

Al subir U y m en paralelo cambia el radio R=m/UR = \sqrt{m/U}. Al desplazar Γ lejos de cero se rompe la simetría arriba–abajo — ése es el mecanismo de sustentación de la próxima sección. Activando stream y equipotential al mismo tiempo se ve cómo las dos familias forman una retícula perpendicular en todo el plano.

Una circulación, y aparece la sustentación#

Sobre la superficie del cilindro la distribución de velocidades es simétrica entre la mitad superior e inferior. El teorema de Bernoulli convierte esa simetría en una distribución de presión también simétrica. La fuerza neta es cero. De ahí saldrá la paradoja de d'Alembert. Para romper la simetría hace falta circulación (la integral del componente tangencial de la velocidad alrededor del cuerpo). El potencial complejo de un vórtice puntual es W=i(Γ/2π)lnzW = -i(\Gamma/2\pi)\ln z. Lo sumamos encima.

W(z)=Uz+mziΓ2πlnzW(z) = Uz + \frac{m}{z} - i\,\frac{\Gamma}{2\pi}\ln z

Ahora la velocidad arriba del cilindro es mayor que abajo. La presión es más baja arriba y más alta abajo. Aparece sustentación. El teorema de Kutta–Joukowski lo cierra: la sustentación por unidad de envergadura es L=ρUΓL' = \rho U \Gamma — Kutta en 1902 y Joukowski en 1906, de forma independiente. La asimetría que crea el deslizador Γ en la simulación de arriba es exactamente esto.

Superposición — todo flujo no viscoso es una suma#

La función de corriente cumple la ecuación de Laplace 2ψ=0\nabla^2\psi = 0, que es lineal. La suma de dos soluciones es otra solución. Esa sola línea sostiene la mitad de la mecánica de fluidos del siglo XIX.

Bastan cuatro ladrillos. Uniform ψ=Uy\psi = Uy. Source/Sink ψ=±(q/2π)θ\psi = \pm(q/2\pi)\theta. Vortex ψ=(Γ/2π)lnr\psi = -(\Gamma/2\pi)\ln r. Doblete ψ=msinθ/r\psi = -m\sin\theta/r. Colocados sobre el plano, dan en sucesión cuerpos semi-infinitos, óvalos de Rankine y cilindros rotantes.

Each preset is a sum of elementary flows. The same machinery — superposition of ψ — builds half-bodies, ovals, and lifting cylinders.

Cylinder = U + doublet es la figura de antes. Rankine half-body es la corriente uniforme más una sola fuente — aparece un punto de estancamiento en forma de nariz aguas arriba. Rankine oval pone una fuente y un sumidero sobre el mismo eje, y el resultado se cierra en un cuerpo finito. Lifting cylinder añade un vórtice al par del cilindro para producir la asimetría arriba–abajo.

La paradoja de d'Alembert — qué nos enseñó el arrastre cero#

Si integramos la presión superficial del cilindro a partir de W=Uz+m/zW = Uz + m/z, sale exactamente arrastre cero. Lo dedujo el propio d'Alembert en 1752. Y él sabía que aquello era una contradicción. Cualquiera que arrastre un palo por el agua siente resistencia. Los supuestos de fluido no viscoso, irrotacional e incompresible no la pueden fabricar.

La resolución tardó casi siglo y medio. En 1904 Prandtl identificó la capa límite — una región fina cerca de la pared en la que la viscosidad, por pequeña que sea, domina. Dentro de esa capa el flujo puede desprenderse, vórtices se sueltan aguas abajo y la estela rompe la simetría aguas arriba–aguas abajo de la presión. Esa asimetría es el arrastre.

La respuesta de d'Alembert no es errónea. Es la respuesta exacta para un fluido sin viscosidad. Que esa respuesta no coincida con la realidad fue lo que abrió la puerta de la mecánica de fluidos moderna.

Sesenta líneas de NumPy — siguiendo W(z)W(z)#

import numpy as np
import matplotlib.pyplot as plt
 
def cylinder_potential(z, U=1.0, m=1.0, gamma=0.0):
    """Devuelve (phi, psi) para W = Uz + m/z - i*gamma/(2π)*ln(z)."""
    safe_z = np.where(np.abs(z) < 1e-9, 1e-9 + 0j, z)
    W = U * safe_z + m / safe_z - 1j * gamma / (2 * np.pi) * np.log(safe_z)
    return W.real, W.imag  # (phi, psi)
 
def velocity_from_W(z, U=1.0, m=1.0, gamma=0.0):
    """dW/dz = u - iv. Tomar el conjugado para recuperar (u, v)."""
    safe_z = np.where(np.abs(z) < 1e-9, 1e-9 + 0j, z)
    dW = U - m / safe_z**2 - 1j * gamma / (2 * np.pi * safe_z)
    return dW.real, -dW.imag
 
def cylinder_surface_pressure(theta, U=1.0, R=1.0, gamma=0.0):
    """Coeficiente de presión cp sobre el cilindro (Bernoulli + Γ)."""
    u_t = -2 * U * np.sin(theta) - gamma / (2 * np.pi * R)
    return 1 - (u_t / U) ** 2  # cp = 1 - (V/U)^2
 
def integrate_drag_lift(U=1.0, R=1.0, gamma=0.0, N=1024):
    """Integral no viscosa de la presión → (drag, lift) / (rho U^2 R)."""
    theta = np.linspace(0, 2 * np.pi, N, endpoint=False)
    cp = cylinder_surface_pressure(theta, U, R, gamma)
    drag = -np.trapz(cp * np.cos(theta), theta)
    lift = -np.trapz(cp * np.sin(theta), theta)
    return drag, lift
 
if __name__ == "__main__":
    U, m, gamma = 1.0, 1.0, 0.0
    R = np.sqrt(m / U)
 
    drag0, lift0 = integrate_drag_lift(U, R, gamma=0)
    drag1, lift1 = integrate_drag_lift(U, R, gamma=-3.0)
    print(f"Γ=0    : drag = {drag0:+.4e}, lift = {lift0:+.4e}")  # ambos ~ 0
    print(f"Γ=-3.0 : drag = {drag1:+.4e}, lift = {lift1:+.4e}")  # lift = -ρUΓ
 
    x = np.linspace(-3, 3, 400)
    y = np.linspace(-2, 2, 240)
    X, Y = np.meshgrid(x, y)
    Z = X + 1j * Y
    Z_out = np.where(np.abs(Z) < R, np.nan, Z)
    _, psi = cylinder_potential(Z_out, U, m, gamma=-3.0)
 
    fig, ax = plt.subplots(figsize=(7, 4))
    ax.contour(X, Y, psi, levels=24, linewidths=0.7)
    ax.add_patch(plt.Circle((0, 0), R, color="white", ec="k"))
    ax.set_aspect("equal"); plt.show()

Al ejecutarlo aparecen estas dos líneas.

Γ=0    : drag = +1.7e-15, lift = -3.5e-16
Γ=-3.0 : drag = -2.0e-14, lift = +3.000e+00

El arrastre es siempre cero. La sustentación se ajusta exactamente a ρUΓ-\rho U \Gamma (con ρ=1,U=1\rho=1, U=1 da L=3L' = 3). D'Alembert tenía razón. Lo que estaba mal era el modelo.

Tres cosas para recordar#

  • El potencial complejo de dos términos W=Uz+m/zW = Uz + m/z es la solución exacta no viscosa para un cilindro en una corriente uniforme — nadie dibujó el círculo, y sin embargo aparece.
  • Las ecuaciones de Cauchy–Riemann no son una mera condición de derivabilidad: son la razón por la que ϕ\phi y ψ\psi de un flujo 2D irrotacional vienen emparejadas dentro de una sola función holomorfa.
  • El "arrastre cero" no es una respuesta equivocada. Es el retrato honesto de un fluido sin viscosidad, y ese retrato apuntó al origen de la teoría de la capa límite.

Comparte si te resultó útil.