【问题标题】:Python discrete differentiationPython离散微分
【发布时间】:2017-03-31 10:39:31
【问题描述】:

我正在读取包含两列数字数据的文件。让第一列为“x”,第二列为“y”。

“x”中的数据不是均匀分布的。也就是说,它是这样的:

2.4 2.6 2.7 3.0 3.2 3.5 ...

数据显然是有限的。它有一个初始值和一个最终值。

我需要在这些数据中找到“不连续性”。我想通过区分数据来做到这一点:dy/dx

我已经搜索过了,但是我找到的所有微分答案都涉及分析函数,例如 y=x**2+1

我的数据是离散的,不适合分析函数。我需要在这个数据上找到每个“x”值的导数,记住“x”不是均匀分布的。

所以,假设我已从数据文件中读取数据,并将它们存储在变量“x”和“y”中。

现在我想要 dy/dx,我想要绘制 dy/dx vs x。

我可以“导入”什么来做这个衍生品?还是我必须自己编写算法?

【问题讨论】:

  • 首先,到目前为止您尝试了什么?请发布您的代码。这实际上取决于您所说的不连续性是什么意思。你是怎么定义的?您是否只想通过肉眼确定情节中是否存在导数跳跃?
  • 我什么都没试过,因为我在 SciPy 和其他包中找到的所有微分例程都需要统一的步长 = h。正如我最初所说,我的步长不统一。我只需要一些东西来区分日期。 “为什么”并不重要。
  • 您需要定义什么是不连续性。然后您可以考虑如何进行检查 - 最有可能使用不太难的手写代码。
  • 这不重要。我只想做导数。

标签: python differentiation


【解决方案1】:

我会自己写the algorithm。没有内置的导入可以做到这一点。以下是一些可用作起点的代码:

>>> xarr = [2.4, 2.6, 2.7, 3.0, 3.2, 3.5, 3.8, 4.1, 5.3]
>>> yarr = [10, 12, 18, 20, 22, 27, 30, 32, 36]
>>> [(y2-y0)/(x2-x0) for x2, x0, y2, y0 in zip(xarr[2:], xarr, yarr[2:], yarr)]
[26.666666666666643, 20.000000000000004, 8.0, 
 14.0, 13.333333333333341, 8.333333333333337, 4.0]

您可以通过根据与三点中心的距离对每一边进行加权来优化近似值,但如果您所做的只是寻找不连续性,这可能不是必需的。

【讨论】:

  • 我可以将最后一行分配给一个变量吗?如 dy=[(y2-y0)/(x2-x0) for x2, x0, y2, y0 in zip(xarr[2:], xarr, yarr[2:], yarr)]
  • 那行得通。这些值对应于xarr[1:-1] 的导数估计。
  • 不应该是zip(xarr[1:], xarr, yarr[1:], yarr)吗?现在,您正在比较的值是两个索引,而不是一个。
  • @Junuxx 这是故意的。如果您使用前向索引和后向索引,则会有更好的数字属性。 en.wikipedia.org/wiki/Symmetric_derivative
【解决方案2】:

我写了一个简单的算法,它把我的数组分成更小的 3 个点的数组。然后通过这三个点拟合一个二阶函数,取其导数,并计算中间点的值。对于端点,我只使用了两个值。

有点乱。而且我知道有更有效的方法来进行循环。这是我所做的:

dydx=[]

for i in range(len(x)):
    if i==0:
        dx=x[i:i+2]
        dy=y[i:i+2]
        order=1
    elif i==len(x)-1:
        dx=x[i-1:i+1]
        dy=y[i-1:i+1]
        order=1
    else:
        dx=x[i-1:i+2]
        dy=y[i-1:i+2]
        order=2
    z=np.polyfit(dx,dy,len(dx)-1)
    f=np.poly1d(z)
    df=np.polyder(f)
    dydx.append(float(df(x[i])))
dydx=np.array(dydx)

关于以消除 if-elif 语句的方式清理此循环的任何建议?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2020-12-30
    • 1970-01-01
    相关资源
    最近更新 更多