Kurvenkrümmung in numpy

7

Ich vermasse x, y Koordinaten (in cm) eines Objekts mit einer speziellen Kamera in festen Zeitintervallen von 1s. Ich habe die Daten in einem numpligen Array:

%Vor%

Und die Kurve sieht so aus:

%Vor%

Frage:

Wie kann ich die tangentialen und radialen Beschleunigungsvektoren an jedem Punkt berechnen? Ich habe einige Formeln gefunden, die relevant sein könnten:

Ich kann die vx und die vy Projektionen einfach mit np.diff(a, axis=0) berechnen, aber ich bin ein numpy / python noob und es ist weit über meinen Kopf, weiterzumachen. Wenn ich die Krümmung an jedem Punkt berechnen könnte, wäre auch mein Problem gelöst. Kann jemand helfen?

    
Elian 01.02.2015, 23:55
quelle

1 Antwort

23

BEARBEITEN : Ich habe diese Antwort ein paar Stunden lang aus- und eingeschaltet, also habe ich Ihre letzten Änderungen verpasst, die darauf hinweisen, dass Sie nur Krümmung benötigen. Hoffentlich wird diese Antwort trotzdem hilfreich sein.

Abgesehen von einigen Kurvenanpassungen ist unsere Methode der Annäherung von Derivaten über finite Differenzen . Zum Glück hat numpy eine gradient -Methode, die diese Differenzberechnungen durchführt Für uns kümmern wir uns um die Details der Mittelung der vorherigen und nächsten Steigungen für jeden inneren Punkt und lassen jeden Endpunkt allein, etc.

%Vor%

Nun berechnen wir die Ableitungen jeder Variablen und fügen sie zusammen (aus irgendeinem Grund, wenn wir nur np.gradient(a) aufrufen, bekommen wir eine Liste von Arrays ... nicht sicher von meinem Kopf was dort abgeht , aber ich werde nur für den Moment daran arbeiten):

%Vor%

Dies gibt uns den folgenden Vektor für velocity :

%Vor%

was bei einem Blick auf das Streudiagramm von a sinnvoll ist.

Für die Geschwindigkeit nehmen wir nun die Länge des Geschwindigkeitsvektors. Eines haben wir jedoch nicht wirklich im Hinterkopf behalten: alles ist eine Funktion von t . Daher ist ds/dt in Wirklichkeit eine skalare Funktion von t (im Gegensatz zu einer Vektorfunktion von t ), genau wie dx/dt und dy/dt . Somit stellen wir ds_dt als ein numpy -Array von Werten in jedem der Zeitintervalle von einer Sekunde dar, wobei jeder Wert einer Annäherung der Geschwindigkeit bei jeder Sekunde entspricht:

%Vor%

Dies ergibt das folgende Array:

%Vor%

was wiederum einen Sinn ergibt, wenn Sie die Lücken zwischen den Punkten auf dem Streudiagramm von a betrachten: Das Objekt nimmt Geschwindigkeit auf, verlangsamt sich ein wenig, wenn es um die Ecke geht, und beschleunigt dann noch mehr .

Um nun den Einheitentangentenvektor zu finden, müssen wir eine kleine Transformation in ds_dt vornehmen, so dass ihre Größe der von velocity entspricht (dies ermöglicht uns effektiv, die vektorwertige Funktion zu teilen velocity durch die (Darstellung der) Skalarfunktion ds_dt ):

%Vor%

Dies ergibt das folgende numpy -Array:

%Vor%

Beachten Sie zwei Dinge: 1. Bei jedem Wert von t zeigt tangent in die gleiche Richtung wie velocity und 2. Bei jedem Wert von t ist tangent ein Einheitsvektor. Tatsächlich:

In [12]:

%Vor%

Nun, da wir die Ableitung des Tangentenvektors nehmen und durch seine Länge dividieren, um den Einheitsnormalenvektor zu erhalten, machen wir denselben Trick (isolieren die Komponenten von tangent zur Vereinfachung):

%Vor%

Dies gibt uns den folgenden Vektor für normal :

%Vor%

Beachten Sie, dass der Normalvektor die Richtung darstellt, in der sich die Kurve dreht. Der obige Vektor ergibt dann in Verbindung mit dem Streudiagramm für a einen Sinn. Insbesondere gehen wir vom Drehen zum Drehen nach dem fünften Punkt und wir beginnen nach dem 12. Punkt nach links zu drehen (in Bezug auf die X-Achse).

Schließlich, um die tangentialen und normalen Komponenten der Beschleunigung zu erhalten, brauchen wir die zweiten Ableitungen von s , x und y in Bezug auf t , und dann können wir die Krümmung und den Rest erhalten unserer Komponenten (unter Berücksichtigung, dass sie alle skalare Funktionen von t sind):

%Vor%     
user554546 02.02.2015, 02:34
quelle

Tags und Links