【问题标题】:scipy.misc.derivative for uneven space pointsscipy.misc.derivative 用于不均匀的空间点
【发布时间】:2021-04-05 18:16:48
【问题描述】:

我想计算点集中每个点(第一个和最后一个除外)的二阶导数。该点集具有字典数据类型,类似于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 在 points 字典中不存在,所以它有一个关键错误。我怎么能在这种情况下使用 scipy.misc.derivative ? scipy.misc.derivativedx参数(间距)如何设置?

【问题讨论】:

    标签: python pandas numpy scipy anaconda


    【解决方案1】:

    你必须使用 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 创建样条曲线并计算样条曲线的导数。但我会从上面的基本方案开始,除非有其他令人信服的理由

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      • 2021-07-30
      • 2020-04-20
      相关资源
      最近更新 更多