#03 ふれてみよう高校数学 関数

二次関数と判別式

二次方程式の解の個数

想像してみてください——放物線を描いて「xx 軸と何回交わるか?」を考えてみます。

  • 谷型の放物線が xx 軸より上にある → 一度も交わらない
  • 谷型の放物線が xx 軸にちょうど触れる → 1点で接する
  • 谷型の放物線が xx 軸をまたぐ → 2点で交わる

この「何回交わるか」を解の公式から読み取ることができます。二次方程式 ax2+bx+c=0ax^2 + bx + c = 0 の解は解の公式から得られます:

x=b±b24ac2ax = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}

根号の中の b24acb^2 - 4ac の符号が解の個数を決定します。


判別式 D

D=b24ac\boxed{D = b^2 - 4ac}

DD は「判別式(discriminant)」と呼ばれます。「解が何個あるかを判別する」ための値です。

DD の値実数解の個数放物線と x 軸
D>0D > 02個(相異なる2実解)2点で交わる
D=0D = 01個(重解)1点で接する
D<0D < 00個(実数解なし)交わらない

直感的に言えば:DD がプラスなら「解が2つある(xx 軸と2回会う)」、ゼロなら「ちょうど接している(1回だけ会う)」、マイナスなら「浮いている(会わない)」です。


判別式の幾何学的意味

D>0D > 0 ならば D>0\sqrt{D} > 0 なので解は2つ、D=0D = 0 なら D=0\sqrt{D} = 0 で解は1つ(重解)、D<0D < 0 なら D\sqrt{D} が虚数になり実数解はありません。

グラフで見ると、頂点の yy 座標 qq

  • a>0a > 0 の場合:q<0q < 0 なら D>0D > 0q=0q = 0 なら D=0D = 0q>0q > 0 なら D<0D < 0

と対応しています。つまり「谷の底が xx 軸より下(q<0q < 0)か上(q>0q > 0)か」で解の個数が変わるのです。


インタラクティブデモ:判別式と放物線

マウスを上下に動かすと、放物線が縦方向に移動します。判別式 DD の値と x 軸との交点数が変わる様子を観察してみましょう。

  • 青い放物線:D>0D > 0xx 軸と2点で交わる)
  • 緑の放物線:D=0D = 0xx 軸にちょうど接する)
  • 赤い放物線:D<0D < 0xx 軸と交わらない)
マウスを上下に動かすと放物線が移動し、判別式 D が変わります
function loop() {
ctx.clearRect(0, 0, W, H);

var ox = W / 2, oy = H / 2;
var scale = 55;
var a = 1, b = -2;
var shift = ((my / H) * 6 - 3);
// D=0 になる shift = b²/(4a) = 1 の近傍でスナップ
var snapAt = (b * b) / (4 * a);
if (Math.abs(shift - snapAt) < 0.18) shift = snapAt;
var c = shift;
var D = b * b - 4 * a * c;

function toScreen(x, y) {
  return { sx: ox + x * scale, sy: oy - y * scale };
}
function f(x) { return a * x * x + b * x + c; }

// Grid
ctx.strokeStyle = 'rgba(255,255,255,0.06)';
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 = -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();

// Parabola color by discriminant
var pColor = D > 0.05 ? '#4fc3f7' : (D < -0.05 ? '#ef5350' : '#66bb6a');
ctx.strokeStyle = pColor;
ctx.lineWidth = 2.5;
ctx.beginPath();
var started = false;
for (var xi = -6; xi <= 6; xi += 0.03) {
  var yi = f(xi);
  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
var vx = -b / (2 * a), vy = f(vx);
var vs = toScreen(vx, vy);
ctx.fillStyle = '#ffeb3b';
ctx.beginPath(); ctx.arc(vs.sx, vs.sy, 5, 0, Math.PI * 2); ctx.fill();

// Roots (if D >= 0)
if (D >= 0) {
  var sqrtD = Math.sqrt(D);
  var x1 = (-b + sqrtD) / (2 * a);
  var x2 = (-b - sqrtD) / (2 * a);
  var s1 = toScreen(x1, 0), s2 = toScreen(x2, 0);
  ctx.fillStyle = '#ff8a65';
  ctx.beginPath(); ctx.arc(s1.sx, s1.sy, 7, 0, Math.PI * 2); ctx.fill();
  if (Math.abs(x1 - x2) > 0.01) {
    ctx.beginPath(); ctx.arc(s2.sx, s2.sy, 7, 0, Math.PI * 2); ctx.fill();
  }
  ctx.fillStyle = 'rgba(255,138,101,0.9)';
  ctx.font = '12px sans-serif';
  ctx.fillText('x=' + x1.toFixed(2), s1.sx + 8, s1.sy - 10);
  if (Math.abs(x1 - x2) > 0.01) {
    ctx.fillText('x=' + x2.toFixed(2), s2.sx - 50, s2.sy - 10);
  }
}

// D indicator
var dLabel = D > 0.05 ? 'D > 0:2つの実数解' : (D < -0.05 ? 'D < 0:実数解なし' : 'D = 0:重解(接する)');
var dColor2 = D > 0.05 ? '#4fc3f7' : (D < -0.05 ? '#ef5350' : '#66bb6a');

ctx.fillStyle = 'rgba(0,0,0,0.6)';
ctx.beginPath(); ctx.roundRect(10, 10, 270, 90, 8); ctx.fill();
ctx.fillStyle = '#ffffffcc';
ctx.font = 'bold 13px monospace';
ctx.fillText('y = x² + (' + b + ')x + (' + c.toFixed(2) + ')', 18, 32);
ctx.fillStyle = dColor2;
ctx.font = 'bold 14px sans-serif';
ctx.fillText(dLabel, 18, 56);
ctx.fillStyle = 'rgba(255,255,255,0.7)';
ctx.font = '13px monospace';
ctx.fillText('D = b²-4ac = ' + D.toFixed(2), 18, 80);

// Legend bar
var barY = H - 24;
ctx.fillStyle = 'rgba(0,0,0,0.5)';
ctx.beginPath(); ctx.roundRect(10, barY - 16, W - 20, 28, 6); ctx.fill();
ctx.font = '12px sans-serif';
ctx.fillStyle = '#4fc3f7'; ctx.fillText('■ D>0: 2交点', 20, barY);
ctx.fillStyle = '#66bb6a'; ctx.fillText('■ D=0: 接する', 130, barY);
ctx.fillStyle = '#ef5350'; ctx.fillText('■ D<0: 交点なし', 250, barY);

requestAnimationFrame(loop);
}
loop();

解の公式と判別式の導出

「なぜ D=b24acD = b^2 - 4ac の符号で解の個数がわかるのか?」を確認しましょう。

ax2+bx+c=0ax^2 + bx + c = 0 を平方完成で解くと:

a ⁣(x+b2a) ⁣2=b24ac4aa\!\left(x + \frac{b}{2a}\right)^{\!2} = \frac{b^2 - 4ac}{4a} (x+b2a) ⁣2=D4a2\left(x + \frac{b}{2a}\right)^{\!2} = \frac{D}{4a^2}

2=\square^2 = 何か」という形になりました。

  • 右辺が正(D>0D > 0):「2=\square^2 = 正の数」なので =±\square = \pm(何か)の2つの解
  • 右辺がゼロ(D=0D = 0):「2=0\square^2 = 0」なので =0\square = 0 の1つの解(重解)
  • 右辺が負(D<0D < 0):「2=\square^2 = 負の数」は実数では不可能。実数解なし

実用的な判別式の使い方

判別式の最大の利点は「解を実際に計算しなくても、解の個数だけわかる」点です。

例:交点の個数を調べる

直線 y=2x+ky = 2x + k と放物線 y=x2y = x^2 の交点の個数を調べよ(kk はパラメータ)。

「交点の個数」を求めるには、2つの式を連立させ、解の個数を調べればよいです。

連立すると:x2=2x+kx^2 = 2x + kx22xk=0x^2 - 2x - k = 0

D=(2)241(k)=4+4kD = (-2)^2 - 4 \cdot 1 \cdot (-k) = 4 + 4k
  • k>1k > -1D>0D > 0 → 2交点(直線が放物線を「切る」)
  • k=1k = -1D=0D = 0 → 1交点(直線が放物線に「接する」)
  • k<1k < -1D<0D < 0 → 交点なし(直線が放物線の下を通る)

練習問題

次の二次方程式の判別式 DD を求め、解の個数を答えよ。

  1. x25x+6=0x^2 - 5x + 6 = 0
  2. x26x+9=0x^2 - 6x + 9 = 0
  3. 2x2+x+1=02x^2 + x + 1 = 0
  4. x24x+3=0x^2 - 4x + 3 = 0

解答

  1. D=2524=1>0D = 25 - 24 = 1 > 0 → 2実解(x=2,3x = 2, 3
  2. D=3636=0D = 36 - 36 = 0 → 重解(x=3x = 3):ぴったり1点で接する
  3. D=18=7<0D = 1 - 8 = -7 < 0 → 実数解なし:放物線がx軸と交わらない
  4. D=1612=4>0D = 16 - 12 = 4 > 0 → 2実解(x=1,3x = 1, 3

まとめ

D=b24ac{>02つの異なる実数解(放物線がx軸を通り抜ける)=0重解(1つの実数解)(放物線がx軸にちょうど触れる)<0実数解なし(放物線がx軸と会わない)D = b^2 - 4ac \begin{cases} > 0 & \text{2つの異なる実数解(放物線がx軸を通り抜ける)}\\ = 0 & \text{重解(1つの実数解)(放物線がx軸にちょうど触れる)}\\ < 0 & \text{実数解なし(放物線がx軸と会わない)} \end{cases}

判別式は、解を直接求めずに「解が存在するかどうか」「何個あるか」だけを素早く調べる強力なツールです。受験問題でもグラフ問題でもよく登場します。