2013-12-20 2 views
10

Прямо вычислить частные производные функции в точке относительно первого аргумента с использованием функции SciPy scipy.misc.derivative. Вот пример:scipy.misc.derivative для функции mutiple argument

def foo(x, y): 
    return(x**2 + y**3) 

from scipy.misc import derivative 
derivative(foo, 1, dx = 1e-6, args = (3,)) 

Но как бы я идти о принятии производной функции foo по отношению ко второму аргументу? Один из способов, который я могу представить, - создать функцию лямбда, которая решает аргументы вокруг, но это может быстро стать громоздким.

Также существует способ создания массива частных производных по некоторым или всем аргументам функции?

ответ

11

Я хотел бы написать простую обертку, что-то вдоль линий

def partial_derivative(func, var=0, point=[]): 
    args = point[:] 
    def wraps(x): 
     args[var] = x 
     return func(*args) 
    return derivative(wraps, point[var], dx = 1e-6) 

Demo:

>>> partial_derivative(foo, 0, [3,1]) 
6.0000000008386678 
>>> partial_derivative(foo, 1, [3,1]) 
2.9999999995311555 
+0

Это хорошо, и я могу положить их вместе как вектор частных производных, но подумал бы, что между SciPy и SymPy, один из них будет реализовывать это. То, что я искал, - это функциональность, предоставляемая функцией R 'ded'. – tchakravarty

+0

@fgnu не совсем понятен с R, вы можете ссылаться на документы для 'производных' – alko

+0

[Здесь вы идете] (http://stat.ethz.ch/R-manual/R-patched/library/stats/html/deriv .html). Чтобы процитировать руководство «Он возвращает вызов для вычисления expr _ и его (частичных) производных одновременно». – tchakravarty

3

Да, это реализуется в sympy. Демонстрация:

>>> from sympy import symbols, diff 
>>> x, y = symbols('x y', real=True) 
>>> diff(x**2 + y**3, y) 
3*y**2 
>>> diff(x**2 + y**3, y).subs({x:3, y:1}) 
3 
0

Вот ответ для численного дифференцирования с использованием numdifftools.

import numpy as np 
import numdifftools as nd 

def partial_function(f___,input,pos,value): 
    tmp = input[pos] 
    input[pos] = value 
    ret = f___(*input) 
    input[pos] = tmp 
    return ret 

def partial_derivative(f,input): 
    ret = np.empty(len(input)) 
    for i in range(len(input)): 
     fg = lambda x:partial_function(f,input,i,x) 
     ret[i] = nd.Derivative(fg)(input[i]) 
    return ret 

Тогда:

print (partial_derivative(lambda x,y: x*x*x+y*y,np.array([1.0,1.0]))) 

Дает:

[ 3. 2.] 

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

  • Нет связанных вопросов^_^