衍生品在python中爆炸

时间:2015-12-03 08:54:55

标签: python numpy numerical-methods derivative

我试图找到数据集(x,y)的高阶导数。 x和y是长度为N的1D阵列。

假设我将它们生成为:

xder0=np.linspace(0,10,1000)
yder0=np.sin(xder0)

我定义了导数函数,其中包含2个数组(x,y)并返回(x1,y1),其中y1是在每个索引处计算的导数:(y [i + 1] -y [i])/ (X [I + 1] -x [I])。 x1只是x [i + 1]和x [i]

的平均值

这是执行它的功能:

def deriv(x,y):
    delx =np.zeros((len(x)-1), dtype=np.longdouble)
    ydiff=np.zeros((len(x)-1), dtype=np.longdouble)
    for i in range(len(x)-1):
            delx[i]  =(x[i+1]+x[i])/2.0
            ydiff[i] =(y[i+1]-y[i])/(x[i+1]-x[i])
    return delx, ydiff

现在计算一阶导数,我将此函数称为:

xder1, yder1 = deriv(xder0, yder0)

类似于二阶导数,我称这个函数给出了一阶导数作为输入:

xder2, yder2 = deriv(xder1, yder1)

它继续:

xder3, yder3 = deriv(xder2, yder2)
xder4, yder4 = deriv(xder3, yder3)
xder5, yder5 = deriv(xder4, yder4)
xder6, yder6 = deriv(xder5, yder5)
xder7, yder7 = deriv(xder6, yder6)
xder8, yder8 = deriv(xder7, yder7)
xder9, yder9 = deriv(xder8, yder8)

在我达到订单7之后发生了一些奇怪的事情。第7个订单变得非常嘈杂!早期的衍生品都是预期的正弦或余弦函数。然而,第7顺序是一个嘈杂的正弦。因此,之后所有衍生品都会爆炸。

Plot of derivatives till 7th order

知道发生了什么事吗?

1 个答案:

答案 0 :(得分:2)

这是一个众所周知的稳定性问题,使用等间隔点进行数值插值。阅读http://math.stackexchange.com的答案。

要解决此问题,您必须使用非等间距点,例如Lagendre polynomial的根。由于边界处的信息不可用而发生不稳定性,因此根据Lagendre多项式的根或具有类似属性的其他根(例如切比雪夫多项式),需要更多的边界点集中。