2012-04-13 5 views
9

파이썬에서 함수의 최대 값을 찾는 방법은 무엇입니까? 파생 함수를 해킹하여 0을 찾아 볼 수도 있지만, numpy (또는 다른 라이브러리)에는 저에게 해줄 수있는 메서드가 있습니까?함수의 최대 값 찾기

+0

골든 섹션 검색을 살펴보십시오. http://en.wikipedia.org/wiki/Golden_section_search – wberry

+0

@EMS는 일반적으로 내가하는 일이지만 항상 그래야하는 것은 아닙니다. 당신은 사람들에게 시간을 좀 주어야합니다 : P –

+0

미안 해요, 나는 persnickety 소리를 의미하지는 않습니다. 많은 사람들이 받아 들일 수 없으므로, 보통 1 일 후와 같은 미리 알림 메모를 작성합니다. – ely

답변

15

scipy.optimize.fmin은 잘못된 기능에 사용할 수 있습니다.

def f(x): return -2 * x**2 + 4 * x 
max_x = scipy.optimize.fmin(lambda x: -f(x), 0) 
# array([ 1.]) 
+7

하지만 여기서는 수치 해석 문제에주의를 기울여야합니다. 누군가가 "도서관에서 어떻게이 문제를 해결할 수 있습니까?" 라이브러리 함수가하는 일을 실제로 이해했는지 확인하십시오. 오랜 시간 동안 수치 작업을 해왔다 고해도 마찬가지입니다. 나는 최근에'scipy.stats'로 [유사한 문제] (http://stackoverflow.com/questions/10038543/tracking-down-the-assumptions-made-by-scipys-ttest-ind-function)를 겪었다. – ely

+0

관련이없는 질문은 유감 스럽지만 람다식이 0 인 이유는 무엇입니까? – user1700890

+1

0은 '람다'의 일부가 아닙니다. 'lambda '는 일반적인 파이썬 함수가 할 수있는 방식으로 쉼표로 구분 된 값의 시퀀스를 반환함으로써 암시 적으로'튜플 (tuple)'을 반환 할 수 없습니다. 이 경우 쉼표는'scipy.optimize.fmin'에 대한 인수 목록의 일부이므로 전체 첫 번째 인수는'lambda x : -f (x)'이고 두 번째 인수는 모두'0'입니다. – ely

1

시도해 볼 수 있습니다 SymPy. SymPy는 파생물을 상징적으로 제공하고 해당 0을 찾을 수 있습니다.

5

분석 할 수있는 기능이 있다면 SymPy를 시도하십시오. 위의 EMS 예제를 사용합니다. 물론

In [1]: from sympy import * 
In [2]: x = Symbol('x', real=True) 

In [3]: f = -2 * x**2 + 4*x 

In [4]: fprime = f.diff(x) 
In [5]: fprime 
Out[5]: -4*x + 4 

In [6]: solve(fprime, x) # solve fprime = 0 with respect to x 
Out[6]: [1] 

, 당신은 여전히 ​​1은 극대화가 아니라 F의 최소화 부 있는지 확인해야합니다

In [7]: f.diff(x).diff(x) < 0 
Out[7]: True 
1

나는 scipy.optimize.minimize_scalar 생각하고 scipy.optimize.minimize 당신에게 액세스 권한을 부여하는, 지금은 선호하는 방법입니다 기술 범위, 예. 매개 변수 함수의

0

0과 1 사이의 최대 있어야만 하나의 변수 함수

solution = scipy.optimize.minimize_scalar(lambda x: -f(x), bounds=[0,1], method='bounded') 

.

import scipy.optimize as opt 

def get_function_max(f, *args): 
    """ 
    >>> round(get_function_max(lambda x, *a: 3.0-2.0*(x**2)), 2) 
    3.0 

    >>> round(get_function_max(lambda x, *a: 3.0-2.0*(x**2)-2.0*x), 2) 
    3.5 

    >>> round(get_function_max(lambda x, *a: a[0]-a[1]*(x**2)-a[1]*x, 3.0, 2.0), 2) 
    3.5 
    """ 
    def func(x, *arg): 
     return -f(x, *arg) 
    return f(opt.fmin(func, 0, args=args, disp=False)[0], *args)