数学とPython 1 積分を含む関数 ~ 定積分・微分・可視化
はじめに
シリーズ数学とPythonのご案内
「シリーズ数学とPython」は、数学の学習中に「解けない、無理~」と焦ったときに、Pythonで数値の動きや可視化を行って、理解の糸口を見つけたときのことを記事にします。
データサイエンス数学ストラテジスト上級公式問題集
この記事は「データサイエンス数学ストラテジスト上級公式問題集」の問題の解読中に見つけたヒントを取り扱います。
今回取り組む問題
問題7「積分を含んだ関数の極大値と極小値は?」
Python実装
やりたいこと
関数$${f(x)=\displaystyle \int^x_{-1}(t^2-t-2)dt}$$に関する次の3点
・定積分
・微分
・関数のグラフ化
作戦
SymPyを用いて定積分と微分を実装します。
SymPyはPythonの代数計算ライブラリです。
「Python × 数学ブートキャンプ」でSymPyを学習しました。
ありがとうございます!
ちなみにブートキャンプの関連記事はこちら(SymPyを使っていません・・・)
実装の開始
インポート
from sympy import integrate, diff, solve, Symbol, init_printing
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = "MS Gothic"
関数$${\boldsymbol{f(x)}}$$の定積分計算
2つの変数$${t,x}$$を定義して、$${f}$$に被積分関数$${t^2-t-2}$$を設定します。
sympyのintegrateで定積分の計算をして$${f2}$$に代入します。
引数は、integrate( 被積分関数, ( 積分変数, 積分区間の下端, 上端 ))です。
### 定積分計算 by sympy.integrate
# 計算結果の数式を見やすくする
init_printing
# 積分変数tの定義
t = Symbol('t')
# 変数xの定義
x = Symbol('x')
# 被積分関数の定義
f = t**2-t-2
# 定積分の計算 (被積分関数, (積分変数,積分区間の下端, 上端))
f2 = integrate(f, (t, -1, x))
display(f2)
見事に正解を出力してくれました!
関数$${\boldsymbol{f(x)}}$$の微分
$${f2}$$に代入した定積分の結果の関数を微分します。
つまり、$${f(x)=\cfrac{x^3}{3}-\cfrac{x^2}{2}-2x-\cfrac{7}{6}}$$を$${x}$$で微分します。
微分計算はsympyの diff を利用します。
引数は、diff( 関数, 変数 )です。
### 微分計算 by sympy.diff
diff(f2, x)
見事に正解を出力してくれました!
$${\boldsymbol{f(x), f\ '(x)}}$$のグラフを描画
次の2つの関数をプロットします。
・$${f(x)=\cfrac{x^3}{3}-\cfrac{x^2}{2}-2x-\cfrac{7}{6}}$$
・$${f\ '(x)=x^2-x-2}$$
極値の計算にsympyのsolveを用います。
solveで$${f\ '(x)=0}$$の解を求めています。
### 準備処理
# f(x)の関数定義
def f(x):
return x**3/3 - x**2/2 -2*x -7/6
# f'(x)の関数定義
def f_dash(x):
return x**2 - x - 2
# 極値の計算 f'(x)=0の解を算出
ext1, ext2 = solve(diff(f2, x)) # [-1, 2]
# 関数値の取得
x1 = np.linspace(-3, 4, 1001)
y1 = f(x1) # f(x)
y2 = f_dash(x1) # f'(x)
### プロット
# 補助線の描画
plt.axhline(0, lw=0.5, ls='--', color='black')
plt.axvline(-1, lw=0.5, ls='--', color='black')
plt.axvline(2, lw=0.5, ls='--', color='black')
# f(x)、f'(x)の描画
plt.plot(x1, y1, label='$f(x)=x^3/3-x^2/2-2x-7/6$', c='steelblue')
plt.plot(x1, y2, label='$f^{\ \prime}(x)=x^2-x-2$', c='green')
# 極大値、極小値の描画
plt.hlines(f(ext1), ext1-0.5, ext1+0.5, color='red',
label=f'極大値: {f(ext1):.1f}')
plt.hlines(f(ext2), ext2-0.5, ext2+0.5, color='darkorange',
label=f'極小値: {f(ext2):.1f}')
# 修飾
plt.xlabel('$x$')
plt.ylabel('$f\ (x),\ f\ ^{\prime}(x)$')
plt.legend()
plt.show()
$${f(x), f\ '(x)}$$はこのような形状だったのですね!
増減表と比べてみましょう。
【増減表】
$$
\begin{array}{c|c:c:c:c:c}
x & \cdots & -1 & \cdots & 2 & \cdots \\
\hline
f\ '(x) & + & 0 & - & 0 & + \\
\hline
f(x) & \nearrow & 0 & \searrow & -4.5 & \nearrow \\
\end{array}
$$
極値を判断する際、増減表と一緒にグラフを読むことによって、次のことを理解できました。
・関数$${f(x)}$$が持つグラフの山・谷の形状と極値の関係
・関数$${f\ '(x)}$$の値がプラス・マイナスに転じる箇所と極値の関係
可視化できてよかったです!
(数式と比べて優しい温もりを感じます😉)
おわりに
SymPyは便利です!重宝しています!
しかし、SymPyに頼りすぎて計算力が低下しないか、心配(sympy)です。
お後がよろしいようで。
おわり
ブログの紹介
noteで3つのシリーズ記事を書いています。
ぜひ覗いていってくださいね!
1.のんびり統計
統計検定2級の問題集を手がかりにして、確率・統計をざっくり掘り下げるブログです。
雑談感覚で大丈夫です。ぜひ覗いていってくださいね。
統計検定2級公式問題集CBT対応版に対応しています。
2.Python機械学習プログラミング実践記
書籍「Python機械学習プログラミング PyTorch & scikit-learn編」を学んだときのさまざまな思いを記事にしました。
この書籍は、scikit-learnとPyTorchの教科書です。
よかったらぜひ、お試しくださいませ。
3.データサイエンスっぽいことを綴る
統計、データ分析、AI、機械学習、Pythonのコラムを不定期に綴っています。