2013-05-01 86 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