テイラー展開


#はじめに
理想波形をテイラー展開によって近似し，プログラムを用いてグラフに表します．
今回はeを底とする指数関数とsinとcos関数をテイラー展開します．


#目次
1.[ 求めたい関数のテイラー展開を計算](#求めたい関数のテイラー展開を計算)
・[テイラー展開に必要なライブラリ](#テイラー展開に必要なライブラリ)
・[求めたい理想波形](#求めたい理想波形)
・[結果](#結果)
2.[求めた関数のグラフを描画](#求めた関数のグラフを描画)
・[グラフ描画に必要なライブラリ](#グラフ描画に必要なライブラリ)
・[グラフの設定](#グラフの設定)
・[グラフの描画](#グラフの描画)
3.[ 参考](#参考)

#求めたい関数のテイラー展開を計算


###テイラー展開に必要なライブラリ
求めたい関数のテイラー展開を計算するのに必要なライブラリを入れます．

```python:ライブラリの導入
from sympy import *
import numpy as np
```
今回はsympyとnumpyを使ってテイラー展開を計算します．




###求めたい理想波形
求めたい理想波形を生成します．

```python:理想波形を生成
# 理想波形を生成
cal_x = np.arange(-10, 10.1, 0.1)
exp_cal_y = np.exp(cal_x)
sin_cal_y = np.sin(cal_x)
cos_cal_y = np.cos(cal_x)

```
>numpy.arange(start,stop,step)
 
グラフはx軸を-10から10.1の間に0.1間隔で点を生成します．
 
```python:理想波形のテイラー展開
# シンボルを定義
x = Symbol("x")
 
# 任意点周りのテイラー展開を精度違いで計算する
exp_sol = []                                                # 結果を入れるリスト
sin_sol = []
cos_sol = []
a = 0                                                       # 任意点を指定
print("e^xのx="+str(a)+"周りのテイラー展開は")
for i in range(6):
    exp_taylor = series(exp(x), x=x, x0=a, n=i+3).removeO() # removeO()で剰余項を除去
    print("n="+str(i+2)+"のとき、")
    print(exp_taylor)                                       # 式を表示させて確認
    exp_taylor_y = lambdify(x, exp_taylor, "numpy")         # numpyの関数に変換
    exp_sol.append(exp_taylor_y(cal_x))                     # 関数に値を入れて曲線を計算
 
print()
print("sinxのx="+str(a)+"周りのテイラー展開は")
for i in range(6):
    sin_taylor = series(sin(x), x=x, x0=a, n=i+3).removeO()
    print("n="+str(i+2)+"のとき、")
    print(sin_taylor)
    sin_taylor_y = lambdify(x, sin_taylor, "numpy")
    sin_sol.append(sin_taylor_y(cal_x))
 
print()
print("cosxのx="+str(a)+"周りのテイラー展開は")
for i in range(6):
    cos_taylor = series(cos(x), x=x, x0=a, n=i+3).removeO()
    print("n="+str(i+2)+"のとき、")
    print(cos_taylor)
    cos_taylor_y = lambdify(x, cos_taylor, "numpy")
    cos_sol.append(cos_taylor_y(cal_x))
                 
```

ここではa=0まわりのテイラー展開(マクローリン展開)をしていますが，別の点でもできます．

>▼入力
底がeである指数関数を理想波形としたテイラー展開
sin関数を理想波形としたテイラー展開
cos関数を理想波形としたテイラー展開
▼出力
テイラー展開した形

e^xのx=0周りのテイラー展開は
n=2のとき，
x**2/2 + x + 1
n=3のとき，
x**3/6 + x**2/2 + x + 1
n=4のとき，
x**4/24 + x**3/6 + x**2/2 + x + 1
n=5のとき，
x**5/120 + x**4/24 + x**3/6 + x**2/2 + x + 1
n=6のとき，
x**6/720 + x**5/120 + x**4/24 + x**3/6 + x**2/2 + x + 1
n=7のとき，
x**7/5040 + x**6/720 + x**5/120 + x**4/24 + x**3/6 + x**2/2 + x + 1

sinxのx=0周りのテイラー展開は
n=2のとき，
x
n=3のとき，
-x**3/6 + x
n=4のとき，
-x**3/6 + x
n=5のとき，
x**5/120 - x**3/6 + x
n=6のとき，
x**5/120 - x**3/6 + x
n=7のとき，
-x**7/5040 + x**5/120 - x**3/6 + x

cosxのx=0周りのテイラー展開は
n=2のとき，
1 - x**2/2
n=3のとき，
1 - x**2/2
n=4のとき，
x**4/24 - x**2/2 + 1
n=5のとき，
x**4/24 - x**2/2 + 1
n=6のとき，
-x**6/720 + x**4/24 - x**2/2 + 1
n=7のとき，
-x**6/720 + x**4/24 - x**2/2 + 1

###結果
プログラムを用いて関数をテイラー展開し，理想波形を多項式に展開（変換）しました．

# 求めた関数のグラフを描画
上でテイラー展開して求めた関数をグラフに描画します．

###グラフ描画に必要なライブラリ
グラフに描画するのに必要なライブラリを入れます．

```python:ライブラリの導入
import matplotlib.pyplot as plt
```
今回はmatplotlibを使ってグラフを描画します．

###グラフの設定
どのようなグラフを作りたいか，フォントやスケールの大きさなどを設定します．

```python:グラフの設定
# フォントのサイズと種類を設定
plt.rcParams["font.size"] = 10
plt.rcParams["font.family"] = 'Times New Roman'
 
# 目盛を内側に変更
plt.rcParams["xtick.direction"] = "in"
plt.rcParams["ytick.direction"] = "in"
 
#グラフのサイズを変更
fig = plt.figure(figsize = (15,5))
 
#グラフの位置を配分
exp_ax = fig.add_subplot(131)
sin_ax = fig.add_subplot(132)
cos_ax = fig.add_subplot(133)
 
# 軸のラベルとスケールを設定
exp_ax.set_xlabel('x')
exp_ax.set_ylabel('y')
exp_ax.set_xlim(-10, 10)
exp_ax.set_ylim(-10, 10)
 
sin_ax.set_xlabel('x')
sin_ax.set_ylabel('y')
sin_ax.set_xlim(-10, 10)
sin_ax.set_ylim(-10, 10)
 
cos_ax.set_xlabel('x')
cos_ax.set_ylabel('y')
cos_ax.set_xlim(-10, 10)
cos_ax.set_ylim(-10, 10)
 
#グラフのタイトルを設定
exp_ax.set_title("e^x")
sin_ax.set_title("sinx")
cos_ax.set_title("cosx")


```
 
###グラフの描画
上で決めたグラフの設定を用いて，テイラー展開した関数を描画します．
 
```python:グラフの描画
# データをプロット
#理想波形をプロット
exp_ax.plot(cal_x, exp_cal_y, label="Theory", lw=3, color="black")
#テイラー展開の結果をプロット
for j in range(len(exp_sol)):
    exp_ax.plot(cal_x, exp_sol[j], label="Series:n=" + str(j+2))
 
sin_ax.plot(cal_x, sin_cal_y, label="Theory", lw=3, color="black")
for j in range(len(sin_sol)):
    sin_ax.plot(cal_x, sin_sol[j], label="Series:n=" + str(j+2))
 
cos_ax.plot(cal_x, cos_cal_y, label="Theory", lw=3, color="black")
for j in range(len(cos_sol)):
    cos_ax.plot(cal_x, cos_sol[j], label="Series:n=" + str(j+2))
 
# グラフを表示
plt.legend()
plt.show()
plt.close()

```
>▼出力
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323578/6d47013c-9c87-5a12-549b-f308569460af.png)







#参考
今回参考にさせて頂いたサイト(https://watlab-blog.com/2020/05/05/sympy-taylor-series/ )