[英]Higher-order multivariate derivatives
在Python中是否有一種打包的方法來計算高階多元導數(使用有限差分,而不是符號計算)?
例如,如果f
計算從R ^ 2到R的函數cos(x)* y,即f
接受形狀2
numpy數組並返回浮點數(或shape ()
數組),那么是否存在partial
函數,使得partial([2,1])(f)
計算函數(d ^ 2 / dx ^ 2)(d / dy)f = -cos(x)* 1從R ^ 2到R,例如
np.isclose(partial([2,1])(f)(0),1.0)
默認庫中有許多有限差分工具(“一種方法”太多了):
https://docs.scipy.org/doc/scipy/reference/generation/scipy.misc.derivative.html https://docs.scipy.org/doc/numpy/reference/generation/numpy.gradient.html https: //docs.scipy.org/doc/scipy-0.14.0/reference/generation/scipy.optimize.approx_fprime.html https://docs.scipy.org/doc/scipy-0.14.0/reference/generation/scipy .misc.central_diff_weights.html https://github.com/statsmodels/statsmodels/blob/master/statsmodels/tools/numdiff.py
但是,它們都不能處理多元函數和高階導數,即它們都不能處理上面的工作。
(也有https://pypi.org/project/numdifftools/,但這似乎不足以滿足我的要求。作者們沒有回答我的問題。)
自己編寫工具很容易。 然而,似乎很難做到這一點,即以准確和穩定的方式。 例如,對於小於1e-3
網格寬度,即使對於上述簡單函數以及僅是二階混合導數,直接的遞歸實現也是不穩定的。
PS:我不是在要求數組的有限差異( https://docs.scipy.org/doc/numpy/reference/generated/numpy.diff.html和https://github.com/maroba/findiff會做到這一點)。 我需要在任意點上評估導數,而無需在完整的笛卡爾網格上計算函數的值。
有scipy.optimize._approx_derivative
可以做到。 但是,這不是公共功能,因此,如果最終使用它,您將自己承擔責任。
您可以編寫包裝器並使用scipy.misc.derivative
函數。
對於簡單的x,y導數,請使用此答案
對於向量導數,您可以定義g(t, (x, y), vector) = f((x,y) + t * vector)
,得出g'(0, args=((x,y), vector)) =
所選向量方向上的方向導數
from scipy.misc import derivative
f = lambda x: x[0] * np.cos(x[1])
def vector_derivative(f, x0, vector, delta=1):
def wrapper(x, x0, vector):
return f(np.asarray(x0) + x * np.asarray(vector))
return derivative(wrapper, 0, args=(x0, vector), dx=delta)
vector_derivative(f, [1, np.pi/2], [0, 1], delta=0.01)
>> -0.9999833334166673
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.