Courbure de courbe en Python

Manav Narula 10 aout 2021
Courbure de courbe en Python

La courbure est une mesure de l’écart d’une courbe par rapport à une ligne droite. Par exemple, un cercle aura sa courbure comme l’inverse de son rayon, tandis que les lignes droites ont une courbure de 0.

Dans ce tutoriel, nous allons apprendre à calculer la courbure d’une courbe en Python à l’aide du module numpy. Nous calculerons d’autres quantités comme les vitesses, l’accélération, etc. Vous pouvez trouver les formules nécessaires pour eux dans l’image ci-dessous.

formule de courbure

Nous travaillerons avec la courbe suivante.

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

Production:

courbure de la courbe

Pour de tels problèmes liés aux courbes, nous devons être de calculer les dérivées de la courbe donnée en chaque point. La méthode numpy.gradient() est utilisée pour de tels cas, qui retourne le gradient d’un tableau N-Dimensionnel.

Dans le code suivant, nous calculons la vitesse de la courbe en tous points.

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)

Production:

[[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 ]]

Après avoir calculé la vitesse, nous passons à la vitesse. Maintenant, la vitesse est le module de la vitesse. Cependant, il faut savoir que jusqu’à présent, tout est fonction de t (t représente l’intervalle de temps). Ainsi, nous représenterons la vitesse sous la forme d’un tableau numpy de valeurs à chacun des intervalles d’une seconde.

Voir le code ci-dessous.

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

print(speed)

Production:

[1.11803399 1.11803399 0.90138782 0.70710678 0.625      0.55901699
 0.55901699]

Maintenant, pour calculer la tangente, nous allons effectuer une transformation qui garantira que la taille de la vitesse et de la vitesse est la même. En outre, nous devons être en mesure de diviser la fonction de vitesse à valeur vectorielle en tableau de vitesse scalaire.

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

print(tangent)

Production:

[[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 ]]

De même, nous pouvons maintenant isoler les composantes de la tangente et calculer son gradient pour trouver également le vecteur normal.

Nous allons maintenant implémenter la formule de courbure fournie dans le code ci-dessous.

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)

Production:

[0.         0.04472136 0.17067698 0.26516504 0.256      0.17888544
 0.        ]
Auteur: Manav Narula
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