어떤 함수의 역함수를 수치적으로 만드는 다양한 방법 도입편

인볼루트 함수라고 하는 함수를 소재에, 여러가지 방법으로 수치적으로 역함수를 만든다고 하는 것을 실시해 보고 싶습니다. Python에는 기술 계산에 사용할 수 있는 라이브러리가 많이 갖추어져 있으므로, 그 라이브러리를 활용해 각각의 수법의 한계도 보고 싶습니다.
시도해 보는 방법은 다음 5가지입니다.
- 다항식 회귀 (scikit-learn)
- 지원 벡터 머신 (scikit-learn)
- Newton-Raphson법(SciPy)
- Akima 스플라인 (SciPy)
- 라이브러리에 의존하지 않는 구현

문제 확인



인볼루트 함수란?



인볼루트 함수는 기어의 치아 모양을 결정할 때 사용하는 함수이며, 그 정의 자체는 매우 간단합니다.
$f(\alpha) = tan\\alpha -\alpha$
기어를 계산하는 과정에서 이 함수의 역함수를 계산해야 합니다.

역함수란?



$inv\alpha = f(\alpha)$ 가 알려지면 $inv\alpha$ 에서 반대로 $\alpha$ 를 구해야 한다는 것입니다.
수학 기호를 사용하면 $\alpha = f^{-1}(inv\alpha)$ 로 간단히 표현할 수 있습니다만, 실제로 그 계산을 하는 것은 그다지 쉽지 않습니다.
(주의: $inv\alpha$ 는 $involute(\alpha)$ 의 의미로 사용하고 있습니다. inv는 inverse의 약어가 아닙니다.)

인볼루트 함수를 플롯해 봅니다.



작업은 Jupyter Notebook에서 실시합니다.
먼저 필요한 라이브러리를 가져옵니다.
벡터 데이터를 처리하기 위해 NumPy, 플롯을 위해 Bokeh를 가져옵니다.

Notebook
import numpy as np
from bokeh.plotting import output_notebook, figure, show
output_notebook()

인볼루트 함수를 정의합니다.

Notebook
def involute_ufunc(α):
    return np.tan(α) - α

여기에서는 플롯 작업을 단순화하기 위해 NumPy를 사용합니다.
NumPy에는 배열(numpy.ndarray)의 모든 요소에 일괄적으로 함수를 적용할 수 있는 브로드캐스트라는 기능이 있습니다. math.tan 함수는 브로드캐스트를 지원하지 않으므로 브로드캐스트를 지원하는 numpy.tan 함수를 사용합니다.
involute_ufunc 함수는 $\alpha$ 인수로 배열을 받고 배열의 모든 요소에 인볼루트 함수를 적용하여 배열을 반환합니다.

Notebook
x = np.linspace(- np.pi / 4, np.pi / 4, 1000)
fig = figure(width=400, height=400)
fig.line(np.degrees(x) , involute_ufunc(x))
fig.xaxis.axis_label = '圧力角α (deg)'
fig.yaxis.axis_label = 'invα'
show(fig)



인볼루트 역함수는 이것의 세로축과 가로축을 바꾼 것입니다.


소스 코드



설명에 사용한 Notebook은 Gist에 업로드하고 있습니다.
인볼루트 함수 플롯 .ipynb

기사 링크



어떤 함수의 역함수를 수치적으로 만드는 다양한 방법 그 1 다항식 회귀편 - Qiita

좋은 웹페이지 즐겨찾기