我试图找到数据集(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顺序是一个嘈杂的正弦。因此,之后所有衍生品都会爆炸。
知道发生了什么事吗?
答案 0 :(得分:2)
这是一个众所周知的稳定性问题,使用等间隔点进行数值插值。阅读http://math.stackexchange.com的答案。
要解决此问题,您必须使用非等间距点,例如Lagendre polynomial的根。由于边界处的信息不可用而发生不稳定性,因此根据Lagendre多项式的根或具有类似属性的其他根(例如切比雪夫多项式),需要更多的边界点集中。