2012-04-13 40 views
9

Làm cách nào để tìm tối đa hàm trong Python? Tôi có thể cố gắng để hack với nhau một chức năng phái sinh và tìm số không của điều đó, nhưng là có một phương pháp trong numpy (hoặc thư viện khác) mà có thể làm điều đó cho tôi?Tìm mức tối đa của hàm

+0

Nhìn vào tìm kiếm phần vàng. http://en.wikipedia.org/wiki/Golden_section_search – wberry

+0

@EMS thường là những gì tôi làm, nhưng tôi không phải lúc nào cũng trên SO. Bạn phải cung cấp cho mọi người một thời gian: P –

+0

Xin lỗi, tôi không có ý nói âm thanh bất ổn. Rất nhiều người không được chấp nhận, vì vậy tôi thường viết một lời nhắc nhở như ~ 1 ngày sau, trước khi tôi quên rằng tôi thậm chí còn trả lời câu hỏi cụ thể đó. – ely

Trả lời

15

Bạn có thể sử dụng scipy.optimize.fmin trên tiêu cực của chức năng của bạn.

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

Nhưng xin lưu ý rằng bạn thực sự cần chú ý đến các vấn đề phân tích số ở đây. Nó thường là một lá cờ đỏ của lỗi sắp xảy ra khi ai đó nói "làm thế nào một thư viện có thể giải quyết điều này cho tôi?" Hãy chắc chắn rằng * bạn * thực sự hiểu những gì chức năng thư viện đang làm. Đó là sự thật ngay cả khi bạn đã làm công việc số trong một thời gian dài. Gần đây tôi đã gặp phải một [vấn đề tương tự] (http://stackoverflow.com/questions/10038543/tracking-down-the-assumptions-made-by-scipys-ttest-ind-function) với 'scipy.stats'. – ely

+0

Tôi xin lỗi vì câu hỏi không liên quan, nhưng tại sao không có biểu thức lambda? – user1700890

+1

Số không không phải là một phần của 'lambda'. 'Lambda' không thể trả về một' tuple' hoàn toàn bằng cách trả về một chuỗi các giá trị được phân tách bằng dấu phẩy, cách mà một hàm Python thông thường có thể. Trong trường hợp này, dấu phẩy là một phần của danh sách đối số với 'scipy.optimize.fmin', vì vậy toàn bộ đối số đầu tiên là' lambda x: -f (x) 'và đối số thứ hai là' 0'. – ely

1

Bạn có thể thử SymPy. SymPy có thể cung cấp cho bạn các dẫn xuất tượng trưng, ​​tìm số 0 của nó, v.v.

5

Nếu chức năng của bạn có thể giải quyết được, hãy thử SymPy một cách phân tích. Tôi sẽ sử dụng ví dụ của EMS ở trên.

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] 

Tất nhiên, bạn vẫn sẽ cần phải kiểm tra xem 1 là một công cụ tối đa và không phải là một minimizer của f

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

Tôi nghĩ scipy.optimize.minimize_scalarscipy.optimize.minimize là những cách ưa thích hiện nay, giúp bạn truy cập đến phạm vi kỹ thuật, ví dụ

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

cho một chức năng biến duy nhất mà phải nằm giữa 0 và 1.

0

tối đa của một hàm với các tham số.

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) 
Các vấn đề liên quan