检测图的曲率

时间:2017-12-26 00:30:31

标签: python numpy matplotlib plot

我有一个我正在密谋的数据集。结果如下图所示: enter image description here

这是我的python代码:

import numpy as np

# Extra plotly bits
import plotly
import plotly.plotly as py
import plotly.graph_objs as go

a = np.array([[1, 0.00617329], [24, 0.133699], [48, 0.130072], [72, 0.0166202], [96, -0.187917], [120, -0.445023], [144, -0.698984],
    [168, -0.942063], [192, -1.15151], [216, -1.30742], [240, -1.36852], [264, -1.33541], [288, -1.18194], [312, -0.982113],
    [336, -0.772301], [360, -0.562501], [384, -0.3764], [408, -0.219537], [432, -0.106257], [456, -0.0369356], [480, -0.000313192]])


trace_a = go.Scatter(
        x = a[:,0],
        y = a[:,1],
        mode = 'lines+markers',
        name = 'a',
        line = dict(
            shape='line',
            color = ('rgb(205, 12, 24)'),
            width = 1)
        )

data = [trace_a]

# Edit the layout
layout = dict(title = 'Curvature Test',
    xaxis = dict(title = 'Data'),
    yaxis = dict(title = 'Value'),
    )

# Prepare Figure
fig = go.Figure(data=data, layout=layout)

# Plot
plotly.offline.plot(fig, filename='curvature.html')

我想要实现的是添加一个追踪主要情节曲率的附加图。

这可能看起来像下图: enter image description here

(这是一个原型,黄色标记只是为了证明第二个图表代表第一个曲线的曲率。)

由于我无法找到合适的numpy / maths解决方案,因此我在其他环境中使用每个数据点的前一个和下一个切线的点积计算对其进行原型设计。所以这是我的'穷人'曲率"溶液:

enter image description here

如何创建第二个数据集,一旦绘制,将表示主要数据集的曲率?

声明: 我之前问过这个问题。但是,没有设法锻炼一个优雅的解决方案。我也研究了曲率的主题,我知道曲率计算。然而,我仍在努力使用python / numpy和正确的数学方法将它们组合在一起。我也在以下post上花了一些时间,但无法完全移植那里提供的信息来解决我的问题。

---编辑(1)---

以下是我的解决方案的结果: enter image description here

1 个答案:

答案 0 :(得分:0)

曲率可以解释为二阶导数:

def derivative(x_data, y_data):
    N = len(x_data)
    delta_x = [x_data[i+1] - x_data[i] for i in range(N - 1)]
    x_prim = [(x_data[i+1] + x_data[i]) / 2. for i in range(N - 1)]
    y_prim = [(y_data[i+1] - y_data[i]) / delta_x[i] for i in range(N - 1)]
    return x_prim, y_prim

x, y = zip(*a)  # a in an array you defined above
x_bis, y_bis = derivative(*derivative(x, y))

但是如果你想将曲率作为平面上2D线的曲率(不是函数的曲率),你需要将它除以 y数据的一个加上平方导数的三次幂的平方根(1+y'^2)^(3/2)):)就像在:

https://en.wikipedia.org/wiki/Curvature#Curvature_of_a_graph

可能你需要做一些插值,但如果x坐标是等距的 - 那就容易多了。