首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高阶多元导数

高阶多元导数
EN

Stack Overflow用户
提问于 2019-07-15 08:23:55
回答 2查看 623关注 0票数 2

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

例如,如果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,例如

代码语言:javascript
复制
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.htmlhttps://github.com/maroba/findiff这样做)。我需要在任意点计算导数,而不需要计算函数在完全笛卡尔网格上的值。

EN

回答 2

Stack Overflow用户

发布于 2019-07-15 12:41:08

scipy.optimize._approx_derivative干的。然而,这不是一个公共功能,所以如果你最终使用它,你就只能靠自己了。

票数 0
EN

Stack Overflow用户

发布于 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)) =方向导数。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57035858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档