아프켄 예제 22.1.2는 빛의 속도가 v=y/b(b는 상수)로 나타날 경우 빛이 두 점을 가장 짧은 시간으로 이동할 수 있는 경로(측지선)을 구하는 문제임. 문제를 보면 두 점을 잇는 측지선은 원임. 그런데 변분법을 통하지 않고 실제로 걸리는 시간을 구하면 같은 결과가 나올까? 하는 생각이 들어서 컴퓨터로 직접 구해봄.


처음에는 xy평면을 여러개의 격자로 나눈 후, 점을 하나씩 이동하면서 가장 빨리 갈 수 있는 길을 찾으려 했으나 너무 복잡해지므로 다음과 같은 가정을 세워 간소화함.


1. 어떤 점에서 다음 점으로 이동할 때 등속도로 운동하며, 속도는 두 점의 y값의 평균값에 비례한다.

-즉, 점(x1, y1)에서 (x2, y2)으로 이동할 때, v=(y1 + y2)/(2*b)


2. 시작점에서 끝점으로 이동할 때, 중간에 거쳐가는 점들의 x값은 미리 지정한다.

-안그러면 너무 복잡해지니까.


아래 코드는 (1, 1)에서 중간에 1개의 점(3, y)을 거쳐 (5, 1)까지 진행하는 경우의 파이썬 코드임.(똥코드 주의)

(1, 1)에서 (5, 1)까지 걸리는 시간을 구하는 함수인 time(y)를 정의한 후, 함수값이 최소값을 갖게하는 y=y0를 찾으면 최단시간이 걸리는 경로를 알 수 있음.


import numpy as np
import matplotlib.pyplot as plt


p1, p2 = 1, 1 #시작점
q1, q2 = 5, 1 #끝점

m = (p1 + q1)/2 #거쳐갈 점의 x값.(가정2) 여기선 두 점의 x축상의 중점으로 택했다.

#점의 y좌표가 y일때 속도
def v(y):
  b= 2
  return y/b

#(p1, p2)에서 (q1, q2)로 이동할때까지 걸리는 시간
def time(y):
  s1 = np.sqrt((p1 - m)**2 + (p2 - y)**2) #(p1, p2)와 (m, y)사이의 거리
  s2 = np.sqrt((q1 - m)**2 + (q2 - y)**2) #(q1, q2)와 (m, y)사이의 거리

  v1 = v((p2 + y)/2) #(p1, p2)에서 (m, y)까지 진행할 때 속도(가정1)
  v2 = v(q2 + y)/2) #(m, y)에서 (q1, q2)까지 진행할 때 속도(가정1)

  t1 = s1/v1 #(p1, p2)에서 (m, y)까지 걸리는 시간
  t2 = s2/v2 #(m, y)에서 (q1, q2)까지 걸리는 시간
  return t1 + t2

#실제 변분법을통해 얻은 해답
def geodesic(x):
  return np.sqrt(5 - (x - 3)**2)


xg = np.arange(1, 5, 0.1)
yg = geodesic(xg)

y = np.arange(0, 5 + 0.1, 0.1)
t = time(y) #0에서 5까지 0.1 간격으로 각각의 점을 거쳐서 지났을 때 걸리는 시간을 구하여 벡터 t에 저장한다.

n = np.argmin(t) #t중 최소값이 몇 번째 원소인지 찾는다.
y0= y[n] #y0를 찾는다.


#여기부터는 그래프 그리는 코드이므로 설명 생략.
plt.plot([p1, m, q1], [p2, y0, q2])
plt.plot(xg, yg)
plt.xlim([0, 6])
plt.ylim([0, 6])
plt.gca().set_aspect('equal')
plt.show()


결과는 아래와 같다. 주황색 선이 변분법으로 구한 해, 파란색 선이 이걸로 구한 해임.

비록 측지선이 원은 아니지만 적어도 직선이 아니라 위쪽으로 구부러져있다는 것은 알 수 있었음.



이건 중간에 거치는 점을 1개가 아니라 2개로 늘린경우인데 1개였던 이전보다 조금 더 원에 가까워졌다는걸 알 수 있음.


이건 거치는 점을 3개로 늘린 경우임. 중간에 아래로 내려가지만 전체적으로 보면 2개였던 경우보다 훨씬 원에 근접함. 

중간에 거치는 점이 4개인 경우. 이전 경우보다 원에 조금 더 근접했다.


결론: 거쳐가는 점의 개수를 많이 늘리면 늘릴수록 원에 점점 가까워졌다. 그리고 항상 막연하게 손으로만 풀던 변분법 문제를 이렇게 직접 확인하니 색다른 경험이었다. 끝~~