2012-04-13 44 views
9

如何查找Python中函數的最大值?我可以嘗試將衍生函數一起破解並找到零值,但是在numpy(或其他庫)中是否有方法可以爲我執行此操作?查找函數的最大值

+0

調查黃金分割搜索。 http://en.wikipedia.org/wiki/Golden_section_search – wberry 2012-04-13 21:31:01

+0

@EMS通常是我所做的,但我並不總是這樣。你得給人一些時間:P – 2012-04-14 04:11:42

+0

對不起,我不是故意要說話。很多都不被接受,所以我通常會在1天后寫下一條提醒筆記,然後我忘記了我甚至回答了具體問題。 – ely 2012-04-14 04:12:53

回答

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 2012-04-13 19:24:30

+0

我很抱歉無關的問題,但爲什麼在lambda表達式中爲零? – user1700890 2016-03-27 03:09:54

+1

零不是'lambda'的一部分。一個'lambda'不能通過返回逗號分隔的值序列來隱式地返回一個'tuple',這是一個常規的Python函數可以使用的方式。在這種情況下,逗號是'scipy.optimize.fmin'參數列表的一部分,因此整個第一個參數是'lambda x:-f(x)',整個第二個參數是'0'。 – ely 2016-03-27 03:14:13

1

您可以試試SymPy。 SymPy可能能夠爲您提供象徵性的衍生物,找到它的零等等。

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_scalarscipy.optimize.minimize現在是首選的方法,供您訪問到技術的範圍,例如

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

用於必須位於與參數的函數的最大0和1之間

0

單個可變功能。

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)