#09 ふれてみよう高校数学 幾何と図形

不等式の表す領域

不等式が「領域」を作る

「国境線がある国を2つの領域に分けるように」——直線も座標平面を2つの部分に分けます。方程式は「線」を表しますが、不等式は「面の一方の側」を表します。

方程式 ax+by+c=0ax + by + c = 0直線を表すように、不等式 ax+by+c<0ax + by + c < 0(または >0> 0)は直線の片側の領域を表します。

直感的な理解

直線 y=xy = x は平面を 2 つに分けます:

  • 直線よりの領域:y>xy > x(つまり yx>0y - x > 0)——「y がxより大きい場所」
  • 直線よりの領域:y<xy < x(つまり yx<0y - x < 0)——「y がxより小さい場所」

どちら側か迷ったら、原点 (0,0)(0, 0) を代入して確認するのが最速です——「原点は直線のどちら側か」を確認してから塗る方向を決めます。

基本的な領域

線形不等式(直線による領域)

ax+by+c>0ax + by + c > 0:直線 ax+by+c=0ax + by + c = 0 の一方の半平面

判定の手順:

  1. 境界の直線を描く(等号のとき)——「まず境界線を書く」
  2. 原点や簡単な点を代入して「どちら側か」を確認——「テスト点を使う」
  3. 不等式を満たす側を塗る——「テスト点が含まれる側が正解」

円不等式(円による領域)

(xa)2+(yb)2<r2(x-a)^2 + (y-b)^2 < r^2:円の内部——「距離が半径より小さい」から内側

(xa)2+(yb)2>r2(x-a)^2 + (y-b)^2 > r^2:円の外部——「距離が半径より大きい」から外側

インタラクティブ図解:領域の視覚化

マウスの x 位置で直線の傾き、y 位置で切片をコントロールします。2 つの直線で囲まれた共通領域がどう変わるかを確認しましょう。

マウスを動かして直線の位置を変える。2つの制約の共通領域(濃い色)に注目

var OX = 300, OY = 200, SC = 40;

function loop() {
ctx.clearRect(0, 0, W, H);

// 直線 1: y < slope1 * x + b1
var slope1 = (mx / W) * 3 - 1;
var b1 = (my / H) * 4 - 2;

// 直線 2: y > slope2 * x + b2 (固定傾き、切片も固定)
var slope2 = -0.8;
var b2 = 1.5;

// ピクセルレベルで領域を塗る
var imgData = ctx.createImageData(W, H);

for (var px = 0; px < W; px++) {
  for (var py = 0; py < H; py++) {
    var mathX = (px - OX) / SC;
    var mathY = (OY - py) / SC;

    var c1 = mathY < slope1 * mathX + b1; // 領域1
    var c2 = mathY > slope2 * mathX + b2; // 領域2
    var idx = (py * W + px) * 4;

    if (c1 && c2) {
      // 交差領域
      imgData.data[idx]   = 86;
      imgData.data[idx+1] = 211;
      imgData.data[idx+2] = 100;
      imgData.data[idx+3] = 50;
    } else if (c1) {
      imgData.data[idx]   = 88;
      imgData.data[idx+1] = 166;
      imgData.data[idx+2] = 255;
      imgData.data[idx+3] = 30;
    } else if (c2) {
      imgData.data[idx]   = 188;
      imgData.data[idx+1] = 140;
      imgData.data[idx+2] = 255;
      imgData.data[idx+3] = 30;
    }
  }
}
ctx.putImageData(imgData, 0, 0);

// グリッド
ctx.strokeStyle = '#161b22'; ctx.lineWidth = 1;
for (var gx = -7; gx <= 7; gx++) {
  ctx.beginPath(); ctx.moveTo(OX+gx*SC,0); ctx.lineTo(OX+gx*SC,H); ctx.stroke();
}
for (var gy = -5; gy <= 5; gy++) {
  ctx.beginPath(); ctx.moveTo(0,OY-gy*SC); ctx.lineTo(W,OY-gy*SC); ctx.stroke();
}
ctx.strokeStyle = '#30363d'; 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();
ctx.fillStyle = '#8b949e'; ctx.font = '12px sans-serif';
ctx.fillText('x', W-14, OY-8); ctx.fillText('y', OX+6, 14);

// 直線 1
var lx1s = -8, ly1s = slope1 * lx1s + b1;
var lx1e = 8, ly1e = slope1 * lx1e + b1;
ctx.beginPath();
ctx.moveTo(OX + lx1s*SC, OY - ly1s*SC);
ctx.lineTo(OX + lx1e*SC, OY - ly1e*SC);
ctx.strokeStyle = '#58a6ff'; ctx.lineWidth = 2.5; ctx.stroke();
ctx.fillStyle = '#58a6ff'; ctx.font = 'bold 12px sans-serif';
ctx.fillText('① y < ' + slope1.toFixed(1) + 'x + ' + b1.toFixed(1), OX + lx1e*SC - 160, OY - ly1e*SC - 8);

// 直線 2
var lx2s = -8, ly2s = slope2 * lx2s + b2;
var lx2e = 8, ly2e = slope2 * lx2e + b2;
ctx.beginPath();
ctx.moveTo(OX + lx2s*SC, OY - ly2s*SC);
ctx.lineTo(OX + lx2e*SC, OY - ly2e*SC);
ctx.strokeStyle = '#bc8cff'; ctx.lineWidth = 2.5; ctx.stroke();
ctx.fillStyle = '#bc8cff'; ctx.font = 'bold 12px sans-serif';
ctx.fillText('② y > ' + slope2.toFixed(1) + 'x + ' + b2.toFixed(1), OX + lx2e*SC - 160, OY - ly2e*SC + 18);

// 交点
// slope1 * x + b1 = slope2 * x + b2 → x(slope1-slope2) = b2-b1
if (Math.abs(slope1 - slope2) > 0.01) {
  var ix = (b2 - b1) / (slope1 - slope2);
  var iy = slope1 * ix + b1;
  if (Math.abs(ix) < 7 && Math.abs(iy) < 5) {
    ctx.beginPath(); ctx.arc(OX + ix*SC, OY - iy*SC, 6, 0, Math.PI*2);
    ctx.fillStyle = '#ffa657'; ctx.fill();
    ctx.fillStyle = '#ffa657'; ctx.font = '11px sans-serif';
    ctx.fillText('交点(' + ix.toFixed(1) + ',' + iy.toFixed(1) + ')', OX+ix*SC+8, OY-iy*SC-6);
  }
}

// 凡例パネル
ctx.fillStyle = '#0d1117e0';
ctx.fillRect(8, 8, 220, 95);
ctx.strokeStyle = '#30363d'; ctx.lineWidth = 1;
ctx.strokeRect(8, 8, 220, 95);

ctx.fillStyle = '#58a6ff80'; ctx.fillRect(16, 20, 14, 14);
ctx.fillStyle = '#8b949e'; ctx.font = '12px sans-serif';
ctx.fillText('①のみ', 34, 31);
ctx.fillStyle = '#bc8cff80'; ctx.fillRect(16, 40, 14, 14);
ctx.fillText('②のみ', 34, 51);
ctx.fillStyle = '#56d36480'; ctx.fillRect(16, 60, 14, 14);
ctx.fillStyle = '#56d364';
ctx.fillText('① かつ ②(共通領域)', 34, 71);
ctx.fillStyle = '#8b949e'; ctx.font = '11px sans-serif';
ctx.fillText('マウス: 傾き(横)/切片(縦)', 16, 90);

requestAnimationFrame(loop);
}
loop();

円不等式の領域

x2+y24x^2 + y^2 \leq 4(円の内部、境界含む)

この領域は半径 2 の円の内側すべて。境界(=4= 4)の場合は点線でなく実線で描き、境界を含む。

x2+y2>9x^2 + y^2 > 9(円の外部)

この場合は半径 3 の円の外側——「地球の表面より遠い宇宙空間のようなもの」。

連立不等式と共通領域

複数の不等式を同時に満たす点の集合は共通領域(intersection)です——「全部の条件を同時に満たす場所」。

例題

次の連立不等式の表す領域を図示せよ:

{x+y3xy1x0\begin{cases} x + y \leq 3 \\ x - y \geq -1 \\ x \geq 0 \end{cases}

解法:

  1. x+y=3x + y = 3(切片: (0,3)(0,3), (3,0)(3,0))の下側——「原点を代入: 0+0=0≤3 → 原点を含む下側」
  2. xy=1x - y = -1、つまり y=x+1y = x + 1(切片: (0,1)(0,1), (1,0)(-1,0))の下側——「原点を代入: 0-0=0≥-1 → 原点を含む下側」
  3. yy 軸の右側——「x≥0の意味そのまま」

各領域の共通部分が答えです。三角形または多角形になることが多いです。

線形計画法への応用

「工場で商品AとBを作る。原料が限られているとき、利益を最大化するにはどのくらい作れば良いか?」——これが線形計画法の典型的な問題設定です。「制約条件(不等式)で作られた領域内で、目的関数(線形式)を最大化・最小化する」手法です。

制約:x0x \geq 0y0y \geq 0x+2y10x + 2y \leq 103x+y123x + y \leq 12 目的:z=2x+3yz = 2x + 3y の最大値を求めよ

解法の鍵: 実行可能領域(制約を満たす領域)の頂点で目的関数は最大・最小になります(線形計画法の基本定理)——「最適解は必ずどこかの頂点にある」という重要な定理です。

  1. 各制約式の等号で領域の境界を引く
  2. 頂点の座標を求める(連立方程式)
  3. 各頂点で zz を計算し、最大値を選ぶ

頂点を求めると (0,0)(0, 0), (4,0)(4, 0), (2,4)(2, 4), (0,5)(0, 5)

頂点z=2x+3yz = 2x + 3y
(0,0)(0, 0)0
(4,0)(4, 0)8
(2,4)(2, 4)16
(0,5)(0, 5)15

最大値 z=16z = 16(点 (2,4)(2, 4))。

等高線(level curve)のイメージ

z=2x+3y=kz = 2x + 3y = k は傾き 2/3-2/3 の直線(kk によって平行移動)。この直線を実行可能領域に重ねて、最も遠くまで到達できる頂点を探すイメージ——「等高線を上げていって、領域を出る直前の頂点が最大値の場所」です。

まとめ

  • 不等式は座標平面の「片側の領域」を表す——「方程式が境界線、不等式がその片側」
  • 判定は原点代入が簡単——「まず原点がどちら側かを確認する」
  • 円不等式:<r2< r^2 が内部、>r2> r^2 が外部——「距離が半径より小さいか大きいか」
  • 複数の不等式の共通領域が線形計画法の「実行可能領域」になる
  • 目的関数の最大・最小は実行可能領域の頂点で達成される——「最適解は必ず頂点にある」

次回からはベクトルの世界へ。大きさと向きをもつ量の代数的扱いを学びます。