이번 포스팅은 다소 간단한 내용을 담고 있는 포스팅인데, 제가 실제로 하고 있는 없무와 약간 관련성이 있기 때문에 하는 포스팅입니다.

문제는 타원과 타워 밖의 한 점이 주어져 있을 때, 타원과 점 사이의 거리를 구하는 것 입니다. 문제를 최대한 간단하게 하기 위해서 2차원 공간을 생각하겠습니다. 2차원 공간에서 타원의 방정식은
로 주어집니다. 타원 위의 일반적인 점을
우리 문제는
입니다. 매우 단순한 형태의 구속 조건이 있는 하의 최적화 문제 입니다.
1. 타원 상의 점을 매개변수화를 이용한 풀이
(가장?) 간단하게 이 문제에 접근 할 수 있는 방법은 타원 상의 점을 매개변수화 하여 표현하고,
으로 표현할 수 있습니다. 따라서
이 되게 하는
인데,
가 됩니다.
와 같고, 루트를 없애기 위해서 양변을 제곱하여 정리하면,
이 됩니다. 이 식을
와 같이
가 우리가 찾는 최종 해가 됩니다. 4차 방정식의 해를 해석적으로 쓰면 너무 길어지기 때문에, 그냥
이 방법은 직관적이면서 간단한 방법이지만, 공간의 차원이 높아진다면 시도하기 어려운 방법입니다. 예를들어, 같은 문제를 3차원 공간에서 푼다면, 타원을 표현하기 위한 매개변수는 2개가 필요합니다. 예를들어 구면 좌표계와 같은 변환을 사용하면,
를 기술하는 매개 변수화는
이 있습니다. 이를 이용하면
2. 라그랑지 승수를 이용한 풀이
구속 조건이 있는 최적화 문제라면 라그랑지 승수Lagrange multiiplier를 이용하여 최적화 문제를 해결 할 수 있습니다. 위 문제에 대한 라그랑지안은
입니다. 여기서
입니다. 따라서
을 동시에 만족하는
가 되고, 이를 두 번째 식에 대입하여 정리하면
이 됩니다. 위 식에서
이런 경우에는 위
import numpy as np
from scipy import optimize
def function(lam):
A = np.identity(2) - lam* sigma
Ainv = np.linalg.inv(A)
y = np.matmul(Ainv, x)
f = y.transpose() @ sigma @ y-1
return f
def return_p(lam):
A = np.identity(2) - lam * sigma
Ainv = np.linalg.inv(A)
y = np.matmul(Ainv, x)
return y
def lagrangian():
a, b = 2, 1
x = np.array([5, 5])
sigma = np.zeros([2, 2])
sigma[0, 0] = 1 / a ** 2.0
sigma[1, 1] = 1 / b ** 2.0
sol = optimize.brentq(function, -1e8, 0)
p1 = return_p(sol)
return p1
if __name__ == '__main__':
lagrangian()
위 코드에서는 scipy의 라이브러리인 optimize.brentq 알고리듬을 활용합니다.
이 방식은 다로 복잡해 보이기는 하지만, 일반적인 공간 차원에서의 문제를 풀 수 있다는 장점이 있습니다. 위에서 문제를 설명하기 위해서
'수학' 카테고리의 다른 글
동역학계의 끌개attractor와 끌림 영역basin of attraction (1) : 개념 설명 (1) | 2023.06.01 |
---|---|
[수학적 최적화] 경사 하강법Gradient Descent(혹은 Steepest Descent) 알아 보기 : (1) 기본 개념 (1) | 2023.05.29 |
[수학적 최적화] 시뮬레이션 담금질 Simulated Annealing을 활용한 외판원 문제 Travelling salesman problem 문제 풀기 (0) | 2023.05.10 |
[수학적 최적화] 시뮬레이션 담금질 Simulated Annealing의 이해와 파이썬 코드 (2) | 2023.05.06 |
포물선의 반사의 성질 : 축에 나란한 방향으로 입사한 빛은 반드시 포물선의 초점을 지난다 (3) | 2023.04.06 |