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는 시간 간격을 나타냄). 따라서 우리는 속도를 1 초 간격의 값의 숫자 배열로 나타낼 것입니다.

아래 코드를 참조하십시오.

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