見出し画像

数学と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, 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)のグラフ描画

$${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のコラムを不定期に綴っています。

この記事が参加している募集

数学がすき

この記事が気に入ったらサポートをしてみませんか?