17

使用 SciPy 函数可以直接计算函数在某个点相对于第一个参数的偏导数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, ))

但是我将如何foo对第二个参数求函数的导数呢?我能想到的一种方法是生成一个 lambda 函数来重新调整参数,但这很快就会变得很麻烦。

另外,有没有办法针对函数的部分或全部参数生成偏导数数组?

4

3 回答 3

21

我会写一个简单的包装器,类似于

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
于 2013-12-20T17:05:30.657 回答
2

是的,它在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
于 2014-04-07T01:14:13.157 回答
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.]
于 2015-08-04T15:55:39.720 回答