我想计算每个点的二阶导数(除了第一个和最后一个)。这个点集具有字典的数据类型,其类似于points = {x1:y1, x2:y2, ... xn:yn}
,其中所有的x
都是正整数,但是是不均匀间隔的,例如x1=1, x2=2, x3=3, x4=5, x5=7
,x
的数字不是线性增加的,差距可以是随机的,即:x_{i+1} - x_{i}
可以是任何正整数。
对于这个点的字典,我想得到每个点的二阶导数,所以我做了这样的编码:
import numpy as np
from scipy.misc import derivative
def wrapper(x):
return np.array([points[int(i)] for i in x])
y_d2 = derivative(wrapper, np.array(list(points.keys()))[1:-1], dx=1.0, n=2)
在这种情况下,我会在return np.array([points[int(i)] for i in x])
处得到KeyError: 4
。这是因为x=4
在点字典中不存在,所以它有一个关键错误。我如何使用scipy.misc.derivative来处理这种情况?如何设置scipy.misc.derivative
的dx
参数(间距)?
1条答案
按热度按时间von4xj4u1#
你一定要使用scipy.misc.derivative吗?因为它是非常容易计算二阶导数没有
假设您的数据是一个字典:
然后你要做的就是先把它们放到x,y列表中:
然后使用numpy diff计算导数
d2y_dx2
的输出为如所期望的那样。
当然,如果你想用更高精度的公式求导数,还有更复杂的方法,比如你可以从x,y创建一个样条,然后计算该样条的导数。但是,除非有其他令人信服的理由,我还是从上面的基本方案开始