繁体   English   中英

Python离散分化

[英]Python discrete differentiation

我正在读取包含两列数值数据的文件。 假设第一列为“ 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。

我可以“导入”哪些将执行此派生操作? 还是我必须自己编写算法?

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

>>> 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]

您可以根据距三点中心的距离对每一侧加权,以细化近似值,但是如果您正在寻找不连续点,则可能不需要这样做。

我写了一个简单的算法,将我的数组分成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语句?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM