Python 如何从一维插值中求导数
有没有办法让scipy的interp1d(在线性模式下)返回每个插值点的导数?我当然可以编写自己的1D插值例程,但大概scipy的内部是C语言,因此速度更快,速度已经是一个主要问题 我最终将插值函数的一个munging输入到多维最小化例程中,因此能够传递解析导数将大大加快速度,而不是让最小化例程自己尝试计算它们。而interp1d必须在内部计算它们——因此我可以访问它们吗?使用而不是Python 如何从一维插值中求导数,python,scipy,Python,Scipy,有没有办法让scipy的interp1d(在线性模式下)返回每个插值点的导数?我当然可以编写自己的1D插值例程,但大概scipy的内部是C语言,因此速度更快,速度已经是一个主要问题 我最终将插值函数的一个munging输入到多维最小化例程中,因此能够传递解析导数将大大加快速度,而不是让最小化例程自己尝试计算它们。而interp1d必须在内部计算它们——因此我可以访问它们吗?使用而不是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)