高阶多元导数



有没有一种打包的方法在 Python 中计算高阶多元导数(使用有限差分,而不是符号计算)?

例如,如果f计算函数 cos(x)*y 从 R^2 到 R,即f取形状2的 numpy 数组并返回浮点数(或形状()的数组),是否有一个函数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/generated/scipy.misc.derivative.html https://docs.scipy.org/doc/numpy/reference/generated/numpy.gradient.html https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.approx_fprime.html https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/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

最新更新