scipy 非均匀空间点广义导数

pn9klfpd  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(115)

我想计算每个点的二阶导数(除了第一个和最后一个)。这个点集具有字典的数据类型,其类似于points = {x1:y1, x2:y2, ... xn:yn},其中所有的x都是正整数,但是是不均匀间隔的,例如x1=1, x2=2, x3=3, x4=5, x5=7x的数字不是线性增加的,差距可以是随机的,即: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.derivativedx参数(间距)?

von4xj4u

von4xj4u1#

你一定要使用scipy.misc.derivative吗?因为它是非常容易计算二阶导数没有
假设您的数据是一个字典:

points = {1:2, 2:2, 4:4, 5:5}

然后你要做的就是先把它们放到x,y列表中:

x,y = list(points.keys()), list(points.values())

然后使用numpy diff计算导数

dy_dx = np.diff(y)/np.diff(x)
d2y_dx2 = np.diff(dy_dx)/np.diff(x[:-1])

d2y_dx2的输出为

array([1., 0.])

如所期望的那样。
当然,如果你想用更高精度的公式求导数,还有更复杂的方法,比如你可以从x,y创建一个样条,然后计算该样条的导数。但是,除非有其他令人信服的理由,我还是从上面的基本方案开始

相关问题