簡體   English   中英

高階多元導數

[英]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.htmlhttps://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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM