2013-05-01 82 views
4

我有這樣一段代碼,以計算一個函數的第一和第二導數在給定點處無法找出一個遞歸函數

def yy(x): 
    return 1.0*x*x 

def d1(func, x ,e): 
    x = x 
    y = func(x) 
    x1 = x + e 
    y1 = func(x1) 
    return 1.0*(y - y1)/(x - x1) 

def d2(func ,x, e): 
    x = x 
    y = d1(func, x, e) 
    x1 = x + e 
    y1 = d1(func, x1, e) 
    return 1.0*(y - y1)/(x - x1) 

yy是實際功能。 d1和d2函數計算第一和第二導數。他們是我對優化感興趣的人。正如你所看到的,他們都有幾乎相同的代碼。我基本上可以繼續編寫類似於3rd,4th等派生類的函數,但是我想知道是否可以將它作爲一個函數來指定衍生級別作爲參數。

+2

這些不是衍生物,而是差商。你的'e'通常在數學書中被稱爲'h'。 – fjf2002 2013-05-01 16:15:30

回答

4
def deriv(func, order, x, e): 
    if order < 0: raise ValueError 
    if order == 0: return func(x) 
    y = deriv(func, order-1, x, e) 
    x1 = x + e 
    y1 = deriv(func, order-1, x1, e) 
    return float(y - y1)/(x - x1) 

order = 1給出一階導數,order = 2給出2nd,依此類推。

+0

非常感謝。很棒。 – facha 2013-05-01 16:17:37

1

試試這個,其中lvl是派生級別。

def d(func, x ,e, lvl): 
    x1 = x + e 

    if lvl == 1: 
     x = x 
     y = func(x) 
     y1 = func(x1) 
     return 1.0*(y - y1)/(x - x1) 
    else: 
     return 1.0*(d(func, x, e, lvl-1) - d(func, x1, e, lvl-1))/(x-x1) 
+0

Anubhav的解決方案優於你的解決方案。您的解決方案無法處理'lvl = 0',並且您的'lvl = 1'情況在某種程度上是「展開」的一次迭代,例如,您必須編寫公式1.0 *(...)/(。 ..)在這兩種情況下。 – fjf2002 2013-05-01 17:08:44

+0

我同意 - 我試圖從原始問題中重用d1和d2中的代碼,而不是編寫新的函數。 Anubhav的解決方案更好。 – tylert 2013-05-01 17:18:16