2013-12-20 52 views
10

SciPy関数scipy.misc.derivativeを使用して、最初の引数に関する点の関数の偏微分を計算するのは簡単です。次に例を示します。scipy.misc.derivative多項式関数

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

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

しかし、どのように私は2番目の引数に対する機能fooの導関数を取るに行きますか?私が考えることの1つの方法は、引数を取り消すラムダ関数を生成することですが、それはすぐに煩雑になる可能性があります。

また、関数の引数のいくつかまたはすべてについて偏微分の配列を生成する方法はありますか?私は単純なラッパーを記述し

答えて

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

、そのうちの1人がこれを実装します。私が探していたのは、R 'deriv'関数が提供する機能です。 – tchakravarty

+0

@fgnuはRで覚えていないので、 'deriv 'のドキュメントにリンクできます – 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]))) 

を与える:

素敵だ、と私は偏微分のベクトルとしてそれらを一緒に置くことができますが、そのscipyのダウンロードとSymPyの間考えているだろう
[ 3. 2.]