Skip to content
cfd-lab:~/ko/posts/2026-07-09-rayleigh-bena…● online
NOTE #097DAY THU 유체역학DATE 2026.07.09UPDATED 2026.10.19READ 4 min read#Fluid-Mechanics#Rayleigh-Benard#Natural-Convection#Lorenz-System#Flow-Phenomena

냄비 바닥에서 시작된 카오스 — Rayleigh–Bénard 대류와 Lorenz 방정식

두께를 두 배로 하면 Rayleigh 수는 8배다. 그 8배는 ρ=8이라, 카오스 문턱 24.74에는 아직 닿지 않는다.

1900년, 앙리 베나르(Henri Bénard)는 얇은 기름층을 바닥부터 데우다 액체가 스스로 육각 벌집으로 갈라지는 것을 봤다. 젓지 않았다. 16년 뒤 레일리 경이 그 문턱을 숫자 하나로 적었고, 47년 뒤 로렌츠는 같은 계에서 카오스를 꺼냈다.

문턱은 Rayleigh 수 1708이다. 그 아래는 전도, 그 위는 롤이다. 롤을 세 식으로 자르면 가열 파라미터 ρ가 남고, 24.74를 넘기면 고정점이 궤적을 붙잡지 못한다.

Ra 슬라이더를 1708 아래로 내리면 입자가 거의 멈추고, 그 위로 밀면 서로 반대로 도는 롤이 켜진다.

Rac = 1708전도 (still) — conduction

1708 아래의 온도는 수평층으로만 쌓인다. 넘긴 뒤 슬라이더를 더 밀면 같은 롤이 더 빨리 돈다.

정지한 액체는 왜 움직이기 시작하나#

아래가 뜨겁고 위가 찬 층. 데워진 아래쪽은 팽창해 가벼워진다. 가벼운 것이 아래, 무거운 것이 위. 부력은 이 배치를 뒤집으려 한다.

바로 솟지는 않는다. 점성은 흐름을 붙잡고, 열확산은 올라가는 덩어리의 열을 주변에 흘려 부력을 죽인다. 둘 다 브레이크다.

부력이 이기면 순환, 즉 대류 롤이 생긴다. 브레이크가 이기면 액체는 그대로고 열은 전도만 탄다. 부력이 통로에서 새면 롤까지 가지도 못한다. 굴뚝을 1 m 낮춰 드래프트 7 Pa이 사라진 경우가 그 예산이다.

Rayleigh 수 — 뒤엎으려는 힘과 붙잡는 힘의 비#

힘겨루기를 무차원수 하나로 누르면 Rayleigh 수다.

Ra=gβ ΔT L3ν α\mathrm{Ra} = \frac{g \beta \, \Delta T \, L^3}{\nu \, \alpha}

gg는 중력 가속도, β\beta는 열팽창 계수(온도가 오를 때 부피가 늘어나는 정도), ΔT\Delta T는 위아래 온도차, LL은 액체층 두께, ν\nu는 동점성 계수, α\alpha는 열확산 계수다. 분자는 뒤엎으려는 부력, 분모는 붙잡는 점성과 확산이다.

큰 자리는 L3L^3이다. 층이 두꺼워지면 Rayleigh 수는 세제곱으로 커진다. 얇은 기름막은 좀처럼 대류하지 않는다. 깊은 바다나 맨틀은 아주 작은 온도차에도 움직인다. 냄비를 조금만 깊게 해도 문턱이 성큼 가까워지는 이유다.

임계 Rayleigh 수 1708 — 대류가 켜지는 문턱#

레일리의 선형 안정성 분석은 경계 조건마다 숫자가 다르다. 위아래가 자유로운 이상적 경계에서 문턱은 Rac=27π4/4≈657.5\mathrm{Ra}_c = 27\pi^4/4 \approx 657.5. 실험에서 흔한 강체 벽에서는 Rac≈1708\mathrm{Ra}_c \approx 1708이다.

Ra<Rac\mathrm{Ra} < \mathrm{Ra}_c이면 작은 흔들림은 점성과 확산에 먹혀 사라진다. 액체는 정지로 돌아간다. Ra>Rac\mathrm{Ra} > \mathrm{Ra}_c를 넘는 순간, 특정 파장의 흔들림이 스스로 자란다. 대류 롤의 씨앗이다.

657.5와 1708을 나누면 약 2.6이다. 같은 유체, 같은 두께라면 강체 벽은 온도차를 약 2.6배 더 요구한다. 두께로 메우면 세제곱근이라, 2.61/3≈1.372.6^{1/3} \approx 1.37배면 된다. 뚜껑을 자유 미끄럼에서 강체로 바꾸는 대가가 이 정도다.

대류 롤의 모양과 Nusselt 수#

문턱 직후의 롤은 특정 파장을 고른다. 임계 파수는 kc≈3.117/Lk_c \approx 3.117/L이다. 한 파장의 길이는 2π/k2\pi/k라, 3.1173.117로 나누면 약 2.02L2.02L이다. 맞붙은 롤 두 개가 그 파장이고, 롤 하나의 폭은 절반인 LL 근처다. 정사각형이라는 말은 이 나눗셈이다. 가장 낮은 Ra에서 켜지는 모드가 그 파장을 갖는다.

열이 얼마나 더 나가는지는 **Nusselt 수(전체 열전달/순수 전도 열전달 비)**다.

Nu=qtotalqconduction\mathrm{Nu} = \frac{q_\text{total}}{q_\text{conduction}}

qtotalq_\text{total}은 실제 열유속, qconductionq_\text{conduction}은 대류가 없을 때의 전도 열유속이다. 전도만 있으면 Nu=1\mathrm{Nu}=1. 대류가 세지면 실험적으로 Nu∼Ra1/3\mathrm{Nu} \sim \mathrm{Ra}^{1/3} 정도다. 이 지수만 읽으면 Ra가 8배가 될 때 Nu는 2배다. 문턱 직후는 해당하지 않는다. 거기서는 Nu가 아직 1 근처다.

Lorenz가 세 방정식으로 줄인 대류#

1963년 에드워드 로렌츠는 온도장과 유동장을 가장 굵은 모드만 남기고 잘랐다. Galerkin 절단이다. 편미분 방정식이 상미분 세 개로 줄어든다.

x˙=σ(y−x)y˙=x(ρ−z)−yz˙=xy−βz\begin{aligned} \dot{x} &= \sigma (y - x) \\ \dot{y} &= x(\rho - z) - y \\ \dot{z} &= xy - \beta z \end{aligned}

xx는 대류 롤의 순환 세기, yy는 상승·하강 기둥의 온도차, zz는 수직 온도 분포의 뒤틀림이다. σ\sigma는 Prandtl 수(운동량 확산/열 확산 비), β\beta는 기하 상수, ρ\rho는 Ra/Rac\mathrm{Ra}/\mathrm{Ra}_c다.

ρ\rho를 올리는 것은 냄비를 더 세게 데우는 것이다. ρ<1\rho<1이면 궤적은 원점으로 간다. 전도다. 1<ρ<24.741<\rho<24.74이면 원점이 아닌 고정점으로 모인다. 정상 롤이다. ρ>24.74\rho>24.74를 넘으면 어느 고정점에도 안착하지 않고 두 날개 사이를 돈다. 카오스다.

정상점은 세 도함수를 0으로 둔 자리다. σ≠0\sigma \neq 0이면 y=xy=x다. x≠0x \neq 0이면 z=ρ−1z=\rho-1이다. 남은 식은 x2=β(ρ−1)x^2 = \beta(\rho-1)이다. 코드의 β=8/3\beta = 8/3, ρ=15\rho = 15이면 z=14z=14, x2=112/3≈37.3x^2 = 112/3 \approx 37.3이다. 가운데 출력 steady roll은 꼬리 4000점에서 xx의 폭이 0.1보다 좁다는 뜻이다. ρ=28\rho=28이면 z=27z=27, x2=72x^2=72라 두 날개가 그 자리에 있고, 출력 chaos는 그 꼬리가 0.1 문을 통과하지 못했다는 뜻이다.

Python — 대류의 세 얼굴을 적분한다#

4차 Runge–Kutta다. σ=10\sigma=10, β=8/3\beta=8/3, 시간 간격 0.01, 20000걸음. 꼬리는 마지막 4000점이다.

import numpy as np
 
SIGMA, BETA = 10.0, 8.0 / 3.0
 
def lorenz_deriv(state, rho):
    x, y, z = state
    return np.array([
        SIGMA * (y - x),        # 롤 순환 세기의 변화
        x * (rho - z) - y,      # 상승·하강 온도차의 변화
        x * y - BETA * z,       # 수직 온도 왜곡의 변화
    ])
 
def integrate_rk4(rho, dt=0.01, n=20000, s0=(0.6, 0.4, 0.2)):
    s = np.array(s0, dtype=float)
    traj = np.empty((n, 3))
    for i in range(n):
        k1 = lorenz_deriv(s, rho)
        k2 = lorenz_deriv(s + 0.5 * dt * k1, rho)
        k3 = lorenz_deriv(s + 0.5 * dt * k2, rho)
        k4 = lorenz_deriv(s + dt * k3, rho)
        s = s + (dt / 6.0) * (k1 + 2 * k2 + 2 * k3 + k4)
        traj[i] = s
    return traj
 
def convection_regime(rho):
    tail = integrate_rk4(rho)[-4000:]          # 초기 과도를 버린 꼬리
    spread = tail[:, 0].max() - tail[:, 0].min()
    if abs(tail[-1, 0]) < 1e-3 and rho < 1.0:
        return "conduction"                     # 원점으로 수렴
    if spread < 0.1:
        return "steady roll"                    # 고정점으로 수렴
    return "chaos"                              # 두 날개 사이 진동
 
for rho in (0.8, 15.0, 28.0):
    print(f"rho={rho:5.1f} -> {convection_regime(rho)}")

출력은 세 줄이다.

rho=  0.8 -> conduction
rho= 15.0 -> steady roll
rho= 28.0 -> chaos
카오스 — 나비 날개 (chaotic convection)
가로축 x = 롤 순환 세기, 세로축 z = 수직 온도 왜곡. 노란 점 = 고정점 C±.

ρ 슬라이더를 24.74 아래에 두면 궤적은 노란 고정점 하나로 들어간다. 넘기면 나비 날개가 열린다. reset은 시작점을 조금 옮기는데, 처음 겹치던 두 궤적이 곧 갈라진다.

1708만 넘기면 끝났다고 적으면 실패한다#

두께를 두 배로 하면 L3L^3 때문에 Ra는 8배다. 막 1708에 걸린 층을 그렇게 깊게 하면 ρ=Ra/Rac=8\rho = \mathrm{Ra}/\mathrm{Ra}_c = 8이다. 로렌츠의 정상 롤 구간은 1과 24.74 사이다. 8은 그 안이다. 카오스까지 가려면 ρ를 24.74까지 올려야 하고, 같은 온도차에서 두께는 24.741/3≈2.924.74^{1/3} \approx 2.9배다. 문턱 직후의 롤을 카오스라고 적으면 이 간격만큼 틀린다.

그 간격은 β\beta를 상수로 둔 채 ΔT\Delta T만 키워 만든다. 온도차가 30 K를 넘는 순간, 이 상수가 먼저 거짓이 되지 않을까. 그 온도에서 Boussinesq가 무너지는 쪽을 열면, 1708과 24.74 중 어느 쪽이 먼저 숫자를 잃는지가 보인다.

도움이 됐다면 공유해주세요.