반딧불이는 왜 동시에 깜빡일까
지휘자도 신호도 없는데, 여름밤 숲의 반딧불이들은 어느새 한꺼번에 반짝입니다. 서로의 불빛을 본다는 것만으로 이런 일이 생길 수 있을까요? 반딧불이 150마리로 확인해 봅니다.
모델은 이렇게 움직입니다
- 150마리가 화면에 흩어져 있고, 저마다 안에 "시계"(위상)가 하나 있습니다. 시계는 일정한 속도로 돌다가 한 바퀴를 채우면 반짝이고 처음으로 돌아갑니다.
- 반딧불이마다 시계가 도는 속도가 조금씩 다릅니다. 그대로 두면 서로 박자가 어긋나 제각각 깜빡입니다.
- 가까이 있는 반딧불이(볼 수 있는 범위 안)가 반짝이는 걸 보면, 자기 시계를 조금 앞당깁니다. 그 바람에 한 바퀴가 차면 바로 따라서 반짝입니다.
- 동기화 정도 r은 모든 시계를 원 위의 점으로 놓고 평균 낸 화살표의 길이입니다. 0이면 제각각, 1이면 완전히 동시입니다.
직접 돌려보기
① 밤숲 지켜보기
노랗게 빛나는 점이 지금 막 반짝인 반딧불이입니다. 처음엔 제각각이다가, 시간이 지나면 어떻게 되는지 보세요.
② 위상 시계
모든 반딧불이의 시계를 한 원 위에 놓았습니다. 맨 위가 "반짝!"이 되는 지점이에요. 점들이 한곳에 모이면 동기화된 것입니다.
③ 시간에 따른 동기화
가로는 지난 주기, 세로는 동기화 정도 r입니다. 점선(0.9)을 넘으면 거의 동시에 반짝이는 상태예요.
④ 서로 앞당겨 주는 정도를 바꾸면
가로는 결합 세기, 세로는 30주기 뒤의 동기화 정도입니다. 점은 서로 다른 숲 3곳의 결과예요.
⑤ 볼 수 있는 범위를 바꾸면
가로는 볼 수 있는 범위, 세로는 30주기 뒤의 동기화 정도입니다. 너무 가까운 이웃만 보이면 어떻게 될까요?
⑥ 입체 숲에서 보기 3D
같은 규칙, 같은 설정으로 반딧불이 150마리를 높이가 있는 숲(높이는 가로의 30%)에 흩어 놓았습니다. 볼 수 있는 범위는 이제 원이 아니라 공(옅은 구)이에요. "위상을 색으로"를 고르면 시계가 같은 반딧불이끼리 같은 색이 됩니다. 처음엔 여러 색 무리가 따로 반짝이다가, 한 색이 숲 전체로 번지는 모습을 보세요.
드래그로 회전, 휠·핀치로 확대. 가만히 두면 천천히 돌아갑니다.
이 결과가 말하는 것, 말하지 않는 것
말하는 것:
- 서로 맞추는 힘이 약하면 제각각 깜빡이고, 어느 선을 넘으면 갑자기 한 박자가 돼요. 이 모델에선 맞추는 힘이 0이면 동기화 정도 0.06, 기본 설정에선 0.87이었어요(1이 완전한 일치).
- 옆 반딧불이가 반짝이는 걸 볼 때마다 자기 시계를 살짝 앞당겨서, 박자 차이가 조금씩 줄다가 어느 순간 한꺼번에 모여요. 볼 수 있는 이웃 범위가 좁으면 덜 맞아요.
- 박자가 서로 같으면 완전히 한 박자(1.00)가 되고, 박자 차이가 클수록 불완전해요. 한 박자의 모습은 지휘자 없이 서로 영향을 주는 정도에서 나올 수 있어요.
- 그렇다면 박자가 맞으려면 두 가지가 다 문턱을 넘어야 했어요. 맞추는 힘 1%→3%에 동기화 0.17→0.95, 보는 범위 20%→40%에 0.26→0.96. 하나만 모자라도 제각각이었어요.
상세 설명
말하는 것: 서로 앞당겨 주는 정도가 일정 세기를 넘고 서로 볼 수 있는 범위가 충분하면, 중앙에서 박자를 정해 주는 존재가 없어도 반딧불이들이 스스로 한 박자로 맞춰집니다. 기준을 넘기 전에는 거의 변화가 없다가 넘는 순간 갑자기 동기화되는 문턱 현상이 나타나고, 개체마다 박자가 다를수록 동기화는 불완전해집니다.
말하지 않는 것:
- 이 시뮬레이션이 직접 보여 준 건 모델 속 시계의 동기화예요. 실제 반딧불이가 이렇게 박자를 맞춘다는 증명은 아니고, 동기화하는 종은 일부예요.
- 빛의 세기, 거리에 따른 시야, 학습은 이 모델에 없고 특정 관측 자료에 맞춘 것도 아니에요. 실제 종의 깜빡임 간격과 서로 보는 거리를 관찰해 가정과 맞는지 봐야 해요.
상세 설명
말하지 않는 것: 실제 반딧불이가 이런 식으로 박자를 맞춘다는 증명은 아닙니다. 실제 동기화하는 반딧불이 종은 일부이고, 이 모델은 반짝임을 시계 하나로 단순화했으며 빛의 세기, 거리에 따른 시야, 반딧불이의 학습 같은 요소가 없습니다. 특정 관측 자료에 맞춘 모델도 아닙니다.
이론적 근거와 구현 메모
- 모델의 뿌리: Peskin (1975)이 심장 박동 세포를 모델로 처음 다룬 "펄스 결합 진동자"를 Mirollo & Strogatz (1990)가 수학적으로 분석했습니다. 서로 모두 연결되고 똑같은 진동자들이 신호 때 서로를 조금씩 앞당기면, 거의 모든 시작 상태에서 한꺼번에 반짝이게 된다는 정리입니다. 반딧불이의 동시 점멸은 Buck & Buck (1968) 등이 관찰·설명했습니다.
- 핵심 가정과 수식: 개체마다 위상이 1주기에 걸쳐 한 바퀴를 돌고, 1에 닿으면 반짝이며 범위 안의 이웃 위상을 결합 세기만큼 앞당깁니다. 동기화 정도는 위상을 원 위의 점으로 놓고 평균 화살표의 길이
r = |평균 eiθ|(Kuramoto의 질서 변수)로 잽니다. 결합 세기, 이웃 범위, 속도 차이가 슬라이더입니다. - 이 프로젝트의 단순화: Mirollo–Strogatz 정리는 위상 곡선이 위로 볼록하고 모두가 서로 보며 속도가 같다는 조건이 필요하지만, 여기서는 위상을 선형으로 밀고 이웃이 제한되며 속도도 개체마다 다릅니다. 그래서 정리를 그대로 적용하지 않고 시뮬레이션으로 확인합니다. 한 번 반짝임으로 전달되는 크기, 0.02씩 자라는 위상, 150마리는 이 프로젝트가 정한 값입니다.
- 이론값과 시뮬레이션: 이론이 확실히 말하는 극단은 시뮬레이션과 맞습니다. 속도 차이가 0이면 최종 r은 1.00이고, 결합이 0이면 r은 0.06으로 무작위 위상의 기대 크기(1/√150, 약 0.07~0.08)와 같습니다. 기본 설정의 최종 r은 6회 평균 0.87이고, 결합 3% 이상에서 0.95 근처, 이웃 범위 40% 이상에서 0.96입니다(
node tools/validate-firefly.js). 조건이 달라 임계 결합 세기의 이론값은 없습니다. - 더 읽을거리: Mirollo & Strogatz (1990), 「Synchronization of pulse-coupled biological oscillators」, SIAM Journal on Applied Mathematics 50(6). Strogatz (2003), 『Sync』, Hyperion(교양서). Buck & Buck (1968), 「Mechanism of rhythmic synchronous flashing of fireflies」, Science 159.
- 이 프로젝트가 직접 설계한 단순화 구현이며 논문 수치를 재현한 것은 아닙니다.
- 위상은 한 주기를 1로 보고 한 단계마다 0.02씩 자랍니다. 개체마다 속도는 평균 1, 표준편차 "속도 차이"의 정규분포이고, 한 반딧불이가 반짝이면 범위 안의 이웃 위상이 결합 세기만큼 더해지며 1을 넘으면 같은 단계에 따라서 반짝입니다.
- 기본 설정(결합 2.5%, 범위 30%, 속도 차이 10%)으로 시드 10개를 돌리면 모두 동기화(r>0.9)에 닿고, 걸린 주기는 2~31주기(10개 중 7개는 2~6주기)입니다. 결합이 1% 이하면 r이 0.2 아래, 3% 이상이면 0.95 근처입니다 (
node tools/validate-firefly.js로 확인). - ⑥ 3D 숲은 바닥 1×1, 높이 0.3인 상자에 같은 규칙을 적용합니다. 반딧불이는 제자리 근처에서 살짝 떠다니는 것처럼 보일 뿐, 이웃은 처음 자리로 정해집니다. 같은 범위(30%)라도 한 마리가 보는 이웃이 평균 28마리로 2D(32마리)보다 적고 거리가 더 멀어서, 기본 설정에서 시드 10개 중 9개가 동기화(r>0.9)에 닿지만 걸린 주기는 5~66주기로 2D보다 깁니다. 하나는 150주기까지 닿지 못했습니다.
- ④, ⑤번 그래프는 같은 설정에서 해당 값만 바꿔 30주기를 3번씩 돌린 결과이고, 마지막 6주기의 평균 r입니다.