2015-03-13 55 views
0

我有MATLAB代碼以下位:翻譯MATLAB代碼到Python:optmizing數值函數

[email protected](h)(exp(-2*mun*(h/sigma+1.166))-1+2*mun*(h/sigma+1.166))/(2*mun^2)-ARL0; 

的參數並不重要,他們都只是在這一點上常量,最重要的是,現在我可以通過調用f(h)來評估函數的任何h值。特別是,我可以在任何指定的時間間隔內找到函數的零點,最小值,最大值等。

我把這段代碼翻譯成python,主要是作爲學習python的一個練習,我想知道是否有任何類似的東西(可能是numpy),我可以使用,而不是設置一個任意設置的numpy數組h值處理完畢。

我可以做類似(僞):

f = numpy.array(that function for h in numpy.arange(hmin, hmax,hstep)) 

但這種承諾我的步長。有什麼辦法可以避免這種情況,並獲得像matlab中的完整精度?

編輯:我真正想在一天結束時是找到函數f的零,最大和最小位置(而不是值)。它看起來像SciPy的可能有一些功能,這裏有更多有用:http://docs.scipy.org/doc/scipy/reference/optimize.html

回答

1

Python等同的功能MATLAB(在@符號)處理被稱爲蟒「lambda函數」。等效語法如下:

Matlab的:

func = @(h)(h+2): 

的Python:

func = lambda h: h+2 

針對您的特殊情況下,你將實現MATLAB函數的這樣的等價物:

import numpy as np 
f = lambda h: (np.exp(-2*mun*(h/sigma+1.166))-1+2*mun*(h/sigma+1.166))/(2*mun**2)-ARL0 

f然後可以作爲一個函數使用,並直接應用於任何numpy數組。因此,這將工作,例如:

rarr = np.random.random((100, 20)) 
frarr = f(rarr) 
+0

美麗,結合lambda函數和fsolve使我的工作非常容易。 – KBriggs 2015-03-16 16:45:56

1

如果你只是爲x的​​整數值的F值,下面的工作:

f = [your_function(x) for x in xrange(hmin, hmax)] 

如果你想要更粒度小於整數值,你可以這樣做:

f = [your_function(x) for x in xrange(hmin, hmax, hstep)] 

如果你想在零,最大和最小位置的精確解,我同意你的編輯:使用scipy optimize。有關SciPy的

兩個重要注意事項優化功能:

  1. 看來你要使用的版本有界
  2. 沒有保證,你會發現實際的最小/最大使用這些功能。它們是非確定性的優化函數,可能會成爲局部最小值/最大值的犧牲品。如果你想象徵性地評估分鐘/ MAXS,我建議尋找到sage