LoginSignup
0
0

More than 1 year has passed since last update.

テイラー展開

Last updated at Posted at 2021-12-24

はじめに

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

目次

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

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

テイラー展開に必要なライブラリ

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

ライブラリの導入
from sympy import *
import numpy as np

今回はsympyとnumpyを使ってテイラー展開を計算します.

求めたい理想波形

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

理想波形を生成
# 理想波形を生成
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間隔で点を生成します.

理想波形のテイラー展開
# シンボルを定義
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 + x2/2 + x + 1
n=4のとき,
x
4/24 + x3/6 + x2/2 + x + 1
n=5のとき,
x
5/120 + x4/24 + x3/6 + x2/2 + x + 1
n=6のとき,
x
6/720 + x5/120 + x4/24 + x3/6 + x2/2 + x + 1
n=7のとき,
x
7/5040 + x6/720 + x5/120 + x4/24 + x3/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 - x3/6 + x
n=6のとき,
x
5/120 - x3/6 + x
n=7のとき,
-x
7/5040 + x5/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 - x2/2 + 1
n=5のとき,
x
4/24 - x2/2 + 1
n=6のとき,
-x
6/720 + x4/24 - x2/2 + 1
n=7のとき,
-x
6/720 + x4/24 - x*2/2 + 1

結果

プログラムを用いて関数をテイラー展開し,理想波形を多項式に展開(変換)しました.

求めた関数のグラフを描画

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

グラフ描画に必要なライブラリ

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

ライブラリの導入
import matplotlib.pyplot as plt

今回はmatplotlibを使ってグラフを描画します.

グラフの設定

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

グラフの設定
# フォントのサイズと種類を設定
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")


グラフの描画

上で決めたグラフの設定を用いて,テイラー展開した関数を描画します.

グラフの描画
# データをプロット
#理想波形をプロット
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://watlab-blog.com/2020/05/05/sympy-taylor-series/ )

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0