표범 반점을 만든 규칙이 얼룩을 둘로 가른다 — Gray-Scott 반응확산

반응확산 자기복제는 서로 다른 속도로 퍼지는 두 화학종이 반응하는 것만으로 얼룩 하나가 자라다 허리가 잘록해져 둘로 갈라지는 현상이다. Gray-Scott 모델의 좁은 파라미터 창(λ 레짐)에서만 나타나며, 유전자나 주형 없이도 연료 확산과 자기촉매 기하학만으로 ‘복제’에 가까운 동역학이 성립한다.

표범 등의 반점이나 산호 표면의 얼룩덜룩한 무늬는 누가 밑그림을 그려 준 것이 아니라, 물질이 서로 반응하고 번지는 것만으로 저절로 잡힌 무늬다. 그리고 이 자기조직의 원리를 조금 더 밀어붙이면, 접시 위 화학 얼룩 하나가 자라다 허리가 잘록해져 둘로 갈라지고, 그 딸 얼룩이 또 갈라지며 스스로 불어난다.

밝은 크림색 배경의 플랫 벡터 인포그래픽. 왼쪽 패널에는 표범 가죽 반점과 산호 표면의 얼룩덜룩한 무늬 아이콘이 세로로 놓여 '자연이 스스로 그린 무늬'를 이루고, 오른쪽 패널에는 둥근 접시 세 개가 화살표로 이어져 작은 얼룩 하나가 땅콩 모양으로 늘어났다가 둘로 갈라지는 과정을 보여준다.

밑그림 없이 저절로 잡히는 무늬 — 튜링에서 화학 얼룩까지

이런 무늬가 어디서 오는지 처음 수학으로 캐물은 사람은 앨런 튜링이다. 1952년, 그는 성질이 다른 두 물질이 반응하면서 서로 다른 속도로 번지기만 해도 처음엔 고르던 화학 농도가 저절로 얼룩덜룩하게 갈라질 수 있음을 보였다.

표범의 반점도 물고기의 줄무늬도, 따지고 보면 이 형태형성 이론의 후손이다.

튜링의 예언에는 더 극적인 장면이 숨어 있었다. 1994년, 텍사스대와 로스앨러모스의 리·매코믹·피어슨·스위니 연구진은 페로시안화물·요오드산·아황산이 섞이는 반응(FIS 반응)을 얕은 젤 위에서 지켜보다 뜻밖의 장면을 만난다. 화학 얼룩 하나가 자라다 잘록해지며 둘로 갈라지고, 그 딸 얼룩이 다시 갈라져 접시를 채운 것이다. 접시가 얼룩으로 빽빽해지면 과밀해진 얼룩은 도로 사그라들었다. 성장과 분열과 죽음이 한자리에서 되풀이됐다. 이 실험은 경계로 화학종을 끊임없이 대주는 젤 반응기 위에서 이뤄졌다.

논문은 이 현상을 한 문장으로 요약한다. 본문은 페이월에 막혀, 초록에서만 읽을 수 있는 문장이다.

spot patterns that undergo a continuous process of ‘birth’ through replication and ‘death’ through overcrowding… can be reproduced by a simple two-species model

출처: Lee, McCormick, Pearson, Swinney, “Experimental observation of self-replicating spots in a reaction–diffusion system”, Nature 369:215 (1994), 초록

‘복제’는 상상 속 비유가 아니라 접시 위에 실제로 찍힌 동역학이었던 셈이다. 그렇다면 유전자도 주형도 없는 화학 얼룩이 대체 무슨 수로 스스로를 둘로 늘리는 걸까. 실마리는 서로 다른 속도로 번지는 두 화학종에 있다.

반응확산이란 — 나를 불리는 U와 나를 갉아먹는 V

반응확산(reaction–diffusion)은 이름 그대로 두 가지 일이 한꺼번에 벌어지는 계다. 화학종끼리 반응해 서로를 만들거나 없애는 동시에, 각자 다른 속도로 사방으로 번진다. 이 둘이 맞물리는 순간, 균일하던 농도장이 저절로 무늬로 갈라진다.

Gray-Scott 모델은 이 원리를 뼈대만 남기고 추린 두 화학종짜리 계다. 하나는 밖에서 계속 채워 주는 연료 U, 다른 하나는 그 연료를 먹고 자신을 불리는 자기촉매 V다. 자기촉매라는 말부터 짚고 가자.

자기촉매 반응은 자기 자신을 만드는 데 자기 자신이 있어야 하는 반응이다. 생성물이 곧 촉매라서, 이미 쌓인 양이 많을수록 더 빨리 더 많이 만들어진다. 눈덩이가 커질수록 더 빠르게 커지는 것과 같다.

Gray-Scott에서 이 자기촉매는 U 하나와 V 둘이 만나 V 셋이 되는 반응, 곧 U+2V→3V로 적는다. V가 많은 곳일수록 U를 더 빠르게 V로 바꾸니, V는 제 자리를 스스로 넓혀 간다. 그렇게 만들어진 V는 다시 서서히 불활성 물질로 빠져나간다. 이 주고받음을 두 줄의 편미분방정식으로 옮기면 이렇게 된다.

(1) $$ \frac{\partial u}{\partial t} = D_u \nabla^2 u – uv^2 + F(1-u), \\ \frac{\partial v}{\partial t} = D_v \nabla^2 v + uv^2 – (F+k)v $$

식 1에서 $\nabla^2$ 항은 번짐, 곧 확산이고 $uv^2$ 항이 자기촉매 반응이다. u는 연료 농도, v는 자기촉매 농도를 뜻한다. F는 연료를 새로 채워 넣는 공급률, k는 V가 빠져나가는 소멸률이다. 눈여겨볼 것은 두 확산계수 $D_u$와 $D_v$가 다르다는 점이다. 연료가 자기촉매보다 대략 두 배 빠르게 번진다는 이 사소해 보이는 차이가, 뒤에 오는 모든 이야기의 씨앗이 된다.

왜 하필 갈라지는가 — 연료는 가장자리로만 들어온다

자기촉매가 제 자리를 넓혀 간다면 얼룩은 그저 점점 커질 법도 하다. 그런데 실제로는 하필 둘로 갈라진다. 열쇠는 연료가 얼룩 속으로 들어오는 길에 있다.

얼룩 한복판은 이미 V로 빽빽하다. V는 만나는 족족 U를 먹어 치우니, 안쪽 연료는 진작에 바닥나 있다. 새 연료가 들어올 길은 얼룩 바깥의 성한 영역에서 가장자리를 타고 스며드는 것뿐이다. 그래서 얼룩이 자랄 수 있는 곳은 테두리로 한정되고, 얼룩은 동그란 채 커지는 대신 길쭉하게 늘어난다. 몸통이 길어질수록 중앙은 양쪽 가장자리 어디에서도 멀어지고, 연료가 끝내 닿지 못한 허리가 잘록해지다 끊어진다. 하나였던 얼룩이 둘이 되는 순간이다.

한 얼룩이 둘로 갈라지는 다섯 단계 연료 확산 유입 가장자리에서만 자기촉매 V 증폭 U+2V→3V 중심부 연료 고갈 안쪽 U 바닥남 허리 잘록해짐 중앙이 가장자리서 멀어짐 두 딸 얼룩으로 분열 하나가 둘로
그림 1. 한 얼룩이 둘로 갈라지기까지의 다섯 단계. 성장은 테두리에서만 일어나고, 중심은 연료가 닿지 않아 잘록해진다.

그림 1은 이 과정을 다섯 단계로 끊어 본 것이다. 가장자리로만 드는 연료, 그 연료를 먹고 증폭하는 자기촉매, 중심부의 연료 고갈, 잘록해지는 허리, 그리고 두 딸 얼룩으로의 분열. 어느 단계에도 유전 정보나 주형은 끼어들지 않는다. 오직 식 1의 확산과 반응만 있을 뿐이다.

이 분열은 세포분열이 아니다. 겉모습이 생물의 번식과 닮았다고 해서 얼룩 속에 복제할 설계도가 든 것은 아니다. 얼룩을 둘로 가르는 것은 유전이 아니라, 연료가 가장자리로만 들어온다는 순수한 기하학이다.

같은 규칙이라도 그림으로 보는 것과 손으로 굴려 보는 것은 다르다. 이제 이 방정식을 격자 위에 직접 올려 보자.

시뮬레이션으로 직접 키워보기 — 성장에서 분열까지

화학 반응을 배열 연산으로 옮기는 일은 생각보다 단출하다. 격자 칸마다 u와 v를 놓고, 이웃과의 차이로 확산을 흉내 내고, 식 1의 반응항을 더해 시간을 한 칸씩 밀어 주면 그만이다.

가로로 늘어놓은 시뮬레이션 스냅샷들. 첫 칸엔 작은 얼룩 하나, 가운데 칸들에선 얼룩이 길쭉해졌다가 여러 개로 갈라지고, 마지막 칸에선 접시가 얼룩으로 빽빽하다.
그림 2. 자체 Gray-Scott 시뮬레이션의 스냅샷. 작은 교란 하나가 자라 고리처럼 벌어지고, 허리들이 잘록해지며 딸 얼룩들로 거듭 갈라져 접시를 채운다. 라벨은 무차원 시뮬레이션 스텝이다.

그림 2는 그렇게 돌린 자체 시뮬레이션의 스냅샷이다. 한복판에 심은 작은 교란 하나가 자라 고리처럼 벌어지고, 허리들이 잘록해지며 딸 얼룩들로 거듭 갈라져 접시를 메운다. 눈으로 보는 것으로 끝내지 말고, 정말 그렇게 되는지 숫자로 확인해 보자. 아래 코드는 96×96 격자에서 얼룩 개수를 스텝마다 세어 출력한다.

import numpy as np
from collections import deque

def laplacian(Z):
    # 상하좌우 이웃과의 차이 — 5점 스텐실
    return (-4*Z + np.roll(Z, 1, 0) + np.roll(Z, -1, 0)
            + np.roll(Z, 1, 1) + np.roll(Z, -1, 1))

def count_spots(v, thresh=0.2):
    # v가 문턱을 넘는 칸을 4-이웃으로 묶어 얼룩 개수를 센다
    mask = v > thresh
    seen = np.zeros_like(mask, dtype=bool)
    H, W = mask.shape
    n = 0
    for i in range(H):
        for j in range(W):
            if mask[i, j] and not seen[i, j]:
                n += 1
                dq = deque([(i, j)]); seen[i, j] = True
                while dq:
                    a, b = dq.popleft()
                    for da, db in ((1, 0), (-1, 0), (0, 1), (0, -1)):
                        na, nb = (a + da) % H, (b + db) % W
                        if mask[na, nb] and not seen[na, nb]:
                            seen[na, nb] = True
                            dq.append((na, nb))
    return n

F, k = 0.035, 0.062            # λ 레짐 안의 한 점 (재확인 필요)
Du, Dv, N = 0.16, 0.08, 96
rng = np.random.default_rng(7)
u = np.ones((N, N))
v = np.zeros((N, N))
c = N // 2
yy, xx = np.ogrid[:N, :N]
seed = (yy - c) ** 2 + (xx - c) ** 2 <= 4 ** 2   # 한복판에 작은 교란 하나
u[seed] = 0.5
v[seed] = 0.25
u += 0.01 * rng.standard_normal((N, N))          # 아주 작은 잡음
v += 0.01 * rng.standard_normal((N, N))

for t in range(7001):
    if t in (0, 3000, 4000, 5000, 6000, 7000):
        print(f"t={t:>5}  얼룩 {count_spots(v):>2}개")
    uvv = u * v * v
    u += Du * laplacian(u) - uvv + F * (1 - u)
    v += Dv * laplacian(v) + uvv - (F + k) * v
t=    0  얼룩  1개
t= 3000  얼룩  1개
t= 4000  얼룩  3개
t= 5000  얼룩 15개
t= 6000  얼룩 26개
t= 7000  얼룩 27개

한복판의 교란은 한참 동안 얼룩 하나로 머문다. 스텝 3000까지도 여전히 하나다. 겉보기엔 멈춘 듯하지만 속으로는 길쭉하게 늘어나는 중이고, 어느 순간 허리가 끊어지며 셋으로, 다시 열다섯, 스물여섯으로 불어난다. 접시가 차면 개수는 스물일곱 언저리에서 멎는다. 여기서 개수가 줄지는 않는다 — 새로 갈라질 빈자리가 없어 성장이 평평해질 뿐이다. 논문이 과밀에 따른 ‘죽음’이라 부른 대목이 바로 이 포화로, 얼룩의 탄생과 소멸이 엇비슷해져 전체 수가 더는 늘지 않는 동적 평형을 가리킨다.

직접 돌려 볼 때 흔히 걸려 넘어지는 지점 하나. 완전히 균일한 초기조건, 곧 어디서나 u=1이고 v=0인 상태에서 출발하면 아무 일도 일어나지 않는다. 대칭이 완벽해 깨질 구석이 없기 때문이다. 자기촉매 불안정성에 불을 붙이려면, 한복판에 작은 얼룩 하나, 곧 유한한 크기의 교란을 반드시 심어 줘야 한다.

몇 줄짜리 규칙과 교란 하나면 접시 전체가 갈라지는 얼룩으로 찬다. 그런데 이 일은 아무 파라미터에서나 벌어지지 않는다.

λ 레짐 — 성장·분열·죽음이 갈리는 좁은 문턱

방금 시뮬레이션에 쓴 값은 F=0.035, k=0.062였다. 이 두 수를 조금만 건드리면 얼룩은 갈라지길 멈춘다. 공급률 F와 소멸률 k가 이루는 평면 위에서, 자기복제가 허락되는 영역은 놀랄 만큼 좁다.

가로축 소멸률 k, 세로축 공급률 F인 색칠된 상도. 안정 반점·자기복제·미로·소멸 네 영역이 색으로 구분되고, 자기복제 영역은 좁은 띠로 나타난다.
그림 3. (F, k) 평면의 상도. 각 점은 그 파라미터로 시뮬레이션한 결과를 안정 반점·자기복제(λ)·미로·소멸로 분류해 색칠했다. 자기복제가 일어나는 λ 띠는 좁다.

그림 3는 (F, k) 평면의 여러 점에서 식 1를 같은 시간만큼 굴린 뒤, 결과를 네 갈래로 색칠한 상도다. 어떤 값에선 얼룩이 하나 생겨 그대로 멈추고(안정 반점), 어떤 값에선 무늬가 끝없이 번져 미로처럼 뒤엉키고, 또 어떤 값에선 얼룩이 아예 사그라든다(소멸). 이 셋 사이의 좁은 띠, 딱 그 안에서만 얼룩이 자라고 갈라지길 되풀이한다. 이 띠를 흔히 λ 레짐이라 부른다.

λ 레짐이 얼마나 좁은지는 상도의 색 띠 두께가 그대로 말해 준다.

성장·분열·죽음을 가르는 문턱들이 서로 바짝 붙어 있어서, 파라미터가 조금만 흔들려도 얼룩은 전혀 다른 운명을 맞는다.

문턱 하나 차이 — 그 좁은 창을 넘으면 미로가 된다

‘조금만 흔들려도’가 정말 얼마나 조금인지, 경계를 크게 당겨서 보자.

λ 레짐 경계를 확대한 등고선 그림. 가로로 그은 파라미터 스윕 경로를 따라 색이 소멸에서 자기복제, 미로로 바뀐다.
그림 4. λ 경계를 확대한 연속 필드. k를 고정하고 F만 훑는 직선 경로를 겹치면, 좁은 F 구간에서 소멸 → 자기복제 → 미로로 결과가 잇달아 바뀐다.

그림 4는 λ 레짐의 한쪽 경계를 크게 당겨 본 그림이다. k를 고정한 채 F만 촘촘히 훑는 직선 경로를 상도 위에 겹쳐 그렸다. 경로를 따라가면 아주 좁은 F 구간 안에서 결과가 소멸에서 자기복제로, 다시 미로 무늬로 잇달아 갈아탄다. 손가락 한 마디 폭도 안 되는 이동만으로 얼룩의 운명이 세 번 갈리는 셈이다.

이 좁음은 사소한 사실이 아니다. 자기복제라는 극적인 현상이 물리 법칙에 깊이 새겨진 필연이 아니라, 파라미터 공간의 가느다란 틈에서만 잠깐 허락되는 우연에 가깝다는 뜻이기 때문이다. 조건이 맞으면 얼룩은 스스로 불어나고, 조금만 어긋나면 그냥 멈추거나 뒤엉켜 버린다.

유전자도 주형도 없이 — ‘복제’가 성립하는 조건

이제 처음의 물음으로 돌아오자. 유전자도 주형도 없는 화학 얼룩이 무슨 수로 스스로를 복제하는가.

지금까지 본 성립 조건은 두 가지다. 하나는 연료를 끊임없이 대주는 것이다. 1994년 실험이 젤 반응기로 경계에 화학종을 계속 흘려 넣은 이유가 여기 있다. 공급이 끊기면 계는 평형으로 가라앉고 얼룩은 사그라든다. 열린 계로 남아 있는 동안에만 복제가 이어진다.

다른 하나는 파라미터를 좁은 λ 창 안에 붙들어 두는 것이다. 그 창을 한 발만 벗어나도 얼룩은 갈라지길 멈춘다.

이 두 가지만 갖추면, 유전 정보도 효소도 없이 순수한 물리화학 불안정성만으로 ‘복제’라는 동역학이 성립한다. 생명의 전유물처럼 보이던 자기 증식이, 서로 다른 속도로 번지는 두 물질과 가장자리로만 드는 연료라는 기하학으로 풀리는 셈이다. 표범의 반점을 그린 바로 그 규칙이, 조건이 맞으면 얼룩을 둘로 가른다.

더 읽기

  • Lee, McCormick, Pearson, Swinney, "Experimental observation of self-replicating spots in a reaction–diffusion system", Nature 369:215, 1994 — 자기복제 얼룩을 처음 실험으로 관측한 원전(본문은 페이월, 초록만 접근).
  • Pearson, "Complex Patterns in a Simple System", Science 261:189, 1993 — Gray-Scott 방정식과 λ 자기복제 영역의 정본.
  • Turing, "The Chemical Basis of Morphogenesis", Philosophical Transactions of the Royal Society B, 1952 — 반응확산 형태형성 이론의 출발점.