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

ベクトルの基本演算

ベクトルとは

「地図で「北東に5km進め」というとき、“5km”が大きさで”北東”が向き」——この2つの情報をセットで持つのがベクトルです。「速さ」はスカラー(大きさだけ)ですが、「速度」はベクトル(大きさ + 向き)です。

ベクトルは大きさ向きを持つ量です。スカラー(大きさだけ)とは対照的です。

物理では速度・力・変位などがベクトル量の典型例ですが、数学では純粋に「矢印」として扱います。

表記:a\vec{a}(矢印付き)または a\mathbf{a}(太字)

基本演算

ベクトルの加算(平行四辺形の法則)

「風の力と自分が漕ぐ力を合わせると、実際にはどちらに進むか」——これがベクトルの加算です。

a+b\vec{a} + \vec{b}

a\vec{a} の終点に b\vec{b} の始点を重ねたときの、a\vec{a} の始点から b\vec{b} の終点へのベクトル。

または、平行四辺形を作り、その対角線のベクトル——「二つの矢印で作った平行四辺形の対角線が合力」。

ベクトルの減算

ab=a+(b)\vec{a} - \vec{b} = \vec{a} + (-\vec{b})

b-\vec{b}b\vec{b} と同じ大きさで逆向きのベクトル——「引き算は逆向きの矢印を足す」と考えます。

スカラー倍

kak\vec{a}
  • k>0k > 0:同じ向きで大きさ kk 倍——「同じ方向に2倍進む」
  • k<0k < 0:逆向きで大きさ k|k| 倍——「逆方向に進む」
  • k=0k = 0:零ベクトル 0\vec{0}——「どこにも動かない」

成分表示(2 次元)

「矢印を横成分と縦成分に分解する」——これで計算がしやすくなります:

ベクトル a=(a1,a2)\vec{a} = (a_1, a_2) のとき:

a+b=(a1+b1,a2+b2)\vec{a} + \vec{b} = (a_1 + b_1, a_2 + b_2) ka=(ka1,ka2)k\vec{a} = (ka_1, ka_2) a=a12+a22|\vec{a}| = \sqrt{a_1^2 + a_2^2}

「成分は座標と同じように足し算・かけ算できる」——ピタゴラスの定理で大きさが求まります。

インタラクティブ図解:ベクトルの加算

マウスを動かすとベクトル b\vec{b} の終点が変わります。a+b\vec{a} + \vec{b} が平行四辺形の対角線になることを確認しましょう。

マウスを動かして b⃗ の向きと大きさを変える。平行四辺形の法則でa⃗+b⃗が決まる

var OX = 200, OY = 230, SC = 50;

function arrow(x1, y1, x2, y2, color, width) {
var dx = x2 - x1, dy = y2 - y1;
var len = Math.sqrt(dx*dx + dy*dy);
if (len < 2) return;
var ux = dx/len, uy = dy/len;
var hw = 10, hl = 14;
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2 - ux*hl, y2 - uy*hl);
ctx.strokeStyle = color; ctx.lineWidth = width;
ctx.stroke();
ctx.beginPath();
ctx.moveTo(x2, y2);
ctx.lineTo(x2 - ux*hl - uy*hw, y2 - uy*hl + ux*hw);
ctx.lineTo(x2 - ux*hl + uy*hw, y2 - uy*hl - ux*hw);
ctx.closePath();
ctx.fillStyle = color; ctx.fill();
}

function toS(x, y) { return [OX + x*SC, OY - y*SC]; }

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

// グリッド
ctx.strokeStyle = '#161b22'; ctx.lineWidth = 1;
for (var gx = -3; gx <= 8; gx++) {
  ctx.beginPath(); ctx.moveTo(OX+gx*SC,0); ctx.lineTo(OX+gx*SC,H); ctx.stroke();
}
for (var gy = -4; gy <= 4; 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);

// a = (2, 1.5)(固定)
var ax = 2, ay = 1.5;

// b = マウス位置から
var bx = (mx - OX) / SC;
var by = (OY - my) / SC;
// 合理的な範囲にクランプ
bx = Math.max(-2, Math.min(5, bx));
by = Math.max(-3, Math.min(3.5, by));

// a + b
var sumX = ax + bx, sumY = ay + by;

// 平行四辺形の点線
var aEnd = toS(ax, ay);
var bEnd = toS(bx, by);
var sEnd = toS(sumX, sumY);

ctx.beginPath();
ctx.moveTo(aEnd[0], aEnd[1]);
ctx.lineTo(sEnd[0], sEnd[1]);
ctx.strokeStyle = '#30363d'; ctx.lineWidth = 1; ctx.setLineDash([4,3]);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(bEnd[0], bEnd[1]);
ctx.lineTo(sEnd[0], sEnd[1]);
ctx.stroke(); ctx.setLineDash([]);

// ベクトル a (原点から)
arrow(OX, OY, aEnd[0], aEnd[1], '#58a6ff', 3);
ctx.fillStyle = '#58a6ff'; ctx.font = 'bold 14px serif';
ctx.fillText('a⃗', aEnd[0]+6, aEnd[1]-8);

// ベクトル b (原点から)
arrow(OX, OY, bEnd[0], bEnd[1], '#f0883e', 3);
ctx.fillStyle = '#f0883e'; ctx.font = 'bold 14px serif';
ctx.fillText('b⃗', bEnd[0]+6, bEnd[1]-8);

// a + b
arrow(OX, OY, sEnd[0], sEnd[1], '#56d364', 3);
ctx.fillStyle = '#56d364'; ctx.font = 'bold 14px serif';
ctx.fillText('a⃗+b⃗', sEnd[0]+6, sEnd[1]-8);

// b を a の先端から描く(平行四辺形)
var bfromA = toS(ax + bx, ay + by);
arrow(aEnd[0], aEnd[1], bfromA[0], bfromA[1], '#f0883e60', 2);

// a を b の先端から描く
arrow(bEnd[0], bEnd[1], sEnd[0], sEnd[1], '#58a6ff60', 2);

// 情報パネル
ctx.fillStyle = '#0d1117e0';
ctx.fillRect(8, 8, 240, 120);
ctx.strokeStyle = '#30363d'; ctx.lineWidth = 1;
ctx.strokeRect(8, 8, 240, 120);

ctx.font = '13px monospace';
ctx.fillStyle = '#58a6ff';
ctx.fillText('a⃗ = (' + ax.toFixed(1) + ', ' + ay.toFixed(1) + ')', 16, 30);
ctx.fillText('|a⃗| = ' + Math.sqrt(ax*ax+ay*ay).toFixed(2), 16, 48);
ctx.fillStyle = '#f0883e';
ctx.fillText('b⃗ = (' + bx.toFixed(2) + ', ' + by.toFixed(2) + ')', 16, 68);
ctx.fillText('|b⃗| = ' + Math.sqrt(bx*bx+by*by).toFixed(2), 16, 86);
ctx.fillStyle = '#56d364';
ctx.fillText('a⃗+b⃗ = (' + sumX.toFixed(2) + ', ' + sumY.toFixed(2) + ')', 16, 106);
ctx.fillText('|a⃗+b⃗| = ' + Math.sqrt(sumX*sumX+sumY*sumY).toFixed(2), 16, 124);

requestAnimationFrame(loop);
}
loop();

位置ベクトル

「地図上の場所を原点からの矢印で表す」——これが位置ベクトルです。

点 A, B の位置ベクトル(原点 O からのベクトル)を a\vec{a}, b\vec{b} とすると:

AB=ba\overrightarrow{AB} = \vec{b} - \vec{a}

「AB ベクトル = B の位置 - A の位置」と覚えましょう——「Bに行くにはAまで戻ってから(-a)Bに進む(+b)」という考え方です。

分点の公式

「AからBへの道を m:n に分ける点はどこか」——重みつき平均で求めます:

線分 AB を m:nm : n に内分する点 P の位置ベクトル:

p=na+mbm+n\vec{p} = \frac{n\vec{a} + m\vec{b}}{m + n}

特に中点(m=n=1m = n = 1)——「等分なら単純平均」:

p=a+b2\vec{p} = \frac{\vec{a} + \vec{b}}{2}

外分(m:nm : -n として扱う):

p=na+mbmn\vec{p} = \frac{-n\vec{a} + m\vec{b}}{m - n}

ベクトルの性質

交換律・結合律

a+b=b+a\vec{a} + \vec{b} = \vec{b} + \vec{a} (a+b)+c=a+(b+c)(\vec{a} + \vec{b}) + \vec{c} = \vec{a} + (\vec{b} + \vec{c})

分配律(スカラー倍)

k(a+b)=ka+kbk(\vec{a} + \vec{b}) = k\vec{a} + k\vec{b} (k+l)a=ka+la(k + l)\vec{a} = k\vec{a} + l\vec{a}

平行条件

ab\vec{a} \parallel \vec{b}a0\vec{a} \neq \vec{0}b0\vec{b} \neq \vec{0}    \iff b=ka\vec{b} = k\vec{a} となる実数 kk が存在する——「同じ方向を向いているか逆方向かは、一方がもう一方の定数倍かどうかで分かる」。

ベクトルの共線条件

3 点 A, B, C が一直線上にある     \iff AC=tAB\overrightarrow{AC} = t\overrightarrow{AB} となる実数 tt が存在する

または成分で表すと、AB=(b1,b2)\overrightarrow{AB} = (b_1, b_2)AC=(c1,c2)\overrightarrow{AC} = (c_1, c_2) のとき:

b1c2b2c1=0b_1 c_2 - b_2 c_1 = 0

(これは行列式 = 0 の条件とも一致します)

具体例:重心の位置ベクトル

「三角形の3本の中線の交点」が重心——各頂点から対辺の中点を結ぶ線が交わる点です:

三角形 ABC の重心 G は、3 頂点の位置ベクトルの平均:

g=a+b+c3\vec{g} = \frac{\vec{a} + \vec{b} + \vec{c}}{3}

これは「各中線を 2:1 に内分する点」という幾何的性質から導けます——「3頂点の座標の平均が重心」という覚え方でもOKです。

まとめ

  • ベクトル = 大きさ + 向き——「スカラーに方向を加えたもの」
  • 成分表示 (a1,a2)(a_1, a_2) で計算できる——「座標と同じように足し算・かけ算」
  • 加算:成分ごとに足す。幾何的には平行四辺形の法則——「対角線が合力」
  • スカラー倍:成分に実数をかける(向きが変わることも)
  • 位置ベクトルで分点公式を使うと、座標計算がスマートになる——「ABベクトル = B - A」

次回はベクトルの「内積」——2 つのベクトルの「揃い具合」を数値化する操作を学びます。