Planetary motion

leap-frog.py


'Study > Physics' 카테고리의 다른 글

Euler method로 미분방정식 풀어보기  (0) 2012.11.01
Strogatz 2.5.6  (0) 2012.09.28
Spherical Coordinate의 벡터들의 속도와 가속도  (0) 2011.03.13
그리스인 vs 바빌로니아인  (0) 2010.01.17

미분방정식을 컴퓨터를 이용해 수치적으로 계산해야 할 때가 있다. 이 때 미분방정식을 푸는 방법이 여러개 있는데 가장 쉬운 방법은 Euler method이다. 하지만 에러가 꽤 커서 실제 연구할 때에는 사용하지 않는 방법이기도 하다. 미분의 정의로부터 euler method를 간단히 유도할 수 있다. 미분의 정의에서 극한을 빼면, 




처럼 쓸 수 있다. 물리적인 상황을 떠올리기 위해 위치를 s(t), 속도를 v(t)로 나타내었다. 시간에 대한 위치의 변화량이 속도가 된다. 이 식을 다시 고쳐보면 다음과 같다.



다음 시간(t+dt)에서의 위치는 지금 시간의 위치에서 지금 시간의 속도만큼의 변화를 주어 예측하는 방법이 된다. 이게 바로 Euler method이다. 사실 dt에 대해 테일러 전개를 해보면, 




에서 최대 (dt)의 제곱항만큼의 오차가 생기게 된다. 


이제 Euler method를 프로그램으로 만들어보자. 그 전에 생각해볼 문제가 있다. 바로 euler method를 어떻게 반복시킬 것인가 하는 문제이다. 지금의 위치와 속도를 통해 다음 시간 스텝에서의 위치를 예측하는 것이 이 method의 목적임을 상기하자. 그럼 다음과 같이 순서를 짜야 한다.



1. 우선 현재 시간 t 에서의 위치 x를 보자. 

2. 그 뒤에 현재 시간 t에서의 속도 v(t)를 계산해야 한다. 

3. 그럼 현재 속도 v(t)와 x를  Euler method에 넣어 t+dt 때의 위치를 어림계산할 수 있다. (물론 오차는....ㄷㄷ) 

4. 이후에 이 때의 위치 x+dx 가 t+dt 때의 시간이라는걸 컴퓨터에게 알려준다.


이걸 반복하면 된다. 검은 화살표는 약간의 연산을 해야 하는 과정이다. (속도구하기, Euler method)

녹색은 그냥 컴퓨터에서 대입을 해주는 부분이다.


프로그래밍을 편하게 하기 위해서는 미리 자신이 원하는 dt(시간 간격)와 최종 시간을 정한 뒤 배열의 크기를 잡아준다. 배열의 크기는 (전체 시간 / 시간 간격) 으로 정할 수 있다. 예를들어 2초 동안을 0.1초로 나누어 보고 싶다면 2/(0.1) = 20개의 조각으로 시간이 나뉘게 된다.


이후 결과를 츨력할 때 편하게 하기 위해 초기값을 배열의 맨 앞에 넣어준다. 그럼 배열의 크기 역시 1개가 더 필요한데, 이를 위해 처음부터 배열의 크기를 (전체시간 / 시간간격) + 1 로 잡아주자. 위의 예시에서 배열의 크기는 21이 된다.


아래는 python으로 Euler method를 이용해 지구에서 자유낙하 운동을 만든 예제이다. 질량은 1이고 위로 30m/s 만큼 던졌을 때의 시간에 대한 모습을 보여준다. (NumPy, matplotlib 설치 필요)


import pylab as pl


g = 9.8

v0 = 30


def velocity(t):

return v0 - g * t


timeEnd = 8 ## second

dt = 0.01

g = 9.8


Nt = (int)(timeEnd/dt)+1


yList = pl.empty(Nt, float)

tList = pl.empty(Nt, float)


yList[0] = 60

tList[0] = 0


for i in range(Nt-1):

yList[i+1] = yList[i] + dt * velocity(tList[i])

tList[i+1] = tList[i] + dt


pl.plot(tList, yList)

pl.show()



계산을 해보면 7.71 ~ 7.72초 사이일 때 땅에 떨어진다고 하는데 등가속도 운동을 계산해보면 약 7.7105 초에 정확히 지면에 떨어진다. 


다음으로 Euler method의 오차를 생각해볼 수 있는데, 한 step에서 계산 결과는 (dt)^2 만큼 쌓이게 된다. 하지만 우리가 최종결과를 원래 이론값과 비교할 때의 오차는 조금 다르다. step마다 계산할 때 생기는 오차를 local error라고 부르며, 우리가 원하는 시간 T에서의 계산값과 이론값의 차이는 global error라고 부른다. 그래서 global error는 local error보다 더 크기 마련인데, 정확히는 (dt)^1 만큼이다. 왜일까? 한 step에서 (dt)^2 만큼 오차가 발생하는데 이 오차가 T/dt = N번 누적된다. 여기서 N은 결국 1/dt에 비례하고, global error는 local error가 N번 누적된 것이므로, 




만큼의 오차가 생긴다. 이를 확인해보자. dt를 바꾸어가면서 어떤 미분방정식을 풀어본 뒤에 log-scale로 global error 와 dt에 대한 그래프를 그려보면 된다. 분명 기울기가 1이 나온다. 위의 프로그램을 조금 고쳐서 확인해보자. T=8일 때의 위치는 정확히 -13.6m 이다.


import pylab as pl

from math import pow, fabs


g = 9.8

v0 = 30


def velocity(t):

return v0 - g * t


timeEnd = 8 ## second


GlobalError = []

dtList = []


for k in range(4):

dt = pow(0.1, k)

dtList.append(dt)

Nt = (int)(timeEnd/dt)+1


yList = pl.empty(Nt, float)

tList = pl.empty(Nt, float)


yList[0] = 60

tList[0] = 0


for i in range(Nt-1):

yList[i+1] = yList[i] + dt * velocity(tList[i])

tList[i+1] = tList[i] + dt


GlobalError.append( fabs(yList[Nt-1] + 13.6) )

pl.plot(dtList, GlobalError)

pl.yscale('log')

pl.xscale('log')


pl.show()


결과는 다음과 같다. 잘 보면 기울기가 log-log에서 -1이다. 

Global Error를 찍을 때 가끔 결과가 엉뚱하게 나오는 때가 있다.(기울기가 아무리해도 -1인 경우...심지어는 Runge-kutta 4th를 써도!!) 이번에 알게 되었는데 Nt의 크기에서 +1을 하지 않았을 경우 정확히 T=8 일 때가 아닌 T = 8-dt 때의 결과로 에러를 계산하기 때문이다.


이렇게 Euler method를 살펴보았다. 이해하기도 쉽고 만들기도 쉽지만 에러는 우리가 준 dt만큼밖에 줄어들지 않기 때문에 긴 시간뒤의 결과를 실제와 다르게 내주게 된다. 그렇다고 dt를 아주 작게 쪼갤 경우 loop를 많이 돌게 되어 컴퓨터 파워를 많이 써야 하는 부담이 있다. 이런 이유 때문에 Euler method를 상당히 초기조건에 민감한 비선형 미분방정식을 수치적으로 푸는데 적합하지 않다. 이를 극복하기 위해 Improved Euler, Leap-frog, Runge-Kutta 4th order 등의 여러 알고리듬이 있다. 


'Study > Physics' 카테고리의 다른 글

leap-frog algorithm  (0) 2012.11.01
Strogatz 2.5.6  (0) 2012.09.28
Spherical Coordinate의 벡터들의 속도와 가속도  (0) 2011.03.13
그리스인 vs 바빌로니아인  (0) 2010.01.17

2.5.6.pdf


Strogatz의 Nonlinear Dynamics and Chaos 교재의 연습문제 2.5.6번 - 구멍난 항아리(The leaky basket) - 문제의 답이다. 어려운 문제는 아닌데 구글링해보니 답이 안나와서 그냥 만들어봤다. 조교하다가 만든 답을 여기에 올려도 되나...


아무튼 내 풀이를 보고 내후년에 그대로 배끼는 학생이 있다면 100% 걸리는거닷ㅋㅋㅋㅋ


대충 풀어서 틀린 부분이 있다면 코멘트 해주세요~

'Study > Physics' 카테고리의 다른 글

leap-frog algorithm  (0) 2012.11.01
Euler method로 미분방정식 풀어보기  (0) 2012.11.01
Spherical Coordinate의 벡터들의 속도와 가속도  (0) 2011.03.13
그리스인 vs 바빌로니아인  (0) 2010.01.17
대학원 고전역학 숙제를 하다가 답이 궁금해 구글신께 여쭈어봤습니다.

친절히 알려주시더군요. ㅎㅎㅎㅎㅎㅎㅎㅎ풀이는 없고 결과만 있으나 이마저도 감사할 따름 ㅋㅋㅋ

http://people.rit.edu/pnveme/pigf/Coords/coord_sph_def.html

'Study > Physics' 카테고리의 다른 글

leap-frog algorithm  (0) 2012.11.01
Euler method로 미분방정식 풀어보기  (0) 2012.11.01
Strogatz 2.5.6  (0) 2012.09.28
그리스인 vs 바빌로니아인  (0) 2010.01.17

파인만은 머레이 겔만과 칼텍에서 지지고 볶으며 살고 있었습니다.
그리고 그는 물리학자에는 그리스인과 바빌로니아인이라는 두가지 종류가 있다고 말을 합니다.

바빌로니아인은 숫자, 방정식, 기하학 등에서 큰 획을 그었습니다.
하지만 그들은 어떤 계산 방법이 실재하는 물리적 상황을 적절하게 묘사하느냐에 큰 관심을 가지고 있었습니다. 그 때문에 그것이 정확하거나 더 커다란 논리체계와 맞는지를 따지는 일이 별로 없었습니다.

그리스인은 정리와 증명이라는 개념을 만들고 어떤 진술이 공리나 가정의 체계에서 나온 정확한 논리적 결과물일 때에만 그 진술을 참으로 여겼습니다. 현대의 수학적인 엄밀함이 바로 그리스인들의 중요한 관심과 거의 일치할 것 같습니다.

 따라서 바빌로니아인은 현상에 무게를 두었고 그리스인은 질서에 무게를 두었습니다.

그리스인은 수학의 논리적인 원리를 이용해 체계화된 수학을 만드는데 능통합니다. 물리학자들 역시 수학적인 질서와 아름다움에 따라서 이론을 설계하기도 합니다. 반면 바빌로니아인은 상상력과 직관, 본능에 더 능통합니다. 따라서 수학적인 난제나 논리에서 벗어나 자유롭게 물리적인 현상을 관찰하고 해석하여 이론을 만듭니다.

그리스인과 바빌로니아인은 각각 쿼크를 이론적으로 발견한 머레이 겔만과 QED를 정리한 리처드 파인만에 해당된다고 파인만은 생각했습니다. 머레이 겔만은 쿼크를 이론적으로 예측하면서 팔중도 모형을 만들어냅니다. 질서와 체계를 만든 것이지요. 반면 파인만은 자신의 직관과 상상력으로 기존에 존재하지도 않던 경로적분이라는 수학적 도구를 만들고 마술같은 설명으로 광자와 전자기의 상호관계를 서술합니다.

 대부분의 그리스식 교육을 받은 물리학자들은 그래서 파인만을 전설로 생각합니다. 그 황당한 상상력과 직관이 이론물리학에서 큰 획을 그었기 때문이지요. 하지만 이론물리학의 체계를 잡고 앞으로 나아갈 방향을 제시한 사람은 오히려 머레이 겔만이었습니다. 어떤 학자라도 이해할 수 있는 수학적인 구조를 가지고 자신의 이론을 만들었으며 그 이론은 뒤에 숨겨진 질서를 찾기 위한 하나의 초석이 되기 때문입니다. 일례로 그는 1970년 후반에 이미 초끈이론을 간접적으로 지원하고 있었을 정도였지요. 그 당시 초끈이론의 황당한 차원과 수학적인 문제들 때문에 대부분의 이론물리학자들은 초끈이론의 아이디어 역시 이전의 S행렬이론처럼 지나가는 이야기쯤으로 치부하기도 했을 때였습니다.

 오래 전 플라톤과 아리스토텔레스 역시 그리스인과 바빌로니아인처럼 대립했었다고 합니다. 플라톤은 영원불멸의 규칙이나 패턴이 있으리라고 믿었지만 아리스토텔레스는 규칙이나 추상은 신화정도로 생각했으며 자연의 현상에 더 큰 의미를 두었습니다.

 그리스인과 바빌로니아인은 현대물리학에서 큰 업적을 남겼습니다. 어쩌면 서로 보완적인 관계일지도 모르겠습니다. 중요한 것은 그 어떤 종류의 물리학자이건 자연을 설명하는 것이 우리의 가장 큰 목적이라는 것이 아닐까 생각합니다.

파인만에게 길을 묻다
카테고리 시/에세이
지은이 레너드 믈로디노프 (세종서적, 2004년)
상세보기

예전 다음 블로그에서 다시 긁어왔습니다.

'Study > Physics' 카테고리의 다른 글

leap-frog algorithm  (0) 2012.11.01
Euler method로 미분방정식 풀어보기  (0) 2012.11.01
Strogatz 2.5.6  (0) 2012.09.28
Spherical Coordinate의 벡터들의 속도와 가속도  (0) 2011.03.13

+ Recent posts