複素数平面
複素数のおさらい
「 という、二乗するとマイナスになる不思議な数」——これが虚数単位 です。現実世界に存在しないように見えても、電気工学や量子力学など実用的な分野で大活躍しています。
複素数 は実部 と虚部 を持ちます(、虚数単位)。
実数は虚部が 0 の複素数の特殊ケース()——「複素数は実数を含むより広い数の世界」です。
基本演算
「実部どうし・虚部どうしをまとめて計算する」—— に注意するだけです:
、 のとき:
割り算では「分母の共役複素数をかける」—— をかけると分母が実数になります。
複素数平面(アルガン図)
「複素数をグラフ上の点として見る」——この発想が複素数平面(複素平面、アルガン図)です。実部を横軸、虚部を縦軸にとれば、すべての複素数が平面上の 1 点に対応します。
複素数 を、平面上の点 (または座標 を示すベクトル)として表したものが複素数平面です。
- 実軸( 軸):実部
- 虚軸( 軸):虚部
この表現により、複素数の演算が幾何学的変換と対応します——「足し算は移動、かけ算は回転と拡大縮小」という美しい対応関係が生まれます。
絶対値(modulus)と偏角(argument)
絶対値
「原点からその複素数までの距離」——ピタゴラスの定理そのままです:
原点からの距離。 という性質があります——「積の絶対値 = 絶対値の積」。
偏角
「実軸の正方向から反時計回りに何度回転したか」——時計の針の逆方向を正とします:
実軸正の向きから反時計回りに測った角度。 を主値といいます。
極形式(polar form)
「複素数を大きさ と角度 の組み合わせで表す」——地図で「北東方向に 3km」と表すのと同じ考え方です:
ここで (絶対値)、(偏角)。
オイラーの公式 により、指数形式でも書けます——これは数学史上もっとも美しい公式のひとつとも言われます。
極形式の積
「複素数の積は、大きさをかけて角度を足す」——計算が劇的に簡単になります:
絶対値の積、偏角の和になります。
共役複素数
「実部はそのままで虚部の符号だけ変えた複素数」——グラフ上では実軸を鏡に見立てたときの鏡像です:
実軸に関する鏡映(反射)です。
性質:
- (実部の 2 倍)——「自分と鏡像を足すと実部だけ残る」
- (虚部の 2 倍)——「自分から鏡像を引くと虚部だけ残る」
- ——「自分と鏡像の積は絶対値の二乗(常に実数)」
インタラクティブ図解:複素数平面
マウスを動かすと複素数 が移動します。絶対値・偏角・共役複素数がリアルタイムに表示されます。
var OX = 300, OY = 190, SC = 55;
function loop() {
ctx.clearRect(0, 0, W, H);
var re = (mx - OX) / SC;
var im = (OY - my) / SC;
// グリッド
ctx.strokeStyle = '#161b22'; ctx.lineWidth = 1;
for (var gx=-5;gx<=5;gx++){ctx.beginPath();ctx.moveTo(OX+gx*SC,0);ctx.lineTo(OX+gx*SC,H);ctx.stroke();}
for (var gy=-3;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='13px sans-serif';
ctx.fillText('実軸',W-50,OY-8);ctx.fillText('虚軸',OX+8,14);
ctx.fillText('i',OX+8,OY-SC+5);
ctx.fillText('-i',OX+8,OY+SC+5);
ctx.fillText('1',OX+SC-6,OY+16);
ctx.fillText('-1',OX-SC-10,OY+16);
var modZ = Math.sqrt(re*re + im*im);
var argZ = Math.atan2(im, re);
var argDeg = argZ * 180 / Math.PI;
// |z| の円
if (modZ > 0.1) {
ctx.beginPath();
ctx.arc(OX, OY, modZ*SC, 0, Math.PI*2);
ctx.strokeStyle = '#58a6ff20'; ctx.lineWidth = 1.5;
ctx.setLineDash([3,3]); ctx.stroke(); ctx.setLineDash([]);
}
// 偏角弧
ctx.beginPath();
ctx.arc(OX, OY, 25, -argZ, 0, argZ < 0);
ctx.strokeStyle = '#ffa65780'; ctx.lineWidth = 2;
ctx.stroke();
// 実部・虚部の投影線
ctx.beginPath();
ctx.moveTo(mx, OY);
ctx.lineTo(mx, my);
ctx.strokeStyle = '#f0883e60'; ctx.lineWidth = 1.5; ctx.setLineDash([4,3]); ctx.stroke(); ctx.setLineDash([]);
ctx.beginPath();
ctx.moveTo(OX, my);
ctx.lineTo(mx, my);
ctx.strokeStyle = '#56d36460'; ctx.lineWidth = 1.5; ctx.setLineDash([4,3]); ctx.stroke(); ctx.setLineDash([]);
// 原点からの線(ベクトル)
ctx.beginPath();
ctx.moveTo(OX, OY);
ctx.lineTo(mx, my);
ctx.strokeStyle = '#58a6ff'; ctx.lineWidth = 2; ctx.stroke();
// z の点
ctx.beginPath(); ctx.arc(mx, my, 7, 0, Math.PI*2);
ctx.fillStyle = '#58a6ff'; ctx.fill();
ctx.fillStyle = '#58a6ff'; ctx.font = 'bold 13px sans-serif';
var zLabel = re.toFixed(1) + (im>=0?' + ':' - ') + Math.abs(im).toFixed(1) + 'i';
ctx.fillText('z = ' + zLabel, mx+10, my-10);
// 共役 z̄(実軸鏡像)
var conjY = OY + im*SC; // (im は正なら上なので鏡は下)
ctx.beginPath();
ctx.moveTo(OX, OY);
ctx.lineTo(mx, conjY);
ctx.strokeStyle = '#bc8cff80'; ctx.lineWidth = 1.5; ctx.setLineDash([4,3]); ctx.stroke(); ctx.setLineDash([]);
ctx.beginPath(); ctx.arc(mx, conjY, 6, 0, Math.PI*2);
ctx.fillStyle = '#bc8cff'; ctx.fill();
ctx.fillStyle = '#bc8cff'; ctx.font = '12px sans-serif';
ctx.fillText('z̄ = ' + re.toFixed(1) + (im<=0?' + ':' - ') + Math.abs(im).toFixed(1) + 'i', mx+10, conjY+16);
// 鏡映線(実軸)を強調
ctx.beginPath();
ctx.moveTo(OX-5, OY);
ctx.lineTo(OX+5, OY);
ctx.strokeStyle = '#bc8cff80'; ctx.lineWidth = 1; ctx.stroke();
// 実軸と虚軸の投影ラベル
ctx.fillStyle = '#f0883e'; ctx.font = '11px sans-serif';
ctx.fillText('Re(z)=' + re.toFixed(2), mx+4, OY+16);
ctx.fillStyle = '#56d364';
ctx.fillText('Im(z)=' + im.toFixed(2), OX+8, my);
// 偏角ラベル
ctx.fillStyle = '#ffa657'; ctx.font = '12px serif';
ctx.fillText('θ=' + argDeg.toFixed(1) + '°', OX+32, OY-16);
// 情報パネル
ctx.fillStyle = '#0d1117e0';
ctx.fillRect(8, 8, 240, 130);
ctx.strokeStyle = '#30363d'; ctx.lineWidth = 1;
ctx.strokeRect(8, 8, 240, 130);
ctx.font = '13px monospace';
ctx.fillStyle = '#58a6ff';
ctx.fillText('z = ' + zLabel, 16, 28);
ctx.fillStyle = '#bc8cff';
ctx.fillText('z̄ = ' + re.toFixed(1) + (im<=0?' + ':' - ') + Math.abs(im).toFixed(1)+'i', 16, 48);
ctx.fillStyle = '#f0883e';
ctx.fillText('|z| = ' + modZ.toFixed(3), 16, 68);
ctx.fillStyle = '#ffa657';
ctx.fillText('arg(z) = ' + argDeg.toFixed(1) + '°', 16, 88);
ctx.fillStyle = '#56d364';
ctx.fillText('z·z̄ = |z|² = ' + (re*re+im*im).toFixed(3), 16, 108);
ctx.fillStyle = '#8b949e';
ctx.fillText('z+z̄ = ' + (2*re).toFixed(2) + ' (= 2·Re)', 16, 128);
requestAnimationFrame(loop);
}
loop();
ド・モアブルの定理
「角度 の回転を 回繰り返すと、角度 の回転になる」——これがド・モアブルの定理の直感です:
または極形式で:
応用:三角関数の加法定理
「2 つの角度を合わせた複素数の掛け算から、加法定理が自然に出てくる」—— を展開すると:
実部・虚部を比較すると加法定理が得られます——「加法定理はオイラーの公式の実部・虚部を見ているだけ」という驚きの発見です。
複素数の計算例
例題 1
の絶対値と偏角を求めよ。
解:
極形式:
例題 2
を計算せよ( として)。
解: 「成分で地道に計算するより、極形式を使うと一発で解ける」——ド・モアブルの定理の威力です:
成分計算でも確認できますが、極形式のほうがはるかに楽です。
まとめ
- 複素数 を平面上の点 として表す → 複素数平面——「数直線から数平面へ拡張」
- 絶対値 :原点からの距離——「ピタゴラスの定理そのまま」
- 偏角 :実軸からの角度——「北からの方位角と同じ発想」
- 極形式 :積が「絶対値の積、偏角の和」に——「掛け算が回転と拡大縮小になる」
- 共役 :実軸に関する鏡映——「虚部の符号を変えるだけ」
次回は複素数の乗算が「回転と拡大縮小」に対応することを学び、幾何変換としての複素数を深掘りします。