2013-05-01 2 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) 

уу является фактической функцией. d1 и d2, которые вычисляют 1-ю и 2-ю производные. Это те, кого я хочу оптимизировать. Как видите, они оба имеют почти тот же код. Я мог бы продолжать писать такие функции для 3-го, 4-го и т. Д. Производных, однако мне интересно, можно ли написать его как одну функцию, определяющую уровень производной в качестве параметра.

+2

Это не производные, а разностные факторы. Ваш 'e' обычно называется' h' в математических книгах. – fjf2002

ответ

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 дает вторую и так далее.

+0

Большое спасибо. Прекрасно работает. – facha

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

Решение Анубхава превосходит ваше. Ваше решение не может обрабатывать 'lvl = 0', а ваш случай' lvl = 1' - это как-то одна итерация «разворачивается» в том смысле, что, например, вам нужно написать формулу 1.0 * (...)/(. ..) в обоих случаях. – fjf2002

+0

Я согласен - я пытался просто повторно использовать код из d1 и d2 из исходного вопроса вместо того, чтобы писать новую функцию. Решение Анубхава лучше. – tylert

Смежные вопросы