Pythonで実装する微分①(多項式関数)|Pythonで実装する高校数学 #3
連載の経緯と多項式関数と三角関数の概要とPython実装は#1で、指数関数、対数関数の概要とPython実装は#2でまとめました。
#3以降では微分について取り扱います。#3では多項式関数の微分について取り扱います。
以下目次になります。
1. 微分の概要の復習&二次関数の導関数の導出とPythonでの実装
2. 多項式関数の微分とPythonでの実装
3. まとめ
1. 微分の概要の復習&二次関数の導関数の導出とPythonでの実装
1節では微分の概要の復習と、イメージを掴むために二次関数の微分係数の数式的な導出とPythonでの実装を通しての結果の比較を行っていきます。まずは微分の概要の復習を行います。
微分については、下記の式で定義されます。
上記の式は一見難しそうに見えますが実は難しくなく、関数のある一点xにおける傾きと捉えることができます。
(微分 - Wikipediaより図はお借りしました)
このことは上図を元に把握することができます。関数の傾きとはyの変化量をxの変化量で割ることで計算することができるのですが、においてなので、傾きを表していると考えることができます。
次にこの定義をにあてはめてみます。
https://lib-arts.hatenablog.com/entry/math_nn2
上記の記事でも取り扱っていますが、下記のように導関数を計算することができます。
したがって、点における傾きはとなります。
理論的には上記で終わりなのですが、以下ではPythonでの実装を通して直感的なイメージをつかめるようにできればと思います。下記コードを実行することで微分が傾きであることと、区間の幅のが0に近づくイメージがつかめるようにしています。
import numpy as np
import matplotlib.pyplot as pltx = np.arange(0.5,2.5,0.01)
f_x = x**2
delta = np.array([1., 0.01])plt.plot(x,f_x,label="y = f(x)")
for h in delta:
f_1 = 1**2
f_1_add_h = (1+h)**2
slope = (f_1_add_h - f_1)/h
tangent_line = slope*(x-1)+1**2
plt.plot(x,tangent_line,label="tangent line. h:"+str(h))
plt.legend()
plt.show()
上記の実行結果は下記のようになります。
確認すると、が1.0から0.01に変わることで、接線に変わっていることが確認できます。
2. 多項式関数の微分とPythonでの実装
2節では多項式関数の微分とPythonでの実装について取り扱っていきます。1節で二次関数を題材に取り扱ったのと同様の形式で、その他の関数の数式での微分とPython実装について取り扱います。
・
数式で解くと下記のようになります。
こちらを実装すると下記のようになります。
import numpy as np
import matplotlib.pyplot as pltx = np.arange(0.5,2.5,0.01)
f_x = x**3
delta = np.array([1., 0.01])plt.plot(x,f_x,label="y = f(x)")
for h in delta:
f_1 = 1**3
f_1_add_h = (1+h)**3
slope = (f_1_add_h - f_1)/h
tangent_line = slope*(x-1)+1**3
plt.plot(x,tangent_line,label="tangent line. h:"+str(h))
plt.legend()
plt.show()
実行結果は下記のようになり、の際に接線が引けていることがわかります。
・
上記のように公式が導けるので、のように計算することができます。
実装は下記を実行してみてください。
import numpy as np
import matplotlib.pyplot as pltx = np.arange(0.5,2.5,0.01)
f_x = x**5
delta = np.array([1., 0.5, 0.01])plt.plot(x,f_x,label="y = f(x)")
for h in delta:
f_1 = 1**5
f_1_add_h = (1+h)**5
slope = (f_1_add_h - f_1)/h
tangent_line = slope*(x-1)+1**5
plt.plot(x,tangent_line,label="tangent line. h:"+str(h))
plt.legend()
plt.show()
下記が実行結果です。
を足していますが、これによりだんだん接線に近づいているというイメージがつかめるかと思います。