對於數值區分,您可以使用numdifftools。
import numpy as np
import numdifftools
def fun(A, B, C):
return numpy.sum(numpy.dot(A, B)) + numpy.sum(C)
def fun_A(A, B, C):
J = numdifftools.Jacobian(lambda z: fun(z.reshape(A.shape), B, C).ravel())
return J(A.ravel()).reshape(A.shape)
np.random.seed(1234)
A = np.random.rand(30,30)
B = np.random.rand(30,30)
C = np.random.rand(30,30)
print fun_A(A,B,C)[3,5]
# -> 14.9081790839
# Verify result manually
Ap = A.copy()
Ap[3,5] += 1e-6
print (fun(Ap,B,C) - fun(A,B,C))/1e-6
# -> 14.908178855
你也可以很容易地只是通過少量的增加同時每個元素煮了使用後一種方法自己天真的數值分化程序。
對於這個特定的功能,你可以手工編寫衍生物並實現三個函數fun_dA,fun_dB和fun_dC。或者你正在尋找一個通用的解決方案來實現任意函數'fun'? – Falko 2014-10-02 07:30:48
我在那裏做了一個簡單的例子,但我想要使用的功能非常複雜。我無法從分析中獲得衍生物。我想要比較一般的解決方案 – theincluder 2014-10-02 07:33:29