読者です 読者をやめる 読者になる 読者になる

独自に三角関数を実装する

大抵のプログラミング言語は標準ライブラリに三角関数が実装されています。今回はそのようなライブラリを使わずに独自に三角関数を実装してみました。pythonで実装しましたが、どの言語でも考え方は同じです。また勉強目的の実装なので実用性は考えていないのであしからず。

sinを近似する

\displaystyle\sin{x}=\sum_{i=0}^{\infty}{(-1)^i\frac{x^{2i+1}}{(2i+1)!}}
sinをマクローリン展開すると上記のような式が求まります。これをコードに落とし込んでみましょう。

def my_sin(x, n):
    result = 0
    for i in range(n):
        sign = math.pow(-1, i)
        frac = math.pow(x, 2 * i + 1) / math.factorial(2 * i + 1)
        result += sign * frac
    return result

三角比の相互関係

\displaystyle\sin^2{\theta}+\cos^2{\theta}=1
\displaystyle\tan{\theta}=\frac{\sin{\theta}}{\cos{\theta}}
上記の公式を見るとわかりますが、sinからcosを求めることができ、sinとcosからtanが求められることがわかります。sinはすでに実装したので、式を変形させて残りのcosとtanを実装しましょう。

def my_cos(x, n):
    cos = math.sqrt(1 - math.pow(my_sin(x, n), 2))
    return (-cos, cos)

def my_tan(x, n):
    sin = my_sin(x, n)
    cos = my_cos(x, n)
    return (sin / cos[0], sin / cos[1])

実験

標準ライブラリに実装されている三角関数と今回作った三角関数に、0.125\piを渡して比較してみました。

print("sin")
print(my_sin(radian, n))
print(math.sin(radian))
print("cos")
print(my_cos(radian, n))
print(math.cos(radian))
print("tan")
print(my_tan(radian, n))
print(math.tan(radian))

n=4

sin
0.3826834317539124
0.3826834323650898
cos
(-0.9238795327644447, 0.9238795327644447)
0.9238795325112867
tan
(-0.4142135615980602, 0.4142135615980602)
0.41421356237309503

n=16

sin
0.3826834323650897
0.3826834323650898
cos
(-0.9238795325112867, 0.9238795325112867)
0.9238795325112867
tan
(-0.41421356237309503, 0.41421356237309503)
0.41421356237309503

まとめ

うまく計算できました。nを大きくすることで精度を高めることができます。