不等式の表す領域
不等式が「領域」を作る
「国境線がある国を2つの領域に分けるように」——直線も座標平面を2つの部分に分けます。方程式は「線」を表しますが、不等式は「面の一方の側」を表します。
方程式 が直線を表すように、不等式 (または )は直線の片側の領域を表します。
直感的な理解
直線 は平面を 2 つに分けます:
- 直線より上の領域:(つまり )——「y がxより大きい場所」
- 直線より下の領域:(つまり )——「y がxより小さい場所」
どちら側か迷ったら、原点 を代入して確認するのが最速です——「原点は直線のどちら側か」を確認してから塗る方向を決めます。
基本的な領域
線形不等式(直線による領域)
:直線 の一方の半平面
判定の手順:
- 境界の直線を描く(等号のとき)——「まず境界線を書く」
- 原点や簡単な点を代入して「どちら側か」を確認——「テスト点を使う」
- 不等式を満たす側を塗る——「テスト点が含まれる側が正解」
円不等式(円による領域)
:円の内部——「距離が半径より小さい」から内側
:円の外部——「距離が半径より大きい」から外側
インタラクティブ図解:領域の視覚化
マウスの x 位置で直線の傾き、y 位置で切片をコントロールします。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();
円不等式の領域
例
(円の内部、境界含む)
この領域は半径 2 の円の内側すべて。境界()の場合は点線でなく実線で描き、境界を含む。
(円の外部)
この場合は半径 3 の円の外側——「地球の表面より遠い宇宙空間のようなもの」。
連立不等式と共通領域
複数の不等式を同時に満たす点の集合は共通領域(intersection)です——「全部の条件を同時に満たす場所」。
例題
次の連立不等式の表す領域を図示せよ:
解法:
- (切片: , )の下側——「原点を代入: 0+0=0≤3 → 原点を含む下側」
- 、つまり (切片: , )の下側——「原点を代入: 0-0=0≥-1 → 原点を含む下側」
- 軸の右側——「x≥0の意味そのまま」
各領域の共通部分が答えです。三角形または多角形になることが多いです。
線形計画法への応用
「工場で商品AとBを作る。原料が限られているとき、利益を最大化するにはどのくらい作れば良いか?」——これが線形計画法の典型的な問題設定です。「制約条件(不等式)で作られた領域内で、目的関数(線形式)を最大化・最小化する」手法です。
制約:、、、 目的: の最大値を求めよ
解法の鍵: 実行可能領域(制約を満たす領域)の頂点で目的関数は最大・最小になります(線形計画法の基本定理)——「最適解は必ずどこかの頂点にある」という重要な定理です。
- 各制約式の等号で領域の境界を引く
- 頂点の座標を求める(連立方程式)
- 各頂点で を計算し、最大値を選ぶ
頂点を求めると , , , 。
| 頂点 | |
|---|---|
| 0 | |
| 8 | |
| 16 | |
| 15 |
最大値 (点 )。
等高線(level curve)のイメージ
は傾き の直線( によって平行移動)。この直線を実行可能領域に重ねて、最も遠くまで到達できる頂点を探すイメージ——「等高線を上げていって、領域を出る直前の頂点が最大値の場所」です。
まとめ
- 不等式は座標平面の「片側の領域」を表す——「方程式が境界線、不等式がその片側」
- 判定は原点代入が簡単——「まず原点がどちら側かを確認する」
- 円不等式: が内部、 が外部——「距離が半径より小さいか大きいか」
- 複数の不等式の共通領域が線形計画法の「実行可能領域」になる
- 目的関数の最大・最小は実行可能領域の頂点で達成される——「最適解は必ず頂点にある」
次回からはベクトルの世界へ。大きさと向きをもつ量の代数的扱いを学びます。