미분 방정식을 푸는 방법에 대한 포스팅이랑 수학의 내용을 다루지만, 이 방법을 이용하여 물리 문제를 푸는 것이 포스팅의 목적이기 때문에 이 글의 카테고리를 <물리학>으로 택했습니다.
물리학의 수학적 언어는 미분 방정식이라고 해도 과언이 아닐 정도로 미분 방정식은 물리학의 곳곳에서 나타납니다. 고전 역학을 설명하는 뉴턴의 운동 방정식, 고전 전자기 이론을 설명하는 맥스웰의 방정식, 양자 역학을 설명하는 슈뢰딩거 방정식은 형태는 조금씩 다르지만 모두 시간과 공간에 대한 미분 방정식이라는 것에는 차이가 없습니다. 따라서 개별 현상을 이해하기 위해서는 뉴턴 방정식, 맥스웰 방정식, 슈뢰딩거 방정식에 대한 구체적인 수식을 세우고, 미분 방정식을 풀면 됩니다. 방정식을 푸는 것은 단순한 수학적인 과정이니, 원리적(!)으로 볼 때, 시스템을 기술하는 미분 방정식을 세우면 물리(!) 문제를 모두 이해한 것과 다름 없습니다.
그러나, 개별 자연 현상을 정확하게 이해하기 위해서는 미분 방정식의 해를 직접 구해야 합니다. 원리를 알았다고 해서 현상을 모두 이해한 것은 당연히 아니니까요. 상황에 맞은 미분 방정식을 세웠으면, 실제 실험과 미분 방정식의 해가 일치하는지 혹은 미분 방정식의 해를 통해서 실험이 어떤 방향으로 전개될지에 대한 결과를 얻어야 합니다.
보통 물리 교과서에서는 해석적으로 풀이가 가능한 매우 간단한 형태의 미분 방정식에 대해서 다룹니다. 고전 역학을 예로 든다면 (별다른 언급이 없다면, 모든 예시는 고전 역학 즉 뉴턴의 운동 방정식인
따라서, 이런 경우에는 미분 방정식을 컴퓨터를 이용하여 수치적인 방법으로 풀어야 하는데요, 이번 포스팅에서는 수치적인 방법으로 미분 방정식을 푸는 개념을 가장 쉽게 설명할 수 있는 오일러 방법(Euler Method)을 소개하겠습니다. 그리고 이 방법을 이용하여 고전 역학에서 가장 자주 등장하는 문제 중 하나인 조화 진동자 문제를 실제로 풀어 보도록 하겠습니다. 조화 진동자 문제는 해석적인 해를 구할 수 있는 문제이기 때문에, 해석적인 해와 수치해석으로 부터 얻은 해를 비교 할 수 있다는 장점이 있습니다.
1계 상미분 방정식
가장 간단한 형태인 1계 상미분 방정식을 통해 오일러 방법을 소개하도록 하겠습니다. 초기 조건(혹은 일반적으로는 경계 조건)이 부여된 1계 상미분 방정식은 일반적으로
와 같이 쓸 수 있습니다. 여기서
오일러 방법
오일러 방법은 미분의 정의를 이용하여, 직관적으로 미분 방정식을 푸는 방법 입니다. 미분은 다음과 같은 극한으로 정의 되는데,
수치적으로 문제를 풀 때는
로 근사가 가능합니다. 이 근사를
가 되고, 이 과정을 계속해서 반복하게 된다면 일반적으로
이 됩니다. 이 과정은 시간을
이 됩니다. 위 식은 수열
오일러 방법을 이용한 1계 상미분 방정식 풀이의 예시 : 속도에 비례하는 저항을 받은 낙하 운동
중력장에 의해 자유 낙하 하는 물제의 미분 방정식을 생각하겠습니다. 단순히 중력만 작용한다면 문제가 너무 간단해지기 때문에, 속도에 비례하는 저항력을 추가하겠습니다. 이 경우 속도에 대한 미분 방정식은
가 됩니다. 여기서
가 됩니다. 이 문제를 오일러 방법으로 풀면 되는데요,
가 됩니다.
import numpy as np
from matplotlib import pyplot as plt
def gravity():
t0, t1 = 0, 5
N = 50
h = (t1-t0)/N
v0 = 0
vs = [v0]
for i in range(1, N):
v1 = v0 + (1-v0)*h
vs.append(v1)
v0 = v1
ts = np.linspace(t0, t1, N)
va = 1 - np.exp(-ts)
plt.scatter(ts, vs, color = 'blue', label = "Euler")
plt.plot(ts, va, color = 'red', lw = 2, label = "Analytic")
plt.legend(ncol=3, fontsize='small', loc="upper left")
plt.xlabel("Time")
plt.ylabel("y")
plt.grid()
plt.show()
if __name__ == '__main__':
gravity()

결과는 위 그래프와 같습니다. 푸른색 점으로 표시한 것이 오일러 방법을 통해서

수치적으로 미분 방정식을 푸는 것은 어쩔 수 없이 해를 근사적으로 구하는 것 이기 때문에, 해석적인 해와 비교하면 에러가 발생할 수 밖에 없는데,
오일러 방법은 시간을 불연속화 하는 크기

일반적으로 오일러 방법에서는 미분을
2계 상미분 방정식
2계 상미분 방정식은 일반적으로
와 같이 쓸 수 있습니다. 편의상 미분을
2계 상미분 방정식은 2개의 연립 1계 상미분 방정식으로 풀 수 있습니다. 즉,
와 같이 2개의 미분 방정식으로 표현할 수 있습니다. 풀어야 하는 미분 방정식이 2개로 늘어났지만, 이 과정을 거치고나면
을 얻을 수 있습니다.
위 식에서
오일러 방법을 이용한 2계 상미분 방정식 풀이의 예시 : 단조화 진동자
역학에서 나오는, 아니 모든 물리학을 통틀어서, 가장 중요한 2계 상미분 방정식은 단조화 진동자의 운동 방정식 입니다. 단조화 진동자의 운동 방정식은 (자유도를
로 주어집니다. 위에서와 같이 편의상 모든 물리 상수는
import numpy as np
from matplotlib import pyplot as plt
def harmonic():
t0, t1 = 0, 3*(2*np.pi)
N = 3000
h = (t1-t0)/N
y0, z0 = 1, 0
ys = [y0]
for i in range(1, N):
y1 = y0 + z0 * h
z1 = z0 - y0 * h
ys.append(y1)
y0 = y1
z0 = z1
ts = np.linspace(t0, t1, N)
ya = np.cos(ts)
plt.plot(ts, ys, lw = 2, label = "Euler", color = "blue")
plt.plot(ts, ya, lw = 2, label = "Analytic", color = "red")
plt.legend(ncol=3, fontsize='small', loc="upper left")
plt.xlabel("Time")
plt.ylabel("y")
plt.grid()
plt.show()
if __name__ == '__main__':
harmonic()

결과는 위 그래프와 같습니다. 푸른색 선은 오일러 방법으로 구한 해, 붉은색 선은 해석적인 방법으로 구한 해

시간에 따른 에러의 크기를 그리면 위와 같습니다. 에러의 크기가 시간에 따라서 계속 증가한다는 것은 볼 수 있습니다. 시간을 불연속적으로 만들어 주는 크기

시간의 범위를
실제로 에러의 크기의 상한을 구할 수 있는데, 그 크기는
입니다. 여기서
오일러 방법의 한계
오일러 방법은 매우 직관적이라는 장점과, 매우 쉽게 프로그래밍을 할 수 있다는 장점이 있습니다. 실제 위 프로그램 코드의 예시와 같이 10줄 이내로 코드를 작성할 수 있습니다. (위 전체 코드는 10줄이 넘는데, 그래프를 그리기 위한 부분을 제외하고 순수하게 오일러 방법으로
하지만, 매우 거친 근사를 하는 탓에, 해석적으로 정확한 해와 수치적으로 얻은 해 사이에 에러가 매우 커짐을 확인할 수 있었습니다. 시간의 불연속 값
따라서, 오일러 방법의 단점을 극복하는 방법이 매우 많이 고안되었는데, 그 중에서 대표적인 방법은 룽게-쿠타 방법(Runge-Kutta method)입니다. 이 방법에 대해서는 다음 포스팅에서 알아 보도록 하겠습니다.
'물리학' 카테고리의 다른 글
룽게-쿠타 방법(Runge-Kutta method) 을 활용하여 보다 빠르고 정확하게 미분 방정식 문제를 수치 해법으로 풀기 + 파이썬 코드 (0) | 2021.10.15 |
---|---|
수치 미분 방정식 풀이법을 이용하여 최종값 조건이 주어진 문제 풀기 : 슈팅 방법 (0) | 2021.10.15 |
대칭성을 이용한 2차원 단조화 진동자 문제 풀이 (0) | 2021.09.13 |
슈뢰딩거 방정식 유도 : 슈뢰딩거의 1926년 논문의 유도 과정을 이해하자 (4) | 2021.09.07 |
[고전역학-10] 해밀턴 역학 : 시간에 무관한 해밀턴-야코비 방정식, 기하학적인 의미, 입자의 운동을 파동 처럼 생각하기 (1) | 2021.09.05 |