マクローリン展開をお勉強(Python)

# はじめに
　皆さんは、『予備校のノリで学ぶ「大学の数学・物理」』というYouTubeチャンネルを御存知ですか？私は文系の人間ですが、最近数学で色々表現できることに興味を持ち始め、このチャンネルを見始めました。普通にガチな内容で各定理の証明なども行っているのですが、間に芸やショートコントでスベってくれるので、楽しみながら学習できています。さて、そんな通称「ヨビノリ」に、本があることを最近しって、早速買ってみました。

[ヨビノリ YouTubeチャンネル](https://www.youtube.com/channel/UCqmWJJolqAgjIdLqK3zD1QQ)　
[『予備校のノリで学ぶ大学数学』 Amazonより](https://www.amazon.co.jp/%E4%BA%88%E5%82%99%E6%A0%A1%E3%81%AE%E3%83%8E%E3%83%AA%E3%81%A7%E5%AD%A6%E3%81%B6%E5%A4%A7%E5%AD%A6%E6%95%B0%E5%AD%A6-%E3%83%84%E3%83%9E%E3%82%8B%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%82%92%E5%BE%B9%E5%BA%95%E8%A7%A3%E8%AA%AC-%E3%83%A8%E3%83%93%E3%83%8E%E3%83%AA-%E3%81%9F%E3%81%8F%E3%81%BF/dp/4489023162/ref=sr_1_1?adgrpid=118241306560&hvadid=492510259858&hvdev=c&hvqmt=b&hvtargid=kwd-761731043895&hydadcr=27706_11588539&jp-ad-ap=0&keywords=%E4%BA%88%E5%82%99%E6%A0%A1%E3%81%AE%E3%83%8E%E3%83%AA%E3%81%A7%E5%AD%A6%E3%81%B6%E5%A4%A7%E5%AD%A6%E6%95%B0%E5%AD%A6&qid=1649319026&sr=8-1)

　こちらの本の最初に載っていたのが、「テイラー展開」なるものです。私はド文系の人間なので、「テイラー展開」なんて聞いたこともほとんどなかったのですが、ようするに微分を使って、ある式f(x)に近似した関数を、別の関数で表すことみたいです。要するに、何回微分しても元の関数になるようにすれば、グラフのすべての範囲において元の関数と同じ形状のものが得られますよねって理論だそうです。
　
　このテイラー関数の中でも、a=0まわりのもの（グラフのx軸が0付近のところで考えた展開）を「マクローリン展開」と呼ぶそうです。奥が深いですね。そして、このマクローリン展開を使って、なんとサインコサインのグラフも別の式で表現できてしまうそうです。
[三角関数のマクローリン展開 参考サイト](https://science-log.com/%e6%95%b0%e5%ad%a6/%e5%90%84%e7%a8%ae%e4%b8%89%e8%a7%92%e9%96%a2%e6%95%b0%e3%81%ae%e3%83%9e%e3%82%af%e3%83%ad%e3%83%bc%e3%83%aa%e3%83%b3%e5%b1%95%e9%96%8b/)

　それを、いつものようにmatplotlibで表現したら面白そうだな～と思い、やってみました。

```Python:McLaughlin.py
import numpy as np
import matplotlib.pyplot as plt

def kaijyo(n):
    result = 1
    for i in range(1, n+1):
        result *= i
    return result

def sin(x, n):
    result = 0
    for i in range(1, n+1):
        result += (-1)**(i+1) * (1 / kaijyo(2*i-1)) * x**(2*i-1)
    return result

def cos(x, n):
    result = 1
    for i in range(1, n+1):
        result += (-1)**(i+1) * 1 / kaijyo(2 * (i-1)) * x**(2*(i-1))
    return result

def tan(x, n):
    return sin(x, n) / cos(x, n)

def arctan(x, n):
    result = 0
    for i in range(1, n+1):
        result += (-1)**(i+1) * x**(2*i-1) / (2*i-1)
    return result

x = np.linspace(-2 * np.pi, 2 * np.pi, 101)

for n in range(1, 11, 1):
    plt.plot(x, sin(x, n), label = str(n) + "D")

plt.legend()
plt.ylim(-4,4)
plt.show()

for n in range(1, 11, 1):
    plt.plot(x, cos(x, n), label = str(n) + "D")

plt.legend()
plt.ylim(-4,4)
plt.show()

for n in range(1, 11, 1):
    plt.plot(x, tan(x, n), label = str(n) + "D")

plt.legend()
plt.ylim(-4,4)
plt.show()

for n in range(1, 11, 1):
    plt.plot(x, arctan(x, n), label = str(n) + "D")

plt.legend()
plt.ylim(-4,4)
plt.show()
```

　それぞれの公式を無理やりプログラムに当てはめただけですが、階乗の関数を自作したり、場合分けしなくてすむように式を考えたり、少し工夫が要りました。もっと上手いやり方があるのかもしれません。

　タンジェントについては、式が複雑で、ちょっと簡潔なプログラムにはできなさそうだったので、妥協してsin/cosとしました。
　
[参考：tan xのマクローリン展開をやらないの？](https://ameblo.jp/knife1968/entry-12428159575.html)

　代わりに、arctanは式にできそうだったので、やってみました。しかし今度は、arcsin,arccosが複雑そうでした。

　最後は、お待ちかねのグラッフィング・タイムです。グラッフィングしましょうか。

## sin
![maclolinSin2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475646/2b088d50-5978-369b-3fcd-0971b00d80d6.png)

## cos
![maclolinCos1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475646/8fe27a6a-3b2d-78a4-0c15-f3beaa0e26ba.png)

## tan
![maclolinTan1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475646/2cf15008-f4ba-99df-d978-42daf2948f2d.png)

## arctan
![maclolinArctan1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475646/1cbb1212-9505-5abf-3bbc-a2937a435587.png)

　1D,2D,3D...というのは、1次元、2次元、3次元のことです。3DCGとか2Dのお絵かきとかいうじゃないですか。dimensionのDです。nを無限にして無限項取り出せば元の関数と全く同じ式になるのですが、これを第何項まで取り出すのかが次元ですね。グラフを見ると、確かに次元が増えるにつれて元のあのおなじみのサインコサインのグラフに近い形になっていくのが分かると思います。ちなみに、10次元以上は表示しても大差ないです。

# まとめ

・なぜか、「咲いたコスモスコスモス咲いた」や、学生時代の同級生が「微分積分良い気分♪」と言っていたのを思い出しました。
・何でnumpyをインポートしたのかは分かりません。

# 参考
記事中に載せたサイト以外に、グラフを出す際の処理で、こちらの本も少し参考にしました。

https://www.math-game-labo.com/linalg/