#01 ふれてみよう高校数学 関数
二次関数のグラフと頂点
二次関数とは
ボールを投げ上げたとき、ボールが描く軌道は美しい曲線を描きます。この曲線、実は数式で表せます。それが二次関数です。
たとえば「 メートル進むごとに高さが メートルになる」という関係を表す式。 の最高次数が 2 のとき、これを二次関数と呼びます。一般形は次のように書けます。
グラフは放物線(parabola)と呼ばれる曲線を描き、 なら下に凸(谷型)、 なら上に凸(山型)になります。ボールの軌道は山型()ですね。
標準形(頂点形式)への変換
一般形の を見ただけでは「いちばん高い点(または低い点)がどこか」すぐにはわかりません。そこで平方完成という操作で、頂点の座標が一目でわかる標準形に変換します。
これを 、 とおくと:
- 頂点:
- 対称軸:直線
- のとき、頂点で最小値 をとる(谷の底)
- のとき、頂点で最大値 をとる(山の頂)
具体例
よって頂点は 、対称軸は 。「 のとき が最小」とすぐに読み取れます。
インタラクティブデモ①:係数 a を変えてみよう
マウスを左右に動かすと、係数 の値が変わります(左端で 、右端で )。
放物線の開き方や頂点の位置がどのように変わるかを観察してみましょう。
- (右側):下に凸で谷型——最小値があります
- (左側):上に凸で山型——最大値があります
- が大きいほど放物線は細くなり、小さいほど広がります
対称軸は点線で表示されています。
マウスを左右に動かすと係数 a が変わります
function loop() {
ctx.clearRect(0, 0, W, H);
var ox = W / 2, oy = H / 2;
var scale = 50;
var a = ((mx / W) * 4 - 2);
if (Math.abs(a) < 0.05) a = 0.05 * (a < 0 ? -1 : 1);
var p = 0, q = -1;
function toScreen(x, y) {
return { sx: ox + x * scale, sy: oy - y * scale };
}
// Grid
ctx.strokeStyle = 'rgba(255,255,255,0.07)';
ctx.lineWidth = 1;
for (var gx = -6; gx <= 6; gx++) {
var gs = toScreen(gx, 0);
ctx.beginPath(); ctx.moveTo(gs.sx, 0); ctx.lineTo(gs.sx, H); ctx.stroke();
}
for (var gy = -3; gy <= 3; gy++) {
var gs2 = toScreen(0, gy);
ctx.beginPath(); ctx.moveTo(0, gs2.sy); ctx.lineTo(W, gs2.sy); ctx.stroke();
}
// Axes
ctx.strokeStyle = 'rgba(255,255,255,0.35)';
ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.moveTo(0, oy); ctx.lineTo(W, oy); ctx.stroke();
ctx.beginPath(); ctx.moveTo(ox, 0); ctx.lineTo(ox, H); ctx.stroke();
// Axis labels
ctx.fillStyle = 'rgba(255,255,255,0.5)';
ctx.font = '12px sans-serif';
for (var lx = -5; lx <= 5; lx++) {
if (lx === 0) continue;
var ls = toScreen(lx, 0);
ctx.fillText(lx, ls.sx - 4, oy + 16);
}
for (var ly = -2; ly <= 2; ly++) {
if (ly === 0) continue;
var ls2 = toScreen(0, ly);
ctx.fillText(ly, ox + 6, ls2.sy + 4);
}
// Axis of symmetry (dotted)
var axisX = toScreen(p, 0).sx;
ctx.strokeStyle = 'rgba(255, 200, 80, 0.7)';
ctx.lineWidth = 1.5;
ctx.setLineDash([6, 4]);
ctx.beginPath(); ctx.moveTo(axisX, 0); ctx.lineTo(axisX, H); ctx.stroke();
ctx.setLineDash([]);
// Parabola
var color = a > 0 ? '#4fc3f7' : '#f48fb1';
ctx.strokeStyle = color;
ctx.lineWidth = 2.5;
ctx.beginPath();
var started = false;
for (var xi = -6; xi <= 6; xi += 0.03) {
var yi = a * (xi - p) * (xi - p) + q;
if (Math.abs(yi) > 5) { started = false; continue; }
var s = toScreen(xi, yi);
if (!started) { ctx.moveTo(s.sx, s.sy); started = true; }
else ctx.lineTo(s.sx, s.sy);
}
ctx.stroke();
// Vertex
var vs = toScreen(p, q);
ctx.fillStyle = '#ffeb3b';
ctx.beginPath(); ctx.arc(vs.sx, vs.sy, 6, 0, Math.PI * 2); ctx.fill();
// Vertex label
ctx.fillStyle = '#ffeb3b';
ctx.font = 'bold 13px sans-serif';
ctx.fillText('頂点 (' + p.toFixed(1) + ', ' + q.toFixed(1) + ')', vs.sx + 10, vs.sy - 8);
// Info panel
ctx.fillStyle = 'rgba(0,0,0,0.55)';
ctx.beginPath(); ctx.roundRect(12, 12, 200, 72, 8); ctx.fill();
ctx.fillStyle = color;
ctx.font = 'bold 14px monospace';
ctx.fillText('y = ' + a.toFixed(2) + '(x - ' + p + ')² + ' + q, 20, 34);
ctx.fillStyle = 'rgba(255,200,80,0.9)';
ctx.font = '13px sans-serif';
ctx.fillText('対称軸: x = ' + p, 20, 56);
ctx.fillStyle = 'rgba(255,255,255,0.7)';
ctx.fillText(a > 0 ? '下に凸(最小値あり)' : '上に凸(最大値あり)', 20, 76);
requestAnimationFrame(loop);
}
loop(); インタラクティブデモ②:頂点と対称軸の関係
放物線の頂点は、対称軸と放物線の交点であることを視覚的に確認しましょう。対称軸とは「この線で折り返すと放物線がぴったり重なる」という線のことです。
頂点は対称軸と放物線の交点
var ox = W / 2, oy = H / 2 + 30;
var scale = 45;
var a = 1.2, p = 1, q = -2;
function toScreen(x, y) {
return { sx: ox + x * scale, sy: oy - y * scale };
}
// Grid
ctx.strokeStyle = 'rgba(255,255,255,0.06)';
ctx.lineWidth = 1;
for (var gx = -7; gx <= 7; gx++) {
var gs = toScreen(gx, 0);
ctx.beginPath(); ctx.moveTo(gs.sx, 0); ctx.lineTo(gs.sx, H); ctx.stroke();
}
for (var gy = -4; gy <= 4; gy++) {
var gs2 = toScreen(0, gy);
ctx.beginPath(); ctx.moveTo(0, gs2.sy); ctx.lineTo(W, gs2.sy); ctx.stroke();
}
// Axes
ctx.strokeStyle = 'rgba(255,255,255,0.3)';
ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.moveTo(0, oy); ctx.lineTo(W, oy); ctx.stroke();
ctx.beginPath(); ctx.moveTo(ox, 0); ctx.lineTo(ox, H); ctx.stroke();
// Axis of symmetry
var axisX = toScreen(p, 0).sx;
ctx.strokeStyle = 'rgba(255, 200, 80, 0.8)';
ctx.lineWidth = 2;
ctx.setLineDash([8, 5]);
ctx.beginPath(); ctx.moveTo(axisX, 0); ctx.lineTo(axisX, H); ctx.stroke();
ctx.setLineDash([]);
ctx.fillStyle = 'rgba(255,200,80,0.9)';
ctx.font = '13px sans-serif';
ctx.fillText('x = ' + p + '(対称軸)', axisX + 8, 22);
// Parabola
ctx.strokeStyle = '#4fc3f7';
ctx.lineWidth = 2.5;
ctx.beginPath();
var started = false;
for (var xi = -7; xi <= 7; xi += 0.03) {
var yi = a * (xi - p) * (xi - p) + q;
if (Math.abs(yi) > 6) { started = false; continue; }
var s = toScreen(xi, yi);
if (!started) { ctx.moveTo(s.sx, s.sy); started = true; }
else ctx.lineTo(s.sx, s.sy);
}
ctx.stroke();
// Vertex highlight with pulse ring
var vs = toScreen(p, q);
ctx.strokeStyle = 'rgba(255,235,59,0.4)';
ctx.lineWidth = 1.5;
ctx.beginPath(); ctx.arc(vs.sx, vs.sy, 14, 0, Math.PI * 2); ctx.stroke();
ctx.fillStyle = '#ffeb3b';
ctx.beginPath(); ctx.arc(vs.sx, vs.sy, 6, 0, Math.PI * 2); ctx.fill();
// Vertex label
ctx.fillStyle = '#ffeb3b';
ctx.font = 'bold 13px sans-serif';
ctx.fillText('頂点 (' + p + ', ' + q + ')', vs.sx + 12, vs.sy + 5);
// Formula
ctx.fillStyle = 'rgba(0,0,0,0.55)';
ctx.beginPath(); ctx.roundRect(12, H - 56, 240, 44, 8); ctx.fill();
ctx.fillStyle = '#4fc3f7';
ctx.font = 'bold 14px monospace';
ctx.fillText('y = ' + a + '(x - ' + p + ')² + (' + q + ')', 20, H - 32);
ctx.fillStyle = 'rgba(255,255,255,0.6)';
ctx.font = '12px sans-serif';
ctx.fillText('頂点: (' + p + ', ' + q + ') 対称軸: x = ' + p, 20, H - 14);
平方完成の手順まとめ
「 の係数が のとき、どうやって標準形にするか」の手順です。
| ステップ | 操作 |
|---|---|
| ① | を でくくる |
| ② | を と変形 |
| ③ | を戻して定数項 と合算 |
コツは「 の係数を2で割って2乗すると、補正する数がわかる」という点です。たとえば なら、、 なので と変形できます。
練習問題
次の二次関数を標準形に変換し、頂点と対称軸を求めなさい。
解答
- → 頂点 、対称軸
- → 頂点 、対称軸
- → 頂点 、対称軸
まとめ
- 二次関数 は「放物線」と呼ばれる曲線を描く。ボールの軌跡のような形です
- 平方完成で に変換すると、頂点 と対称軸 が一目でわかる
- :下に凸(谷型)・最小値 /:上に凸(山型)・最大値
- が大きいほど放物線の開き方は狭くなり、細長い形になる