scipy.misc.derivative для множественной функции аргумента
Прямо вычислить частные производные функции в точке относительно первого аргумента, используя функцию 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
по второму аргументу? Один из способов, который я могу представить, - создать функцию лямбда, которая решает аргументы вокруг, но это может быстро стать громоздким.
Кроме того, существует ли способ генерировать массив частных производных по некоторым или всем аргументам функции?
Ответы
Ответ 1
Я бы написал простую оболочку, что-то вроде строк
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
Ответ 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
Ответ 3
Вот ответ для численного дифференцирования с помощью 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.]