ディープラーニングG検定の勉強中 その6(微分)

書籍「最短コースでわかるディープラーニングの数学」の内容に沿って今回も進めていきます。

2-3-1 微分の定義

とある曲線のある点(座標)を通る線、しかもその点だけが触れている線のことを接線と言います。

曲線と、曲線の1点のみに接した線(接線)
2-3-1-4.png

そして、曲線には、接線が触れている点(接点)を中心に拡大を続けると、ほぼ直線と同じになる、という特徴があります。

曲線とそれを拡大した図の説明サイト
Sci-pursuit(微分とは何か? - 中学生でも分かる微分のイメージ)

では、実際の直線と、拡大すると限りなく直線に近付く曲線との違いは何か。
それは、直線にはその線上に常に同じ傾きしかないのに対し、曲線には、その接点ごとに違う傾きを持つ直線(接線)が存在するということです。

曲線と、接点の場所ごとに異なる傾きを持つ接線
2-3-1-1.png

そして、曲線上のある接点ごとの傾きを数値として表したものが「微分」です。


それで、接点ごとの接線の傾きが微分……なのはいいとして、だから、それが何?

と私も思ってしまうのですが、例えば、
x軸を時間、y軸を距離としたときに、
距離/時間で速度が算出されるのですが、この速度が上記の「傾き」に相当します。

つまり、とある事象(車のレース)において、一定時間(x秒)ごとに車が進んだ距離(yメートル)と、その比としての速度がその都度算出されるのなら、その車のレース中の挙動について、速度の観点から分析できるようになるわけです。

そして、グラフでは、とある地点での速度を、傾きを持った直線で表すのです。
ちなみに、速度の場合なら、接線の傾きが大きければ大きいほど、速いことになります(同じ時間でも、より長い距離を走るほうが速い)。


なお、2つの点(始点:x1, y1)、(終点:x2, y2)を通る直線の傾きaは、この式で算出され、

2-3-1-5.png

その直線をグラフで表すと、以下のようになりますが、

始点(5, 15) 終点(15, 35)を通る直線(y = 2x + 5) 傾き2 切片5
2-3-1-6.png

単なる直線だけではなく、曲線のとある接点を通過する接線の傾きを一般式で表すと以下のようになります。

2-3-1-7.png

2つの点を結ぶ直線の傾きという考えは同じで、始点:(x1, y1) 終点:(x2, y2)に当てはめるなら、
始点:(x, f(x)) 終点:(x+h, f(x+h)) となります。

つまり、f(x)はyを意味し、hはx2 - x1を意味しているわけです。


ところで、なぜ傾きの算出にはこの式1があるのに、

式1
2-3-1-5.png

なぜわざわざ別の一般式
式2
2-3-1-7.png

があるのかと思われるかもしれません。この違いは、
式1だと、必ずしも接線にはならない場合があるのに対し、

2-3-1-8.png

式2、つまり微分を計算するための式では

2-3-1-4.png

必ず接線になる傾きが算出される、というところにあるのです。

必ず接線が算出される理由は、式2の極限(lim h→0)にあります。
hは、つまりはxの長さ(x2-x1)なのですが、hを限りなく0に近づける(h→0)ということは、
接点に限りなく近いことを意味するのです。
そして、接点のみを通過する直線は、すなわち接線になるし、
接点を中心にグラフを拡大していくと、それは限りなく接線そのものとなるのです。


というわけで、以下pythonで、2点間を通る直線を描画するグラフのソースと微分の式による二次曲線と接線のグラフを描画するソースとなります。

参考サイト
Qiita([python]算数・数学①~関数と方程式~)
GGE清須電脳倶楽部(05.04 微分)

1.連立一次方程式で2点間を通る直線を描画する
--------------------
import numpy as np
import matplotlib.pyplot as plt
from sympy import Symbol,solve

# Figureを設定
fig = plt.figure()

# Axesを追加
ax = fig.add_subplot(111)

# x軸の目盛設定
ax.set_xticks([-10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50])

# y軸の目盛設定
ax.set_yticks([-10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50])

x1 = 5 # 始点x
y1 = 15 # 始点y
x2 = 15 # 終点x
y2 = 35 # 終点y

#直線の傾き
a = (y2 - y1)/(x2 - x1)   # yの長さをxの長さで割ると傾きが求められる
print("直線の傾きa= " + str(a))

#2点の座標から、直線の式とグラフを求める
a1 = Symbol("a1")
b1 = Symbol("b1")
ex1 = x1*a1 + b1 - y1  # 始点(x1, y1)
ex2 = x2*a1 + b1 - y2  # 終点(x2, y2)
ans = solve((ex1,ex2))
print("傾き=" + str(ans[a1]),"切片=" + str(ans[b1])) # 2点を通る一次直線の式 y = a1 * x + b1

plt.plot(x1,y1,marker="x",color="red") # 始点
plt.plot(x2,y2,marker="x",color="red") # 終点

y = ans[a1] * x + ans[b1]
print("y = " + str(ans[a1]) + "x + " + str(ans[b1]))

#グラフの描画
x = np.arange(0,20) # xの取る数値の範囲
plt.plot(x,y)  # 直線の描画
plt.plot(x1,y1,marker="x",color="red") # 始点の描画
plt.plot(x2,y2,marker="x",color="red") # 終点の描画
plt.grid()
--------------------
出力結果
直線の傾きa= 2.0
傾き=2 切片=5
y = 2x + 5

グラフ
2-3-1-6.png



2.微分の式による、様々なxの値での接線の描写
--------------------
import numpy as np
import matplotlib.pylab as plt

def numerical_diff(f, x):  #傾きを求める
 h = 1e-4 # 0.0001
 return (f(x+h) - f(x-h)) / (2*h)

def function_1(x):    #曲線を求める
 return 0.01*x**2 + 0.1*x

def tangent_line(f, x):  #接線を求める
 d = numerical_diff(f, x)
 print("接線の傾き= " + str(d))
 y = f(x) - d*x
 return lambda t: d*t + y

x = np.arange(-40.0, 40.0, 0.1)  #点描でxが値を取る範囲
y = function_1(x)
plt.xlabel("x")
plt.ylabel("f(x)")

tf = tangent_line(function_1, 5)  #x=5の接線
tf2 = tangent_line(function_1, 0)
tf3 = tangent_line(function_1, -5)
tf4 = tangent_line(function_1, 10)
y2 = tf(x)
y3 = tf2(x)
y4 = tf3(x)
y5 = tf4(x)
plt.plot(x, y) #曲線の描写
plt.plot(x, y2) #接線 x=5 の描写
plt.plot(x, y3)
plt.plot(x, y4)
plt.plot(x, y5)
plt.show()

--------------------
出力結果
接線の傾き= 0.1999999999990898
接線の傾き= 0.1
接線の傾き= -1.3877787807814457e-13
接線の傾き= 0.2999999999986347

グラフ
2-3-1-1.png


進捗状況
最短コースで分かるディープラーニングの数学
54/328ページ まで読了(16.5%)

試験まであと62日

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント