2017-12-26 4 views
1

Ich habe einen Datensatz, den ich zeichne. Das Ergebnis sieht wie folgt aus Bild: enter image description hereDetektieren der Krümmung eines Plots

Hier ist mein Python-Code:

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') 

Was ich ist das Hinzufügen einer zusätzliche Handlung zu erreichen versuchen, die die Krümmung der primären Handlung verfolgt.

, die wahrscheinlich wie das folgende Bild aussehen: enter image description here

(Dies ist ein Prototyp und die gelben Markierungen sind nur zu zeigen, dass die zweite Darstellung, die die Krümmung des ersten repräsentiert.)

mit einer Punktproduktberechnung der vorherigen und nächsten Tangente für jede der Datenpunkte

Da ich nicht in der Lage war, das Recht numpy/Mathematik Lösung, die ich dies in einer anderen Umgebung als Prototyp zu finden. Das ist also meine „Poor-Herrenanal-Curvature“ Lösung:

enter image description here

Wie kann ich einen zweiten Datensatz, der einmal aufgetragen wird, die Krümmung der primären darstellen?

Haftungsausschluss: Ich habe diese Frage schon einmal gestellt. Allerdings gelang es nicht, eine elegante Lösung zu trainieren. Ich habe auch das Thema Krümmung erforscht und bin mir der Krümmungsberechnungen bewusst. Aber ich kämpfe immer noch mit Python/Numpy und dem richtigen mathematischen Ansatz. Ich habe auch einige Zeit auf der folgenden post verbrachte, konnte aber nicht vollständig Port die Informationen zur Verfügung gestellt, um mein Problem zu lösen.

--- EDIT (1) ---

Hier ist das Ergebnis meiner Lösung: enter image description here

+0

eine Ableitung der Funktion zu nehmen und die Steigung einer Tangente herauszufinden, die das J (θ) in gegebener θ berührt und wenn die Steigung positiv ist Abnahme in der nächsten Iteration näher an den minimalen zu bewegen und den Zustand gesetzt, dass, wenn Neigung ist ein negativer Anstieg ein wenig, wenn es die Tangente berührt, ich denke, das ist, was Sie suchen? –

Antwort

0

die Krümmung kann, um die zweite Ableitung interpretiert werden:

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

aber wenn man Krümmung als Krümmung der 2D-Linie auf Ebene (keine Krümmung der Funktion) erhalten möchten, müssen Sie es von einem Plus von squa Quadratwurzel dritte Macht teilen rot Ableitung von y Daten ((1+y'^2)^(3/2)) :) wie in:

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

wahrscheinlich müssen Sie einige Interpolation machen, aber wenn x-Koordinaten equdistant sind - es wäre viel einfacher.

+0

Danke. In meinem Fall repräsentiert die Kurve Kursdaten. So (Y) Werte sind float Zahlen, während (X) ist, Tage, Stunden oder Minuten. Ich schaute auf den Artikel und es gibt viele verschiedene Formen der Krümmungsberechnung. Ich bin mir nicht sicher, welchen ich implementieren sollte. – symbolix

+0

Wenn X die Zeit ist - dann ist es eigentlich ein Graph einer 1-Variablen-Funktion, keine 2D-Kurve in der Ebene. Ich denke, du solltest das einfachste nehmen - nur die zweite Ableitung. –

+0

Danke. Also, was macht die obige Funktion? -> https://wikimedia.org/api/rest_v1/media/math/render/svg/c92d581fd7b8a66308bde64d64dcd8d71cc66ce0 – symbolix

Verwandte Themen