Lorenz Equations

FrontPage|FindPage|TitleIndex|RecentChanges| UserPreferences P RSS

FrontPage내가좋아하는게임BadDesignsDetail LorenzEquations

미국의 기상학자 Edward Lorenz가 1963년의 논문, Deterministic Nonperiodic Flow에서 소개한 비선형 미분 방정식. 이로부터 나비효과, StrangeAttractor 등, 혼돈 이론의 기초 개념들을 도출해내었고, 그 결과 혼돈 이론에 대한 본격적인 연구가 시작되는 계기를 이루었다.

간략한 유체역학적 의미

LorenzEquations은 간단히 말해, 공기의 대류 현상에 대한 방정식이다. 즉, 아래쪽에서 가열된 공기가 상승했다가 냉각되어 다시 하강하는 과정을 자세히 들여다보면 어떤 모습을 하고 있는가를 기술한 식이다. 원래 그의 논문에 제시된 식은 총 12개인데, '카오스'를 말할 때 항상 인용되는 것은 다음 세 개의 미분방정식이고, LorenzEquations이라고 하면 보통 이 식들을 가리킨다. 이 식들을 유도하는 과정을 이해하고, 이 식의 진짜 의미를 찾는 것까지는 무리더라도, 대략 각각의 변수가 무슨 의미인지를 알아보는 것 정도는 의미있으리라 본다.
사실, 이 방정식들은 Lorenz가 의도적으로 심하게 단순화한 것이다. 따라서, 실제의 대기 운동과는 거리가 좀 있다. Lorenz의 경우는, 어떤 철학에 근거해 단순화한 식들로부터 우연히 카오스를 발견하였지만, 그 이후의 연구자들은 거꾸로 '카오스가 잘 작동하도록' 원래의 식을 정리해나가는 경향이 있다. 그렇다고, 그 논리가 억지라는 건 아니다. 카오스의 해변에서 겨우 모래 장난이나 하던 낙지의 느낌일 뿐이니 별 믿을 바는 못되지만.


dx/dt = a(y - x)
dy/dt = rx - y - xz
dz/dt = xy - bz

(a 대신 σ를 쓰기도 한다.)
{{|
x: 대기가 상승, 하강하여 한번 순환하는 속도와 관련된 양. 대기가 움직이는 속도에 비례.
y: 순환 과정에서 나타나는 온도 차이에 대한 측도. 따뜻한 공기와 차가운 공기의 온도 차.
z: 수직 온도 분포와 관련된 양. 고도에 따른 선형 온도변화로부터의 편차.

a: Prandtl number와 관련된 양. Prandtl number는 유체의 점성도와 열전도도의 비율. 대기 자체의 성질과 관련된 계수.
b: 바라보는 대기의 영역을 공기가 담긴 상자로 생각했을 때, 상자의 가로-세로 비율.
r: Rayleigh number와 관련된 양. Rayleigh number는 유체의 물질적 특성과 유체 내부에서의 온도 분포, 즉 가열되는 바닥과 차가운 위쪽의 온도차에 의해 결정되는 값으로, 이 수가 일정한 값을 넘어서면 대류가 발생하기 시작한다. (큰 관계는 없는 얘기지만, 비슷한 양으로 Reynolds number라는 것도 있다. 유체가 흐르는 속도와 관련된 양인데, 이 수가 일정 값을 넘으면 난류 turbulence 가 나타난다.)
|}}

Lorenz는 a=10, b=8/3로 두고, r을 변화시키며 x,y,z의 행동을 살펴보았다. 즉, 아래쪽이 점점 뜨거워지면 대류 현상의 모습이 어떻게 바뀌는가를 쳐다본 것이다. 그리고, r이 적당히 큰 영역에 있을 때, 뭔가 특별한 일이 일어난다는 사실을 발견했다.
물이 끓기까지 점점 뜨거워지면서 어떻게 행동하는가 떠올려보라. 사실, r이 클 때 이상한 일이 일어난다는 건 새롭게 알아낸 사실도 아니다. Lorenz의 발견을 깎아내릴 생각까지는 없지만, 그가 한 일은, 정성적으로 이해 가능한 문제를 컴퓨터로(정량적으로, 라고 해줄까 말까?) 분석한 정도라고 생각한다. 낙지는 맥스웰보단 패러데이를 좋아하는 편이다.

약간의 수학적 분석

{{| 미분해보시라구!
-- S.S.Chern |}}

고맙게도, 미분하는 수고조차 없이 dx/dt=0, dy/dt=0, dz/dt=0 를 풀어 보면 이 곡선의 부동점(혹은 임계점, 특별한 경우에는 수렴점이 될 수 있음)을 찾을 수 있다. 풀면,
 x = y
 x(r-1-z) = 0
 x² = bz
를 얻는다. 따라서, x=0 이라면 x=y=z=0 이고, z=r-1 이라면, x=y=±√(b(r-1)), z=r-1 이다. r=1 이면 다시 한번 x=y=z=0 이고, r>1 이면 서로 다른 두 개의 해를 얻는다. 즉, 임계점은 두 개가 나타난다. (r=2, b=1 이면 (1,1,1)과 (-1,-1,1) 두 점이 임계점이다.) 원래의 방정식이 비선형이라도, 임계점의 가까운 부근에서는 근사적으로 선형으로 볼 수 있고, 이 때, 약간의 산수를 쓰면 어떤 r이 임계점을 수렴점으로 만드는가 판단할 수 있다. Lorenz가 사용한 a=10, b=8/3 을 그대로 사용하면 다음의 결론을 얻는다.

  • 0 < r < 1 : t→∞ 에서 모든 점이 P1 으로 수렴.
  • 1 < r < r1 ∼ 1.35 : P2, P3 부근에서 급격히 수렴.
  • r1 < r < r2 ∼ 24.7 : P2, P3 부근에서 소용돌이를 그리며 수렴.
  • r2 < r : 혼돈.
    ( P1=(0,0,0), P2,3=(±(b(r-1))^(0.5),±(b(r-1))^(0.5),r-1) )

    어떤 시스템의 임계점이 한 개에서 두 개로 늘어나는 현상을 쌍갈림 bifurcation 이라고 부르는데, 이 또한 혼돈계가 갖는 성질 중의 하나다. LorenzEquations의 쌍갈림은 별 재미가 없지만, 한 점, 두 점, 네 점, 여덟 점, ... 에서 수렴하는 시스템도 상당히 여럿 알려져 있다. 대표적인 예로, 글릭의 책카오스에도 소개된 고립계의 생물 개체수 모델(혹은 LogisticMap)을 꼽을 수 있다.

비선형 미분방정식의 수치풀이

LorenzEquations은 x=F(t)의 모양으로 풀 수 없는 비선형 미분방정식이다. (모든 혼돈계는 비선형이다. 하지만 역은 참이 아니다.) 따라서, 수치 기법을 사용하는데, 가장 순진하게는 다음과 같은 방법을 사용할 수 있다. (흔히, "오일러의 방법"(EulerMethod)이라 부른다. 좀 더 정확한 수치를 원하면 "룽게와 쿠타의 방법"(RungeKuttaMethod)이라 알려진 기법을 사용하기도 하지만, 그 근본적인 사상은 어느 것이나 미분의 개념 그대로다.)

dx/dt ∼ Δx/Δt = (x' - x)/Δt = a(y - x)
이므로,
x[n+1] = x[n] + Δt a(y-x)
y[n+1] = y[n] + Δt (rx-y-xz)
z[n+1] = z[n] + Δt (xy-bz)
Δt를 적당히 작은 값(0.001 정도)으로 잡고 x0,y0,z0에 적당히 초기값을 준 뒤, 위의 연산을 반복하면, 반복한 횟수에 따라 해당 t일 때의 x,y,z 를 얻을 수 있다. 프로그래밍 언어마다 조금 다르겠지만, 대략 20줄 내외의 코드면 해결되고, 엑셀 등의 스프레드 쉬트로도 쉽게 할 수 있는 일이다. 충분한 인내심과 시간만 있다면 계산기로도 할 수는 있다. 카오스의 초기 연구자 중 한 사람인 파이겐바움은 약간의 프로그램이 가능한 계산기를 이용했다고 한다. 물론, 연필과 종이만으로도 ... 해볼 사람? -_-

Lorenz Attractor, 나비효과

사실, 이제와서 나비효과에 대해, Lorenz Attractor 에 대해, 구구절절 늘어놓기란 (혹은 들어주기란) 괴로운 일이다. Benoit Mandelbrot 의 저서, Fractals 에 대한 어떤 서평의 말대로, Read it or, better yet, look at the pictures. 하긴, 이젠 그림도 지겨울 수 있겠다.



왼쪽 그림 (Lorenz Attractor) : a=10, b=8/3, r=28, t=0~20 에서 x,y,z 의 3차원적 표현. (x,y,z)의 최초값은 (5,5,5). (움직이는 gif. 여기까지 읽는동안 혼자 돌아갔을테니 F5를 눌러보시라.)
오른쪽 그림 (나비효과) : a=10, b=8/3, r=22.8, t=0~20 에서 x. 파란색은 (5,5,5), 빨간색은 (5.001,5,5) 에서 시작. 구분을 위해 빨간색을 두 픽셀 위로 올려 플로팅.


LyapunovExponents 페이지에 이 방정식의 근사 Lyapunov exponent 계산이 있습니다.



"; if (isset($options[timer])) print $menu.$banner."
".$options[timer]->Write()."
"; else print $menu.$banner."
".$timer; ?> # # ?>