見出し画像

Pythonで高校数学:2次関数のグラフ(2)

 Pythonで高校数学:2次関数のグラフ(1) では,基本的な式 f(x)=a(x-p)²+q で,係数を変化させたときのグラフの変化を見るものを作った。
 次は,定義域を変化させたときの2次関数の最大・最小の問題。パターンとしては次の2つが多い。
  (1) 0 ≦ x ≦ a として a を変化させる。
  (2) t ≦ x ≦ t + 1 または t+2 として t を変化させる。
(2)の方が,生徒はわかりにくいようだ。
 なぜわかりにくいか。イメージできないのだろうと思われる。説明するにも,黒板とチョークだけでの授業では限界がある。
 そこで,実際に動かしてみるのがよい。演示でもいいし,生徒が自分で動かしてみてもよい。
 (2) をやってみよう。f(x)=x²-2x-1 (t ≦ x ≦ t + 2) とする。
はじめは 

画像1

 スライダを動かすと

画像2

画像3

画像4

いろいろ動かして,最大・最小となるxの値が変わるところを発見する。もちろん,図を読めることが前提。
プログラミングの学習ではないので,ソースを変更する必要はないが,関数の式くらいは変えられるようにしておこう。プログラミングを教えていなくても,式のところだけ変え方を説明すればよい。

1行目は,JupyterNotebook 用のおまじない。コマンドラインで実行するなら,削除する。
コメント文にある通り,2次関数の定義と表示用文字列の式を変えるだけでよい。
場合によってはそのあとの画面設定を変えてもよい。

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.widgets as wg
#2次関数の定義 と表示用文字列
def f(x):
   return(-x**2 - 2*x + 3)
funcstr = "$f(x)=-x^2-2x+3$"
plt.figure(figsize=(6, 6))
plt.axis([-5, 5, -3, 7])
plt.xticks(range(-5, 6))
plt.yticks(range(-3, 8))
#== 以下は変更しない =============
# 余白設定
plt.subplots_adjust(left=0.2, bottom=0.2)
plt.grid()
plt.axhline(0, lw=1.5, color='k')
plt.axvline(0, lw=1.5, color='k')
x = np.linspace(-10, 10, 100)
y = f(x)
# plot() の戻り値の第1要素を l で受け取る
plt.plot(x, y, lw=1 , ls = '--')
plt.title(funcstr+"$\ (\ t\ \leqq \ x \ \leqq \ t+2)$", fontsize = 14) 
t = 0
x = np.linspace(t, t+2, 50)
y = f(x)
l, = plt.plot(x, y, lw=2, color='b')
# スライダの位置
ax_t = plt.axes([0.2, 0.05, 0.7, 0.04])
# スライダの設定
slider_a = wg.Slider(ax_t, 't', -5, 5, valinit=0, valstep=0.1)
# グラフを再描画する
def update(val):
   t = slider_a.val
   x = np.linspace(t, t+2, 50)
   l.set_xdata(x)
   l.set_ydata(f(x))
slider_a.on_changed(update)

plt.show()

スライダは一つだけなので,(1) のパターンに変更するのも容易だろう。

操作している様子を動画にした。