?中是否有一种计算高阶多元导数(使用有限差分而不是符号计算)的打包方法?
例如,如果f计算函数cos(x)*y从R^2到R,即f接受形状2的数字数组并返回浮点数(或形状()数组),是否有一个函数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 fprime.html 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这样做)。我需要在任意点计算导数,而不需要计算函数在完全笛卡尔网格上的值。
发布于 2019-07-15 12:41:08
是scipy.optimize._approx_derivative干的。然而,这不是一个公共功能,所以如果你最终使用它,你就只能靠自己了。
发布于 2019-07-15 17:07:17
您可以编写一个包装器并使用scipy.misc.derivative函数。
对于简单的x,y导数,使用this答案
对于向量导数,可以定义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.9999833334166673https://stackoverflow.com/questions/57035858
复制相似问题