scipy.misc.derivative for multiple argument function

后端 未结 3 1715
清酒与你
清酒与你 2020-12-28 18:39

It is straightforward to compute the partial derivatives of a function at a point with respect to the first argument using the SciPy function scipy.misc.derivative

相关标签:
3条回答
  • 2020-12-28 19:34

    Here is an answer for numerical differentiation using 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
    

    Then:

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

    Gives:

    [ 3.  2.]
    
    0 讨论(0)
  • 2020-12-28 19:45

    I would write a simple wrapper, something along the lines of

    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 讨论(0)
  • 2020-12-28 19:46

    Yes, it is implemented in sympy. Demo:

    >>> 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 讨论(0)
提交回复
热议问题