한 점에서부터 곡선까지의 최단거리
한 점과 곡선까지의 최단거리를 구해보자.
일단 귀찮으니 쳇지피티에게 물어보고 시작하자.
그리고 알려준 예제 코드는 아래와 같다.
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
# 점과 곡선 정의
point = np.array([2, 3])
def curve(x):
return x ** 2
# 거리 함수 정의
def distance(x):
return np.sqrt((x - point[0]) ** 2 + (curve(x) - point[1]) ** 2)
# 최단 거리의 x 좌표 찾기
result = minimize(distance, 0)
nearest_x = result.x[0]
nearest_point = np.array([nearest_x, curve(nearest_x)])
# 시각화
x_vals = np.linspace(-2, 4, 400)
y_vals = curve(x_vals)
plt.figure(figsize=(6, 6))
plt.plot(x_vals, y_vals, label='Curve: y = x²')
plt.scatter(*point, color='red', label='Point (2, 3)')
plt.scatter(*nearest_point, color='blue', label='Nearest Point')
plt.plot([point[0], nearest_point[0]], [point[1], nearest_point[1]], 'k--', label='Shortest Distance')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.title('Shortest Distance from a Point to a Curve')
plt.show()
print(f"최단 거리: {result.fun:.4f}")
print(f"곡선 위의 최단 거리 점: {nearest_point}")
좋아. 한번 실행해보자.
흠. 그림은 깔끔한데, 저게 최단거리 맞나?
자세히보니 그래프의 x축, y축 비율이 서로 달라서 살짝 찌그러져서 나온 것 같다.
그래프의 x축, y축을 동일비율로 해서 다시 그려달라고 하자.
정말 plt.axis('equal') 한줄만 추가된 코드를 알려주었다.
이것에서..
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.title('Shortest Distance from a Point to a Curve')
plt.show()
이것으로..
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.title('Shortest Distance from a Point to a Curve')
plt.axis('equal') # x축과 y축 비율 동일하게 설정
plt.show()
역시 실행해보자.
어찌되었던 최단거리를 잘 찾는 것 같다.
코드에 대해 설명도 해주었다. 기특한 것.
코드 설명을 봐도 그렇고, 실제 코드를 봐도 그렇고 중요한 부분은 scipy.optimize.minimize() 함수 인 것 같다. 그러면 그 함수에 대해서 조금만 더 설명을 해달라고 하자.
너무 신나게 얘기를 하는데?
암튼 정리를 좀 해보자.
scipy.optimize.minimize() 함수는 목적함수(최소값을 찾고자 하는 함수)와 초기값을 받은 후, 최소값과 그때의 x 값을 반환해준다는 것이 핵심인 것 같다.
그 과정에서 최적화 알고리즘을 직접 선택할 수도 있으며, constraints를 추가로 설정할 수도 있다고 한다.
반환값으로는 객체를 반환하는데, 최소값, 최소값일 때의 x값 뿐만 아니라, 최적화 성공 여부, 반복 횟수 등도 알수있게 반환한다고 한다.
그래. 좋은 말이다.
어떻게 쓰느냐에 따라 다양한 방법으로 사용할 수 있겠다.
그럼 오늘은 여기까지만.. ;;;