2017-12-26 4 views
1

플로팅중인 데이터 세트가 있습니다. 결과는 다음 그림과 같습니다 enter image description here플롯의 곡률 감지

여기 내 파이썬 코드입니다 : 내가 기본 플롯의 곡률을 추적 추가 플롯을 추가 달성하기 위해 노력하고 무엇

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와 올바른 수학적 접근법을 사용하여이 문제를 해결하기 위해 노력하고 있습니다. 나는 또한 다음에에 약간 시간을 보냈지 만, 내 문제를 해결하기 위해 제공된 정보를 완전히 포팅 할 수 없었습니다.

는 --- EDIT (1) --- 여기서

내 용액의 결과이다 : enter image description here

+0

함수의 미분을 취하고 주어진 θ에서 J (θ)에 닿는 접선의 기울기를 계산합니다. 기울기가 다음 반복에서 양의 감소이면 최소에 가깝게 이동하고 경사 그것이 접선을 만질 때 약간의 음수 증가입니다, 당신이보고있는 것 같아요? –

답변

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 선의 곡률 (곡률이 아닌)에서 곡률을 얻으려면 의 제곱의 제곱근과 squa로 나눌 필요가 있습니다 Y 데이터 ((1+y'^2)^(3/2)) : 그냥 같은 레드 유도체

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

아마 당신은 몇 가지 보간을해야하지만, x 좌표가 equdistant 경우 - 그것은 훨씬 쉽게 될 것입니다.

+0

감사합니다. 필자의 경우 커브는 가격 데이터를 나타냅니다. 따라서 (Y) 값은 부동 소수점 숫자이고, (X)는 일, 시간 또는 분입니다. 기사를 살펴 보니 곡률 계산에는 여러 가지 다른 형태가 있습니다. 어느 것을 구현해야하는지 확실하지 않습니다. – symbolix

+0

X가 시간 인 경우 실제로는 평면상의 2D 커브가 아닌 1 변수 함수의 그래프입니다. 제 생각에 당신은 가장 쉬운 방법을 택해야한다고 생각합니다. –

+0

감사합니다. 위의 함수가 수행하는 작업은 무엇입니까? -> https://wikimedia.org/api/rest_v1/media/math/render/svg/c92d581fd7b8a66308bde64d64dcd8d71cc66ce0 – symbolix