動かざることバグの如し

近づきたいよ 君の理想に

Sympyで微分をして極値を計算してみる

Pythonだったら一発で微分できるんじゃね?っと思ったらちゃんと専用のライブラリがあった。さすがPython先輩

環境

SymPyとは

SymPyとは、公式曰く SymPy is a Python library for symbolic mathematics とも言っているように数学系のPythonライブラリである。雑に言えばマセマティカの数学版

簡単なチュートリアルなら公式が出している。当然英語だが(数学用語は日本語と英語の対応が全然出来てないので個人的にはツラい

Introduction — SymPy 1.4 documentation

インストール

簡単

pip install sympy

早速微分してみる

試しに適当な大学受験に出てくる微分問題をコピってくる。

x**3-3*x+1の場合

import sympy as sym
from sympy.plotting import plot
x = sym.Symbol('x')
expr = x**3-3*x+1
print('f(x) = {}'.format(expr))

diff1 = sym.diff(expr)
print('f\'(x) = {}'.format(diff1))
critical_points = sym.solve(diff1)
for critical_point in critical_points:
    print('x = {}のとき f\'(x) = {}'.format(critical_point, expr.subs(x, critical_point)))
plot(expr, (x, -3, 3))

実行結果は以下

f(x) = x**3 - 3*x + 1
f'(x) = 3*x**2 - 3
x = -1のとき f'(x) = 3
x = 1のとき f'(x) = -1

f:id:thr3a:20190916025938p:plain

すごい。一発で微分してくれるだけじゃなくて、式をplot()に投げるだけでグラフまで生成してくれちゃった。。ハンパない

ちなみにリンク先にもあるが、この場合はx=-1で極大値(グラフが増加から減少に変わる境目の値)が3、x=1で極小値-1になる。

-x**3+6*x**2-12*x+7の場合

もう一問解かせてみる。

import sympy as sym
from sympy.plotting import plot
x = sym.Symbol('x')
expr = -x**3+6*x**2-12*x+7
print('f(x) = {}'.format(expr))

diff1 = sym.diff(expr)
print('f\'(x) = {}'.format(diff1))
critical_points = sym.solve(diff1)
for critical_point in critical_points:
    print('x = {}のとき f\'(x) = {}'.format(critical_point, expr.subs(x, critical_point)))
plot(expr, (x, -3, 3))

実行結果が以下

f(x) = -x**3 + 6*x**2 - 12*x + 7
f'(x) = -3*x**2 + 12*x - 12
x = 2のとき f'(x) = -1

f:id:thr3a:20190916030953p:plain

ちょっとグラフが見づらいので、plot(expr, (x, -3, 6)) にして見てみる

f:id:thr3a:20190916031002p:plain

なるほど、ってことでグラフは常に減少し続けるので極値はなしってことか