Python 如何从一维插值中求导数

Python 如何从一维插值中求导数,python,scipy,Python,Scipy,有没有办法让scipy的interp1d(在线性模式下)返回每个插值点的导数?我当然可以编写自己的1D插值例程,但大概scipy的内部是C语言,因此速度更快,速度已经是一个主要问题 我最终将插值函数的一个munging输入到多维最小化例程中,因此能够传递解析导数将大大加快速度,而不是让最小化例程自己尝试计算它们。而interp1d必须在内部计算它们——因此我可以访问它们吗?使用而不是interp1d,并使用导数方法生成一阶导数。手册页面上的示例非常简单。您可以将和组合起来,但必须考虑以下几点:

有没有办法让scipy的interp1d(在线性模式下)返回每个插值点的导数?我当然可以编写自己的1D插值例程,但大概scipy的内部是C语言,因此速度更快,速度已经是一个主要问题

我最终将插值函数的一个munging输入到多维最小化例程中,因此能够传递解析导数将大大加快速度,而不是让最小化例程自己尝试计算它们。而interp1d必须在内部计算它们——因此我可以访问它们吗?

使用而不是
interp1d
,并使用
导数方法生成一阶导数。手册页面上的示例非常简单。

您可以将和组合起来,但必须考虑以下几点:

调用
导数
方法时,选择一些
dx
作为间距,
x0
处的导数将计算为
x0 dx
x0+dx
之间的一阶差:

derivative(f, x0, dx) = (f(x0+dx) - f(x0-dx)) / (2 * dx)
因此,您不能使用
导数
来接近插值函数范围限制,因为
f
将产生一个值错误,告诉您插值函数未在此处定义

那么,你能做些什么比
dx
更接近这些范围限制呢

如果在
[xmin,xmax]
范围内定义了
f

  • 在范围限制下,您可以在以下位置移动
    x0
    • x0=xmin+dx
      x0=xmax-dx
  • 对于其他点,您可以优化
    dx
    (使其更小)
  • 插值范围外的均匀函数: 如果插值函数恰好在插值范围外是一致的:

    f(x0 < xmin) = f(x0 > xmax) = f_out
    
    线性插值情况: 对于线性情况,仅计算一次点之间的差异可能更便宜:

    import numpy as np
    df = np.diff(y) / np.diff(x)
    

    通过这种方式,您可以将它们作为阵列的组件进行访问。

    据我所知,interp1d内部使用一个。
    BSpline
    有一个
    导数
    ,它给出了
    nu
    th导数

    因此,对于插值
    f=interp1d(x,y)
    可以使用

    fd1=f.\u样条导数(nu=1)
    
    但是,在使用带前导下划线的函数时,请始终谨慎。 我认为,如果选择插值区域之外的值,则不会检查边界。另外,似乎
    BSpline
    附加了一个尾随维度,因此您必须编写

    val=fd1(0)。项()
    val_arr=fd1(np.数组([0,1])[…,0]
    
    不确定这是否是你要问的,但分段线性函数在插值节点上没有定义好的导数。是的,但我基本上从不要求在节点上插值,函数的变化非常平稳,如果我能得到它落在节点上的任意一个右导数或左导数,那就好了。谢谢!我避免使用样条曲线,因为我认为它会慢一些,而且我不需要精度(就像我说的,它已经相当平滑了),但快速计时测试表明,单变量样条曲线比interp1d更有效,所以即使计算导数,它也会更快!(为什么??)一旦拟合完成,通常计算第n阶导数是简单的(理论上,如果使用多项式拟合,甚至比插值更快,因为多项式的幂次更低)Re为什么:
    interp1d
    对二次和/或三次模使用样条拟合。具体的样条曲线拟合程序是不同的,interp1d本身有很多工作要做。interp1d在标准情况下不只是使用线性拟合吗?这就是op所指的。可能值得强调的是,通常(默认情况下)单变量样条线实现的是平滑样条线(即,一条适用于噪声数据的样条线,其节点数小于数据数),而不是插值样条线(节点数=)。要插入数据,请确保在调用UnivariateSpline时设置s=0。也许这条线在这里会更好;它插值,并有一个.导数方法。
    import numpy as np
    df = np.diff(y) / np.diff(x)