스칼라 함수의 최솟값을 찾는 문제는 대표적인 최적화(Optimization) 문제입니다. 최적화는 해의 품질을 개선하여 더 나은 결과와 더 높은 성능을 얻도록 도와주며, 곡선 피팅(curve fitting), 근 찾기(root finding) 등 다양한 분야에서 폭넓게 활용됩니다.
파이썬에서는 SciPy 라이브러리의 optimize 모듈을 사용하면 손쉽게 스칼라 함수의 최솟값을 구할 수 있습니다. 그럼 실제 예제를 통해 살펴보겠습니다.
예제 코드
import matplotlib.pyplot as plt
from scipy import optimize
import numpy as np
print("함수가 정의되었습니다")
def my_func(a):
return a**2 + 20 * np.sin(a)
x = np.arange(-10, 10, 0.1)
plt.plot(x, my_func(x))
print("그래프를 출력합니다")
plt.show()
print(optimize.fmin_bfgs(my_func, 0))실행 결과
Optimization terminated successfully.
Current function value: -23.241676
Iterations: 4
Function evaluations: 18
Gradient evaluations: 6
[-1.67096375]코드 설명
- 필요한 패키지인
matplotlib,scipy.optimize,numpy를 임포트합니다. - 데이터를 생성할 목적 함수
my_func를 정의합니다. 이 함수는 x² 항과 사인(sine) 항을 결합한 형태로, 여러 개의 국소 최솟값을 가지는 전형적인 테스트 함수입니다. - matplotlib 라이브러리를 사용해 정의된 함수를 그래프로 시각화합니다.
fmin_bfgs함수에 최소화하려는 함수를 첫 번째 매개변수로, 최적화를 시작할 초기 추정값(여기서는 0)을 두 번째 매개변수로 전달하여 호출합니다.- 최적화 결과가 콘솔에 출력됩니다.
fmin_bfgs란 무엇인가?
fmin_bfgs는 BFGS(Broyden–Fletcher–Goldfarb–Shanno) 준뉴턴(quasi-Newton) 알고리즘을 기반으로 하는 최적화 함수입니다. 함수의 기울기(gradient) 정보를 활용해 효율적으로 최솟값을 탐색하며, 위 실행 결과에서 볼 수 있듯이 단 4번의 반복 만에 최적점에 수렴했음을 확인할 수 있습니다.
최종적으로 함수의 최솟값은 약 -1.67096375에서 발견되었으며, 해당 지점에서의 함수 값은 약 -23.241676입니다. 이처럼 SciPy의 최적화 도구를 활용하면 복잡한 수학적 계산 없이도 간단한 코드 몇 줄로 스칼라 함수의 최솟값을 빠르고 정확하게 구할 수 있습니다.