HOWTO · NumPy

Curvatura della curva in Python

Questo tutorial mostra come trovare la curvatura della curva usando numpy in Python

In questa pagina

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