微分法#

微分係数と導関数#

微分係数#

関数y=f(x)が連続な区間において、xの変動量(a+h)a=hyの変動量f(a+h)f(a)の比(変化率)の極限

f(a)=limh0f(a+h)f(a)h

が存在するとき、f(x)x=a微分可能 といい、f(a)微分係数 (differential coefficient)という。

例:f(x)=x2の微分係数f(a)

f(a)=limh0(a+h)2a2h=limh02ah+h2h=limh0(2a+h)=2a

導関数#

微分係数f(a)において、aは定義域内の任意の点とみなしてxで表すと

f(x)=limh0f(x+h)f(x)h

f(x)xの関数でもあり、f(x)導関数 (derived function, derivative)と呼ばれる。

微分係数は接線の傾き#

微分係数f(x)は点xにおける曲線f(x)の接線の傾きである。

曲線y=f(x)上の座標(x,y)に点Pをとり、その近くの同曲線上の(x+Δx,y+Δy)に点Qをとる。Qからx軸への垂線とPを通ってx軸に平行な線との交点をRとする。このとき、PR=Δx,PR=Δyである。

QPR=θとおくと

ΔyΔx=QRPR=tanθ
Hide code cell source
import matplotlib.pyplot as plt
import numpy as np

def f(x):
    return x**2

x = np.linspace(0, 5, 50)

fig, ax = plt.subplots(figsize=[3, 2])
ax.plot(x, f(x), color="dimgray")

P = (2, f(2))
ax.scatter(*P, color="dimgray")
ax.text(*P, " P", color="dimgray", va="bottom", ha="center")

Q = (4, f(4))
ax.scatter(*Q, color="dimgray")
ax.text(*Q, " Q", color="dimgray")

R = (Q[0], P[1])
ax.scatter(*R, color="dimgray")
ax.text(*R, " R", color="dimgray")
ax.axvline(R[0], color="dimgray", linestyle=":")
ax.axhline(R[1], color="dimgray", linestyle=":")

ax.set(xlabel="x", ylabel="y")
fig.show()
../../../_images/650fa41dba1d976c18580652f1469b89613cc0e3f1a1de04de8ac47a95c6866f.png

点Qを曲線に沿って点Pに近づけると、Δxは0に近づく。そしてΔx0のとき、曲線QPは一定の直線PTに限りなく近づく。この極限における直線PTを、曲線f(x)の点Pにおける 接線 (tangent)という。曲線f(x)の接線の傾きをtanαと表すと、

f(x)=limΔx0ΔyΔx=tanα

すなわち、微分係数f(x)は点xにおける曲線f(x)の接線の傾きである。

y=f(x)=x2だとするとf(x)=2x

たとえばΔx=0.1とすると

x=1の点で

f(x)=12=1f(x+Δx)=1.12=1.21Δy=0.21

なので

ΔyΔx=0.210.102

x=2の点では

f(x)=22=4f(x+Δx)=2.12=4.41Δy=0.41ΔyΔx=0.410.104

となっており、f(x)=2xになっていることが確認できる

Hide code cell source
def f_prime(x):
    return 2 * x

fig, axes = plt.subplots(figsize=[4, 3], nrows=2, sharex=True)
x = np.linspace(0, 2.2, 50)
axes[0].plot(x, f(x), label="f(x)")
axes[0].set(ylabel="f(x)")
axes[0].grid(True)

axes[1].plot(x, f_prime(x), label="f'(x)")
axes[1].set(ylabel="f'(x)")
axes[1].grid(True)
fig.show()
../../../_images/10b1743fe7b66fd2c3a8272354bad36fefbb421f43d1b3f5f5d3e83d53fcd631.png

微分法の公式#

和と定数倍

微分可能な関数f(x),g(x)について

(f±g)=f±g(kf)=kf(k: 定数 )

積の微分

{f(x)g(x)}=f(x)g(x)+f(x)g(x)

商の微分

{1f(x)}=f(x)[f(x)]2, (f(x)0)
導出
{1f(x)}={f(x)1}

g(u)=u1とおくとg(u)=1u2=1u2なので

{f(x)1}=dg(u)dudf(x)dx=1[f(x)]2f(x)

商の微分2

{f(x)g(x)}=f(x)g(x)f(x)g(x)[g(x)]2, (g(x)0)
import sympy as sp
x = sp.symbols('x')
f = (1 / x) * x**2

sp.diff(f, x)
1

合成関数の微分

y=f(z),z=g(x) のとき、 合成関数 y=f(g(x))の導関数は

dydx=dydzdzdx=f(z)dzdx=f(g(x))g(x)

逆関数の微分

微分可能な1価単調連続関数y=f(x)について、逆関数をx=f1(y)とすれば

dxdy=1/dydx(dydx0 のとき )

対数の微分

(log|x|)=1x(x0)

指数関数の微分

(ex)=ex
証明

y=exとする。x=logyであるから、

dxdy=1y

よって逆関数の公式を利用して

ddxex=dydx=1/dxdy=y=ex

例:y=eax

方法1: u=axとおいて合成関数として

deududaxdx=eaxa=aeax

方法2: logy=axx=logy/aを利用して

dxdy=d(logy/a)dy=a(1/y)logy0a2=1/ya

よって

ddxeax=1/dxdy=a1/y=ay=aeax

例:y=ax

まず、自然対数log=logeで対数をとると、任意の底aに対してlogaxy=ylogaxという性質から

logy=logax=xloga
x=logyloga
dxdy=(1logalogy)=1loga1y=1yloga

逆関数の微分で

dydx=1/dxdy=yloga=axloga

n乗の微分

(xn)=nxn1
証明(正の整数の指数nについて)

等式

anbn=(ab)(an1+an2b+an3b2++abn2+bn1)

を使って、

ddxxn=limh0(x+h)nxnh=limh0{(x+h)x}{(x+h)n1+(x+h)n2x++(x+h)xn2+xn1}h=limh0{(x+h)n1+(x+h)n2x++(x+h)xn2+xn1}=nxn1
証明(任意の指数nについて)
am=Mm=logaM

より、

y=xny=enlogex

y=ez,z=nlogxとして合成関数にして連鎖律を使うと

ddxxn=dydx=dydzdzdx=eznx=xnnx=nxnx1=nxn1

三角関数の微分#

sin x

ddxsinx=cosx
証明
ddxsinx=limh0sin(x+h)sinxh=limh02cos(x+h/2)sin(h/2)h=limh0cos(x+h2)limh0sin(h/2)h/2=cosx

cos x

ddxcosx=sinx
証明
ddxcosx=limh0cos(x+h)cosxh=limh02sin(x+h/2)sin(h/2)h=limh0sin(x+h2)limh0sin(h/2)h/2=sinx

tan x

ddxtanx=1cos2x
証明

商の公式を使って

ddxtanx=ddx(sinxcosx)=(sinx)cosxsinx(cosx)cos2x=cosxcosxsinx(sinx)cos2x=1cos2x

arcsin x

ddxarcsinx=11x2
証明

x=sinyだから、

dxdy=cosy

逆関数の微分法より

ddxarcsinx=dydx=1/dxdy=1cosy=11sin2y=11x2(x±1)

arccos x

ddxarccosx=11x2

arctan x

ddxarctanx=11+x2

連続と微分可能#

  1. 関数がx=aで不連続なら、微分係数は存在しない

  2. 微分可能なら連続である

    • ただし、逆は必ずしも成立しない。連続であっても微分可能とは限らない

ライプニッツの公式#

積の微分公式を一般化したもの。

ライプニッツの公式(Leibniz rule)

(fg)(n)=k=0nnCkf(k)g(nk)

n=1のとき、積の微分公式と一致する。

(fg)=k=011Ckf(k)g(1k)=fg+fg
例:(x2e2)(n)

例:連続だが微分不可能な関数

f(x)=|x|x=0で連続(limx0|x|=0=|0|)だが、微分可能ではない。

右微分係数と左微分係数は

f(+0)=limh+0|h+0||0|h=limh+0hh=1f(0)=limh0|h+0||0|h=limh0hh=1

であり、確定した微分係数f(0)は存在しない。そのため、f(x)=|x|x=0で微分可能ではない

Hide code cell source
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 100)

fig, ax = plt.subplots(figsize=[4,2])
ax.plot(x, abs(x))
ax.set(xlabel="$x$", ylabel=r"$y=|x|$", title=r"$f(x)=|x|$")
fig.show()
../../../_images/95b1cfe1bc1d94d54815f19f7d7857855ef786ca9d45fb8c82226c4d3a46333f.png

対数微分法#

式の両辺の対数をとって微分する方法

y=axの微分をしたいとする。両辺の対数をとってlogy=xlogaとする。

両辺をxで微分すると

1ydydx=loga

よって

dydx=yloga=axloga

高次導関数#

導関数f(x)が微分可能であれば、その導関数

f(x)={f(x)}=limh0f(x+h)f(x)h

を考えることができて、これを元の関数f(x)2次導関数2階導関数 )という。また、このときy=f(x)2回微分可能 であるという。

一般にy=f(x)n回微分できるとき、得られる関数をf(x)n次導関数 (または n階導関数 )といい、

y(n)(x),f(n)(x),dnydxn,dndxnf(x)

などで表す。このとき、f(x)n回微分可能 であるという。

例:y=xaaは自然数でない定数)
y=axa1y=a(a1)xa2y(n)=a(a1)(an+1)xan
sin(x)

y=sinxn 次導関数は y(n)=sin(x+n2π) である。

証明:

n=1ではy=cosx=sin(x+π/2)で成り立つ。

n=kまで成り立っているとする。k次導関数

y(k)=sin(x+k2π)

を微分すると

y(k+1)=sin(x+k+12π)

よって数学的帰納法により、すべてのnで成り立つ。

例(グラフ)#

Hide code cell source
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import ticker
import numdifftools as nd

def f(x):
    return x**2

df = nd.Derivative(f, n=1)
ddf = nd.Derivative(f, n=2)

fig, axes = plt.subplots(figsize=[6, 6], nrows=3, sharex=True)
x = np.linspace(-3, 3, 100)
axes[0].plot(x, [f(x_i) for x_i in x])
axes[0].set(ylabel=r"$f(x)$", title=r"$y = f(x) = x^2$")

axes[1].plot(x, df(x).tolist())
axes[1].set(ylabel=r"$f'(x)$")

axes[2].plot(x, ddf(x).tolist())
axes[2].set(ylabel=r"$f''(x)$")
axes[2].yaxis.set_major_formatter(ticker.StrMethodFormatter("{x:.1f}"))

fig.show()
../../../_images/ac8bf45c093c7525fa08554b75ca25cc0e712e422d7d36bd5c650e25c8e89d3e.png
Hide code cell source
import numpy as np
import matplotlib.pyplot as plt
import numdifftools as nd

def f(x):
    return np.sin(x)

df = nd.Derivative(f, n=1)
ddf = nd.Derivative(f, n=2)

fig, axes = plt.subplots(figsize=[6, 6], nrows=3, sharex=True)
x = np.linspace(-6, 6, 100)
axes[0].plot(x, [f(x_i) for x_i in x])
axes[0].set(ylabel=r"$f(x)$", title=r"$y = f(x) = \sin(x)$")

axes[1].plot(x, df(x).tolist())
axes[1].set(ylabel=r"$f'(x)$")

axes[2].plot(x, ddf(x).tolist())
axes[2].set(ylabel=r"$f''(x)$")

fig.show()
../../../_images/915d5c685fa8ee75d617bebe4bb824e19f113006d4fa3e846829022fcd0b571b.png

memo: 数値微分はapprox_fprimeよりnumpdifftoolsの方が良い様子#

scipyのapprox_fprimeを再帰的に適用することで無理やり2階微分をするとギザギザした導関数になる

Hide code cell source
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import approx_fprime

EPSILON = np.sqrt(np.finfo(float).eps)

def f(x):
    """微分したい対象の関数"""
    return np.sin(x)

def df(x):
    """1次の導関数"""
    return approx_fprime(x, f=f, epsilon=EPSILON)[0]

def ddf(x):
    """2次の導関数"""
    return approx_fprime(x, f=df, epsilon=EPSILON)[0]


fig, axes = plt.subplots(figsize=[6, 6], nrows=3, sharex=True)
x = np.linspace(-6, 6, 100)
axes[0].plot(x, [f(x_i) for x_i in x])
axes[0].set(ylabel=r"$f(x)$", title=r"$y = f(x) = \sin(x)$")

axes[1].plot(x, [df(x_i) for x_i in x])
axes[1].set(ylabel=r"$f'(x)$")

axes[2].plot(x, [ddf(x_i) for x_i in x])
axes[2].set(ylabel=r"$f''(x)$")

fig.show()
../../../_images/aacfec1e265299e0c1b47f8ca05bba4c95f08ae09e58c1a011c59023a0da436b.png

微分#

微分 (differential) は導関数とはまた別に定義される

関数y=f(x)に対して、xの微分dxyの微分dyは、それぞれ

dx=Δxdy=f(x)dx

と定義される。

dydxに伴うyの変化Δyを近似的に表すものとして理工学で用いられる(あくまで近似であり、一般にはdyΔyは一致しない)

ライプニッツの公式#

積の微分公式を一般化したもの。

ライプニッツの公式(Leibniz rule)

(fg)(n)=k=0nnCkf(k)g(nk)

n=1のとき、積の微分公式と一致する。

(fg)=k=011Ckf(k)g(1k)=fg+fg
例:(x2ex)(n)

x2exn次導関数(x2ex)(n)

(x2ex)(n)=k=0nnCk(x2)(k)(ex)(nk)=nC0(x2)(0)(ex)(n0)+nC1(x2)(1)(ex)(n1)+nC2(x2)(2)(ex)(n2)+nC3(x3)(3)(ex)(n3)+=n!0!(n0)!x2ex+n!1!(n1)!2xex+n!2!(n2)!2ex(x2 の 3階以上の微分は定数の微分になりゼロのため、以降の項は消える)=nnx2ex+n12xex+n(n1)22ex=x2ex+2nxex+n(n1)ex=ex{x2+2nx+n(n1)}