2013-12-20 4 views
10

SciPy 함수 scipy.misc.derivative을 사용하여 첫 번째 인수에 대한 한 점에서 함수의 편미분도를 계산하는 것은 간단합니다. 다음은 그 예이다 :scipy.misc.derivative mutiple 인수 함수

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

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

하지만 두 번째 인수에 대한 기능 foo의 유도체를 복용에 대해 어떻게 갈 것인가? 내가 생각할 수있는 한 가지 방법은 인수를 rejigs 람다 함수를 생성하는 것입니다,하지만 그것은 신속하게 성가신 얻을 수 있습니다.

또한 함수의 일부 또는 모든 인수와 관련하여 부분 파생 값 배열을 생성하는 방법이 있습니까?

답변

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) 

데모의 라인을 따라 간단한 래퍼, 뭔가를 작성합니다

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

, 그들 중 하나가 이것을 구현할 것입니다. 내가 찾고 있던 것은 R'deriv' 함수가 제공하는 기능입니다. – tchakravarty

+0

@fgnu는 R로 잘 알려지지 않았으므로'deriv '에 대한 문서에 연결할 수 있습니까 – alko

+0

[Here go] (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]))) 

가 제공합니다 :

좋다, 나는 편미분의 벡터로 함께 넣을 수 있지만, SciPy와 SymPy 사이에 생각이나 했 겠어요
[ 3. 2.]