関数のグラフと最大値・最小値をJulia言語で考えてみる
はじめに
高校1年生くらいに数学Iで「二次関数のグラフと最大値・最小値」について学びます。
生徒は「二次関数のグラフを描く」「最大・最小を求める」ことは頭で考えて,紙に書きます。
Julia言語
などのコードを用いたときにどのような流れになるのを考えてみました。
問題
頭で考えて,紙に書く
実際に,頭で考えて,紙に書いてみました。(iPadのGoodnoteに書いているので紙ではないですね。。。)
(1) の手順は
- 平方完成する
- 頂点の位置,凹凸,
切片などを確認y - グラフを描く
(2) の手順は
- グラフより,最大値の位置を確認
-
で考えて,最小値の位置を確認0\leqq x\leqq 3 - 最大値・最小値を求める。
こんな感じでしょうか。
Julia言語で考えてみる
(1) グラフを描くときの基本は 「点を細かく取ってプロットする」 です。
xの値を0~3まで,0.01刻みで考え,そのときの
# 関数定義
f(x) = -3x^2 + 6x - 1
# xの範囲を等間隔で作成
xs = 0:0.001:3
ys = f.(xs)
using Plots
scatter(xs,ys)
もちろん,簡単にグラフの概形を描くこともできます。
using Plots
f(x) = -3x^2 + 6x - 1
plot(f)
(2) 最大値・最小値は細かく刻んだ
# 関数定義
f(x) = -3x^2 + 6x - 1
# xの範囲を等間隔で作成
xs = 0:0.001:3
ys = f.(xs)
# 最大値と最小値を求める
max_idx = argmax(ys)
min_idx = argmin(ys)
x_max = xs[max_idx]
y_max = ys[max_idx]
x_min = xs[min_idx]
y_min = ys[min_idx]
# 結果の表示
println("最大値: f($(x_max)) = $(y_max)")
println("最小値: f($(x_min)) = $(y_min)")
最大値: f(1.0) = 2.0
最小値: f(3.0) = -10.0
まとめ
Julia言語
のコードを描いて求めた流れは,二次関数以外の一般的な関数でも利用できます。 頭で考えるとときには,二次関数のグラフの一般的な概形を知っておかなくてはならず,さらにその概形を考えるためには「平方完成」など頂点の情報が必須となります。
Julia言語
での流れは,「グラフを描くとは?」「最大値・最小値を求めるとは?」というところにフォーカスしているようにも思えました。
せっかくですので,別の関数でもやってみます。
# 関数定義
f(x) = 2cos(x)-3sin(3x)
# xの範囲を等間隔で作成
xs = 0:0.001:3
ys = f.(xs)
# 最大値と最小値を求める
max_idx = argmax(ys)
min_idx = argmin(ys)
x_max = xs[max_idx]
y_max = ys[max_idx]
x_min = xs[min_idx]
y_min = ys[min_idx]
# 結果の表示
println("最大値: f($(x_max)) = $(y_max)")
println("最小値: f($(x_min)) = $(y_min)")
# グラフ
using Plots
plot(f,xlim=(0,3))
最大値: f(1.496) = 3.074243952525017
最小値: f(2.653) = -4.749460549591128
この関数の最大・最小を考えるためには,通常は「三角関数の微分」など理系の高校生がまなぶ数学IIIが必要で,結構大変ですね。頭で考えるにしても,一度,コードを利用して 「グラフの描画→最大値・最小値を求める」 の流れを見ておくのも大切なのではないでしょうか?
Discussion