페르마의 원리와 변분법
진공 공간에서 빛은 항상 일정한 속도
페르마에 따르면, 빛이
가 됩니다. 두 번째 등호에서는 빛의 속도
와 같이 매개변수화 했다고 하여
따라서, 페르마가 알려주는 빛이 경로는
이 됩니다. 여기서
인
특수한 경우에 적용한 페르마의 원리 : 스넬의 굴절 법칙
3차원 공간상에서 매우 일반적으로 정의된 굴절률에 대해서 최단 시간 경로가 되는 경로
로 주어진 경우를 생각하겠습니다. 편의상

위에서 설명한 상황을 그림으로 그리면 위와 같습니다. 긴~ 설명이 그림 하나로 쉽게 설명이 됩니다. 이제 우리가 풀어야할 문제는

위 그림에서와 같이 경로
이제
이 됩니다.
를 만족해야하고, 식을 다시 정리하면,
를 만족하게 됩니다. 반대로 위 식을 성립하게 되는
그렇게 해서

문제의 기하학적 형태에 위 수식에서 나온 분자, 분보의 값들을 표시하였습니다. 이로부터
가 됨을 확인 할 수 있고, 따라서 최단 경로의 조건을
로 표현할 수 있습니다. 이 식은 바로 굴절에 대한 스넬의 법칙(Snell's law) 입니다. 페르마의 원리에서 부터 시작하여 약간의 가정(즉, 경로는 두 선분의 합으로 이루어진다)을 하였더니 실제 물리 법칙인 스넬의 법칙을 얻은 것 입니다.
스넬의 굴절 법칙은 다양한 방법으로 유도할 수 있는데, 가장 물리적인(?) 방법은 맥스웰의 전자기 법칙(맥스웰 방정식)과 경계조건으로 부터 유도하는 것 입니다. 이는 순수하게 빛을 전자기파로 이해하고 전기와 자기의 성질로 부터 유도하는 것으로 물리학 전공 전자기학 과목의 2학기 수업에서 배우는 내용입니다. 또는 빛을 순수하게 파동으로 생각하여 호이겐스의 원리로 부터 유도하는 것인데, 개념적으로도 수학적으로도 가장 간단한 방법이라서 일반물리학에서는 이 방법으로 스넬의 법칙을 유도하는 것으로 알고 있습니다. 페르마의 원리는 맥스웰 방정식 보다 간단하고, 호이겐스의 원리 보다 일반적으로 사용될 수 있다는 면에서 매우 좋은 원리라 할 수 있습니다. 물리학에서는 이와 같이 한 가지 현상을 여러가지 법칙(원리)로 부터 이해(유도)할 수 있는 예시가 있는데, 스넬의 법칙은 매우 다양한 방법으로 유도될 수 있는 매우 구체적인 예 입니다.
우리가 찾은 해가 스넬의 법칙이니 문제를 제대로 풀었다고 만족할 수 있지만, 아직 하나 남은 간극을 채우지 못 했습니다. 문제를 간단히 하기 위해서
일반적인 빛의 경로를 알고 싶다면 : Eikonal 방정식
위에서 매우 특수한 형태의 굴절률이 배치
가 됩니다.
"Eikonal" 이라는 단어의 한국어 번역 없습니다. 한국물리학회 물리학용어집에서 검색을 해도 단순히 음역인 "아이코널"을 사용합니다. 영문 위키피디아에 따르면 Eikonal은 그리스어에 근원을 두고 있으며 현대 영어로는 "image"를 뜻한다고 합니다. 즉, Eikonal 방정식은 "이미지 방정식"인데, 빛의 경로 이미지에 대한 방정식 정도로 생각하면 될 것 같습니다. 일문 위키피디아를 봐도 "アイコナール"(아이코나루)라고 단순 음역을 사용하고 있습니다. 중문 위키피디아를 보면, "程函方程"(정함방정)이라고 훈차를 하였습니다. 여기서 程(정)은 경로라는 뜻 입니다. 函(함)은 함수라는 뜻이고 方程(방정)은 방정식이라는 뜻 입니다. 즉 "경로에 대한 함수 방정식" 정도로 생각할 수 있습니다. 훈차를 한 것이라서 정확히는 "Eikonal"의 의미는 없는 것 같습니다.
Eikonal 방정식을 수치적인 방법으로 풀기
Eikonal 방정식은
가 얻어집니다. 입자의 운동 방정식과 비교하여
으로 주어집니다.
이 미분 방정식은 시간
초기 조건
위 2변수의 1계 연립 미분방정식을 수치적으로 푸는 것은 이미 이전 포스팅에서 여러번 소개한 바 있기 때문에 구체적인 설명은 생략합니다. 이에 대해서 다룬 이전 포스팅을 보면 됩니다. 간단하게는 오일러 방법이나, 정확하게는 룽게-쿠타 방법을 활용하면 됩니다.
구체적인 굴절률과 초기 조건에 대해 문제 풀기
복잡한 문제를 풀기전에, 우리가 만든 수치해법 프로그램이 실제로 정확하게 작동하는지를 알아 보기 위해서, 해석적으로 답을 얻을 수 있는 문제를 풀어 보는 것이 좋습니다. 이 문제에 대해서 수치적인 방법으로 얻은 해와 해석적인 방법으로 얻은 해를 비교해 보면, 우리가 만든 수치해법 프로그램의 정확도를 확인할 수 있습니다.
해석적으로 푼 문제를 수치해법으로 다시 풀기
스넬의 법칙을 유도한 앞의 문제의 조건을 그대로 이용해 보겠습니다. 하지만, 위 문제의 공간에 따른 굴절률
로 근사할 것 입니다. 여기서


원점 근방을 확대하면

와 같습니다. 그림에서는 곡선을 그렸지만, 계산상에서 얻어지는 것은 위에서 표시한 점 입니다. 시각적 편의를 위해서 점과 점 사이를 선분으로 이은 것 입니다. 점과 점 사이의 거리는

반대로 빛이

전반사는 스넬의 법칙으로 부터 바로 유도할 수 있지만, 이처럼 보다 일반적인 경우를 가정하고 푼 Eikonal 방정식의 해로 부터도 전반사 해를 얻을 수 있습니다.

입사각도를 30도 근방에서 1도씩 변화 해 가면서 해를 얻었습니다. 입사각 29도까지는 굴절이 일어나지만, 30도 부터는 전반사가 일어납니다. 전반사의 임계각은 해석적으로
간단한 계산으로 부터 우리가 만든 수치해법 프로그램이 최소한 완전히 이상한 답을 주진 않은 다는 것을 확인하였습니다. 수치해법 프로그램으로는 임의의 굴절률 함수
다음 포스팅에서는 이번 포스팅에서 풀었던 매우 간단한 경우의
아래는 이번 포스팅의 마지막 결과 그래프를 얻기 위해서 사용한 파이썬 코드 입니다. 예전에 만든 2계 미분 방정식을 푸는 룽게-쿠타 코드를 약간 변형한 것 입니다. 엄청 깔끔하게 만들어진 코드가 아니니, 파이썬 프로그래밍이 가능하다면, 핵심 부분만 참고하여 본인만의 프로그램을 만드는 것이 좋습니다. 아래 코드에서 velocity는
import numpy as np
from matplotlib import pyplot as plt
def velocity_x(t, x, vx, y, vy):
n = index_refraction_type1(x,y, 'n')
return vx/n
def velocity_y(t, x, vx, y, vy):
n = index_refraction_type1(x, y, 'n')
return vy/n
def acceleration_x(t, x, vx, y, vy):
nx = index_refraction_type1(x,y, 'nx')
return nx
def acceleration_y(t, x, vx, y, vy):
ny = index_refraction_type1(x, y, 'ny')
return ny
def rungekutta_method(x0, y0, vx0, vy0, t0, t1, h):
N = int((t1 - t0) / h)
xs, vxs, ys, vys, ts = [x0], [vx0], [y0], [vy0], np.linspace(t0, t1, N)
for i in range(1, N):
t = t0 + h*(i-1)
k1x = velocity_x(t, x0, vx0, y0, vy0)
k1vx = acceleration_x(t, x0, vx0, y0, vy0)
k1y = velocity_y(t, x0, vx0, y0, vy0)
k1vy = acceleration_y(t, x0, vx0, y0, vy0)
k2x = velocity_x(t+h/2, x0+h*k1x/2, vx0+h*k1vx/2, y0+h*k1y/2, vy0+h*k1vy/2)
k2vx = acceleration_x(t+h/2, x0+h*k1x/2, vx0+h*k1vx/2, y0+h*k1y/2, vy0+h*k1vy/2)
k2y = velocity_y(t+h/2, x0+h*k1x/2, vx0+h*k1vx/2, y0+h*k1y/2, vy0+h*k1vy/2)
k2vy = acceleration_y(t+h/2, x0+h*k1x/2, vx0+h*k1vx/2, y0+h*k1y/2, vy0+h*k1vy/2)
k3x = velocity_x(t+h/2, x0+h*k2x/2, vx0+h*k2vx/2, y0+h*k2y/2, vy0+h*k2vy/2)
k3vx = acceleration_x(t+h/2, x0+h*k2x/2, vx0+h*k2vx/2, y0+h*k2y/2, vy0+h*k2vy/2)
k3y = velocity_y(t+h/2, x0+h*k2x/2, vx0+h*k2vx/2, y0+h*k2y/2, vy0+h*k2vy/2)
k3vy = acceleration_y(t+h/2, x0+h*k2x/2, vx0+h*k2vx/2, y0+h*k2y/2, vy0+h*k2vy/2)
k4x = velocity_x(t+h, x0+h*k3x, vx0+h*k3vx, y0+h*k3y, vy0+h*k3vy)
k4vx = acceleration_x(t+h, x0+h*k3x, vx0+h*k3vx, y0+h*k3y, vy0+h*k3vy)
k4y = velocity_y(t+h, x0+h*k3x, vx0+h*k3vx, y0+h*k3y, vy0+h*k3vy)
k4vy = acceleration_y(t+h, x0+h*k3x, vx0+h*k3vx, y0+h*k3y, vy0+h*k3vy)
x1 = x0 + h*(k1x + 2*k2x + 2*k3x + k4x)/6
vx1 = vx0 + h*(k1vx + 2*k2vx + 2*k3vx + k4vx)/6
y1 = y0 + h*(k1y + 2*k2y + 2*k3y + k4y)/6
vy1 = vy0 + h*(k1vy + 2*k2vy + 2*k3vy + k4vy)/6
xs.append(x1)
ys.append(y1)
vxs.append(vx1)
vys.append(vy1)
x0 = x1
y0 = y1
vx0 = vx1
vy0 = vy1
return np.array(ts), np.array(xs), np.array(ys), np.array(vxs), np.array(vys)
def index_refraction_type1(x, y, function):
n1, n2 = 1, 2
sigma = 0.01
A, B = (n1 - n2) / 2, (n1 + n2) / 2
if function == 'n':
n = A * np.tanh(y / sigma) + B
return n
elif function == 'nx':
nx = 0.0
return nx
elif function == 'ny':
ny = A / sigma * (1 - np.tanh(y / sigma) ** 2.0)
return ny
if __name__ == '__main__':
X0, Y0 = -10, -10
lim = 0.0
plt.figure(figsize=(8, 8))
for THETA_DEGREE in [57, 58, 59, 60, 61, 62, 63]:
THETA = np.pi/180 *THETA_DEGREE
VX0 = np.cos(THETA) * index_refraction_type1(X0, Y0, 'n')
VY0 = np.sin(THETA) * index_refraction_type1(X0, Y0, 'n')
T, X, Y, VX, VY = rungekutta_method(X0, Y0, VX0, VY0, 0.0, 30, 0.01)
lim = max(lim, max([X.max(), Y.max(), -X.min(), -Y.min()]))
plt.plot(X, Y, lw =2, label = "Angle = {}".format(90-THETA_DEGREE))
plt.scatter(X[0:1], Y[0:1], color ='black')
plt.axhline(0.0, color = 'black', lw = 1)
plt.xlim(-lim*1.05, lim*1.05)
plt.ylim(-lim*1.05, lim*1.05)
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.grid()
plt.show()
'물리학' 카테고리의 다른 글
시간에 따른 파동 함수의 변화 계산 하기 101 : 상자 속 입자 문제와 1차원 스케터링 문제 (0) | 2022.06.01 |
---|---|
렌즈, 물방울에 의한 빛의 굴절 : 공간에 따라 굴절률이 변하는 상황에서 Eikonal 방정식 풀기 + 신기루 현상 설명 (0) | 2022.04.17 |
중심력장 하에서 입자의 운동 (1) : 수치 미분 방정식 해법을 이용하여 문제 풀기 + 파이썬 시뮬레이션 코드 (0) | 2022.04.09 |
공전하는 두 천체가 만들어내는 평형점 : 라그랑주 점(Lagrange point) (1) | 2022.04.04 |
[고전역학 문제 풀이] 원형 빗면(콘, 깔때기)에서 구르는 입자의 운동 (1) | 2022.04.01 |