Python 中的曲線曲率

Manav Narula 2021年8月10日
Python 中的曲線曲率

曲率是曲線偏離直線的量度。例如,圓的曲率是半徑的倒數,而直線的曲率是 0。

在本教程中,我們將學習如何使用 numpy 模組在 Python 中計算曲線的曲率。我們還將計算其他量,例如速度,加速度等。你可以在下面的圖片中找到必要的公式。

曲率公式

我們將使用以下曲線。

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

輸出:

曲率曲線

對於與曲線有關的此類問題,我們需要計算給定曲線在每個點的導數。在這種情況下使用 numpy.gradient() 方法,該方法返回 N 維陣列的梯度。

在下面的程式碼中,我們計算所有點的曲線速度。

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)

輸出:

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

在計算速度之後,我們繼續進行速度。現在,速度就是速度的模數。但是,應該知道,到目前為止,所有事物都是 t 的函式(t 表示時間間隔)。因此,我們將在每一秒的時間間隔內將速度表示為數值的 numpy 陣列。

請參見下面的程式碼。

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

print(speed)

輸出:

[1.11803399 1.11803399 0.90138782 0.70710678 0.625      0.55901699
 0.55901699]

現在,為了計算切線,我們將執行一些變換,以確保速度和速度的大小相同。同樣,我們需要能夠將向量值速度函式除以標量速度陣列。

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

print(tangent)

輸出:

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

同樣,我們現在可以隔離切線的分量並計算其梯度以找到法線向量。

現在,我們將在下面的程式碼中實現提供的曲率公式。

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)

輸出:

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