Curvatura della curva in Python

Manav Narula 15 febbraio 2024
Curvatura della curva in Python

La curvatura è una misura della devianza di una curva dall’essere una linea retta. Ad esempio, un cerchio avrà la sua curvatura come il reciproco del suo raggio, mentre le linee rette avranno una curvatura di 0.

In questo tutorial impareremo come calcolare la curvatura di una curva in Python usando il modulo numpy. Calcoleremo anche altre quantità come velocità, accelerazione e altro. Puoi trovare le formule necessarie per loro nella foto qui sotto.

formula di curvatura

Lavoreremo con la seguente curva.

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

Produzione:

curvatura della curva

Per tali problemi relativi alle curve, dobbiamo calcolare le derivate della curva data in ogni punto. In questi casi viene utilizzato il metodo numpy.gradient(), che restituisce il gradiente di un array N-Dimensionale.

Nel codice seguente, calcoliamo la velocità per la curva in tutti i punti.

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)

Produzione:

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

Dopo aver calcolato la velocità, procediamo alla velocità. Ora la velocità è il modulo della velocità. Tuttavia, si dovrebbe sapere che fino ad ora tutto è una funzione di t (t rappresenta l’intervallo di tempo). Pertanto, rappresenteremo la velocità come una matrice numpy di valori in ciascuno degli intervalli di tempo di un secondo.

Vedi il codice qui sotto.

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

print(speed)

Produzione:

[1.11803399 1.11803399 0.90138782 0.70710678 0.625      0.55901699
 0.55901699]

Ora per calcolare la tangente, eseguiremo alcune trasformazioni che assicureranno che le dimensioni della velocità e della velocità siano le stesse. Inoltre, dobbiamo essere in grado di dividere la funzione di velocità a valori vettoriali per l’array di velocità scalare.

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

print(tangent)

Produzione:

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

Allo stesso modo, ora possiamo isolare i componenti della tangente e calcolare il suo gradiente per trovare anche il vettore normale.

Implementeremo ora la formula di curvatura fornita nel codice seguente.

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)

Produzione:

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