Pythonで実装する微分①(多項式関数)|Pythonで実装する高校数学 #3

f:id:lib-arts:20190801193616p:plain

連載の経緯と多項式関数と三角関数の概要とPython実装は#1で、指数関数、対数関数の概要とPython実装は#2でまとめました。

#3以降では微分について取り扱います。#3では多項式関数の微分について取り扱います。
以下目次になります。
1. 微分の概要の復習&二次関数の導関数の導出とPythonでの実装
2. 多項式関数の微分Pythonでの実装
3. まとめ


1. 微分の概要の復習&二次関数の導関数の導出とPythonでの実装
1節では微分の概要の復習と、イメージを掴むために二次関数の微分係数の数式的な導出とPythonでの実装を通しての結果の比較を行っていきます。まずは微分の概要の復習を行います。
微分については、下記の式で定義されます。
\displaystyle \lim_{h \to 0} \frac{f(x+h)-f(x)}{h}
上記の式は一見難しそうに見えますが実は難しくなく、関数のある一点xにおける傾きと捉えることができます。

f:id:lib-arts:20190801195014p:plain
微分 - Wikipediaより図はお借りしました)
このことは上図を元に把握することができます。関数の傾きとはyの変化量をxの変化量で割ることで計算することができるのですが、\frac{f(x+h)-f(x)}{h}において\frac{\Delta y}{\Delta x}=\frac{f(x+h)-f(x)}{h}なので、傾きを表していると考えることができます。


次にこの定義をf(x)=x^2にあてはめてみます。
https://lib-arts.hatenablog.com/entry/math_nn2
上記の記事でも取り扱っていますが、下記のように導関数を計算することができます。
f'(x) = \lim_{h \to 0} {\Large \frac{(x+h)^2 - x^2} {h}} = \lim_{h \to 0} {\Large \frac{2xh + h^2} {h}} = \lim_{h \to 0}(2x+h) = 2x
したがって、点xにおける傾きはf'(x)=2xとなります。

理論的には上記で終わりなのですが、以下ではPythonでの実装を通して直感的なイメージをつかめるようにできればと思います。下記コードを実行することで微分が傾きであることと、区間の幅のhが0に近づくイメージがつかめるようにしています。

import numpy as np
import matplotlib.pyplot as plt

x = 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()

上記の実行結果は下記のようになります。

f:id:lib-arts:20190801230436p:plain

確認すると、hが1.0から0.01に変わることで、接線に変わっていることが確認できます。

 

2. 多項式関数の微分Pythonでの実装
2節では多項式関数の微分Pythonでの実装について取り扱っていきます。1節で二次関数を題材に取り扱ったのと同様の形式で、その他の関数の数式での微分Python実装について取り扱います。

f(x)=x^3
数式で解くと下記のようになります。
f'(x) = \lim_{h \to 0} {\large \frac{(x+h)^3 - x^3} {h}} = \lim_{h \to 0} {\large \frac{3x^2h + 3xh^2 + h^3} {h}} = \lim_{h \to 0}(3x^2+3xh+h^2) = 3x^2
こちらを実装すると下記のようになります。

import numpy as np
import matplotlib.pyplot as plt

x = 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()

実行結果は下記のようになり、h=0.01の際に接線が引けていることがわかります。

f:id:lib-arts:20190801231919p:plain 

f(x)=x^5
f'(x) = \lim_{h \to 0} {\large \frac{(x+h)^n - x^n} {h}} = \lim_{h \to 0} {\large \frac{nx^{n-1}h + ...} {h}} = \lim_{h \to 0}(nx^{n-1}+h(...)) = nx^{n-1}
上記のように公式が導けるので、f'(x)=5x^4のように計算することができます。
実装は下記を実行してみてください。

import numpy as np
import matplotlib.pyplot as plt

x = 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()

下記が実行結果です。

f:id:lib-arts:20190801232431p:plain

h=0.5を足していますが、これによりだんだん接線に近づいているというイメージがつかめるかと思います。

 
3. まとめ
#3では多項式関数の微分について取り扱いました。
#4ではその他の関数の微分について見ていければと思います。