Kurvenkrümmung in Python

Manav Narula 10 August 2021
Kurvenkrümmung in Python

Die Krümmung ist ein Maß für die Abweichung einer Kurve von einer geraden Linie. Beispielsweise hat ein Kreis seine Krümmung als Kehrwert seines Radius, während gerade Linien eine Krümmung von 0 haben.

In diesem Tutorial erfahren Sie, wie Sie die Krümmung einer Kurve in Python mithilfe des NumPy-Moduls berechnen. Wir werden auch andere Größen wie Geschwindigkeiten, Beschleunigung und mehr berechnen. Die dafür erforderlichen Formeln finden Sie im Bild unten.

Krümmungsformel

Wir werden mit der folgenden Kurve arbeiten.

import numpy as np
import matplotlib.pyplot as plt

coordinates = np.array(
    [[1, 1], [1.5, 2], [2, 3], [2.5, 3.5], [3, 4], [3.5, 4.25], [4, 4.5]]
)

plt.plot(coordinates[:, 0], coordinates[:, 1])

Ausgabe:

Kurvenkrümmung

Für solche Probleme im Zusammenhang mit Kurven müssen wir die Ableitungen der gegebenen Kurve an jedem Punkt berechnen. In solchen Fällen wird die Methode numpy.gradient() verwendet, die den Gradienten eines N-dimensionalen Arrays zurückgibt.

Im folgenden Code berechnen wir die Geschwindigkeit für die Kurve an allen Punkten.

x_t = np.gradient(coordinates[:, 0])
y_t = np.gradient(coordinates[:, 1])

vel = np.array([[x_t[i], y_t[i]] for i in range(x_t.size)])

print(vel)

Ausgabe:

[[0.5   1.   ]
 [0.5   1.   ]
 [0.5   0.75 ]
 [0.5   0.5  ]
 [0.5   0.375]
 [0.5   0.25 ]
 [0.5   0.25 ]]

Nach der Berechnung der Geschwindigkeit fahren wir mit der Geschwindigkeit fort. Jetzt ist die Geschwindigkeit der Modul der Geschwindigkeit. Es sollte jedoch bekannt sein, dass bis jetzt alles eine Funktion von t ist (t repräsentiert das Zeitintervall). Daher werden wir die Geschwindigkeit in jedem Zeitintervall von einer Sekunde als eine Reihe von Werten darstellen.

Siehe den Code unten.

speed = np.sqrt(x_t * x_t + y_t * y_t)

print(speed)

Ausgabe:

[1.11803399 1.11803399 0.90138782 0.70710678 0.625      0.55901699
 0.55901699]

Zur Berechnung der Tangente führen wir nun eine Transformation durch, die sicherstellt, dass die Größe von Geschwindigkeit und Geschwindigkeit gleich ist. Außerdem müssen wir in der Lage sein, die vektorwertige Geschwindigkeitsfunktion in das skalare Geschwindigkeitsarray zu unterteilen.

tangent = np.array([1 / speed] * 2).transpose() * vel

print(tangent)

Ausgabe:

[[0.4472136  0.89442719]
 [0.4472136  0.89442719]
 [0.5547002  0.83205029]
 [0.70710678 0.70710678]
 [0.8        0.6       ]
 [0.89442719 0.4472136 ]
 [0.89442719 0.4472136 ]]

In ähnlicher Weise können wir jetzt die Komponenten der Tangente isolieren und ihren Gradienten berechnen, um auch den Normalenvektor zu finden.

Wir werden nun die bereitgestellte Krümmungsformel im folgenden Code implementieren.

ss_t = np.gradient(speed)
xx_t = np.gradient(x_t)
yy_t = np.gradient(y_t)

curvature_val = np.abs(xx_t * y_t - x_t * yy_t) / (x_t * x_t + y_t * y_t) ** 1.5

print(curvature_val)

Ausgabe:

[0.         0.04472136 0.17067698 0.26516504 0.256      0.17888544
 0.        ]
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn