高校数学をプログラミングで解く(数学III編)「1-1 複素数平面」
マガジンリスト > 数学Ⅲ編 1.複素数平面 > 1-1 複素数平面
はじめに
今回は、数学IIIで学ぶ「複素数平面」について、複素数を複素数平面上にプロットするプログラムや複素数の絶対値をコンソールに出力するプログラムを作成します。
複素数平面
まず、複素数平面について解説しておきます。
複素数平面
複素数$${ \alpha = a+bi }$$を座標平面上の点$${(a,b)}$$で表した平面
① 複素数の実数倍 $${ \alpha \neq 0 }$$
3点$${0, \alpha, \beta}$$が一直線上にある $${ \Leftrightarrow }$$ $${\beta=k\alpha }$$となる実数$${k}$$がある
② 複素数の加法、減法
点の平行移動や平行四辺形の頂点として表される。
共役な複素数
$${\alpha = a+bi }$$のとき、共役な複素数$${\overline{\alpha}}$$は$${\overline{\alpha}=a-bi}$$
① 対称 点$${\alpha}$$と実軸、原点、虚軸に関して対称な点はそれぞれ$${\overline{\alpha}, -\alpha, -\overline{\alpha} }$$
② 実数・純虚数
$${\alpha}$$が実数 $${\Leftrightarrow}$$ $${\overline{\alpha} = \alpha}$$
$${\alpha}$$が純虚数 $${\Leftrightarrow}$$ $${\overline{\alpha} = -\alpha, \alpha \neq 0 }$$
③ 和・差・積・商
$$
\overline{\alpha + \beta} = \overline{\alpha} + \overline{\beta}, \ \overline{\alpha - \beta} = \overline{\alpha}-\overline{\beta}, \ \overline{\alpha \beta} = \overline{\alpha} \overline{\beta}, \ \overline{ \left( \frac{\alpha}{\beta} \right) } = \frac{\overline{\alpha}}{\overline{\beta}}
$$
絶対値
複素数$${\alpha = a+bi}$$に対して $${| \alpha | = | a+bi | = \sqrt{a^2+b^2} }$$
① 性質 $${ | \alpha |^2 = \alpha \overline{\alpha}, \ \ | \alpha | = | - \alpha | = | \overline{ \alpha } | }$$
② 2点$${ \alpha, \beta }$$間の距離は$${| \beta - \alpha |}$$
複素数を複素数平面上にプロットする
今回は、以下の問題の複素数を複素数平面上にプロットして、またそれぞれの複素数の絶対値をコンソールに出力するプログラムを作成します。
問題
$${\alpha = 1-i, \ \beta = 2+3i }$$であるとき、次の複素数を表す点を図示せよ。また、その絶対値を求めよ。
(1) $${ \alpha + \beta }$$
(2) $${ \alpha - \beta }$$
(3) $${ 3 \alpha + 2 \beta }$$
(4) $${ -2 \alpha + \beta }$$
複素数の扱い
記事『高校数学をプログラミングで解く(数学II編)「1-1 複素数」』でも説明したように、プログラミング言語「Processing」では、残念ながら複素数を扱うための変数などは準備されていません。そこで、今回も複素数を扱う変数としてPVectorクラスを利用することにします。つまり、複素数$${c=a+bi}$$を
PVector c = new PVector(a,b);
として利用することにします。
複素数の四則演算
複素数の四則演算については、記事『高校数学をプログラミングで解く(数学II編)「1-1 複素数」』で解説しており、スケッチ「complex_number」の中で関数として準備しました(ソースコード1)。
// 2つの複素数の和を計算する関数
PVector c_sum(
PVector c1,
PVector c2
){
PVector sum = c1.copy().add(c2);
return sum;
}
// 2つの複素数の差を計算する関数
PVector c_sub(
PVector c1,
PVector c2
){
PVector sub = c1.copy().sub(c2);
return sub;
}
// 2つの複素数の積を計算する関数
PVector c_prod(
PVector c1,
PVector c2
){
PVector prod = new PVector();
prod.x = c1.x * c2.x - c1.y * c2.y;
prod.y = c1.x * c2.y + c1.y * c2.x;
return prod;
}
// 2つの複素数の商を計算する関数
PVector c_div(
PVector c1,
PVector c2
){
PVector div = new PVector();
div.x = (c1.x * c2.x + c1.y * c2.y)/(c2.x*c2.x+c2.y*c2.y);
div.y = (-c1.x * c2.y + c1.y * c2.x)/(c2.x*c2.x+c2.y*c2.y);
return div;
}
ソースコード1 2つの複素数の四則演算を行う関数
今回、この2つの複素数の四則演算を行う関数を再利用していきます。
複素数平面の準備
複素数平面は、記事『高校数学をプログラミングで解く(数学I編)「1-0-2 グラフを描くための準備(その2)」』で作成した、座標軸を描くための関数 setAxes を利用して描くようにします。つまり、$${xy}$$平面を$${x}$$軸を実軸、$${y}$$軸を虚軸と読み替えて利用していきます。以下の zip ファイルをダウンロードして展開または解凍してご利用ください。
プログラム
では、プログラムを作成していきますが、今回は少しステップを踏んで説明していきます。
スケッチの準備
今回は1からスケッチを作成していきます。スケッチ名を「plot_complex_numbers」としてスケッチを新規作成します。開発環境ウィンドウは図1のようになります。
座標軸を描くための関数の準備
座標軸を描くための関数 setAxes を定義したpdeファイル「setAxes.pde」をスケッチ「plot_complex_numbers」のフォルダにコピーします。
その結果、スケッチ「plot_complex_numbers」の開発環境ウィンドウのタブ欄に「setAxes」タブが追加されます(図3)。これにより、スケッチ「plot_complex_numbers」内で setAxes 関数を利用することができるようになります。
複素数の四則演算を行う関数の準備
次に、ソースコード1に示した、2つの複素数の四則演算を行う関数の準備を行います。開発環境ウィンドウのタブ欄にある▼ボタンを押して、新規タブを選択します。そして、現れるダイアログの「ファイルの新しい名前:」に「c_arithmetic_operations」と入力してOKボタンを押すと、開発環境ウィンドウのタブ欄に「c_arithmetic_operations」タブが追加されます(図4)。
この「c_arithmetic_operations」タブのテキストエディタ部分にソースコード1を書き写します(図5)。
なお、このとき、スケッチ「plot_complex_numbers」のフォルダには、c_arithmetic_operations.pde ファイルが追加されます(図6)。
複素数の絶対値を計算する関数の準備
あと、複素数の絶対値を計算する関数 c_absolute_value を準備しておきます。
// 複素数の絶対値を計算する関数
float c_absolute_value(
PVector c
){
return sqrt(c.x*c.x+c.y*c.y);
}
この関数のコードを、先ほどソースコード1を追加した「c_arithmetic_operations」タブのテキストエディタ部分の最後に追加しておきます(図7)。
複素数を複素数平面上にプロットする関数の準備
今度は、複素数を複素数平面上にプロットする関数 plot_complex_number を準備します。
// 複素数を複素数平面上にプロットする関数
void plot_complex_number(
PVector c, // プロットしたい複素数
float range, // 複素数平面の表示範囲を-rangeからrangeまでとする
boolean line_flag // 複素数平面の原点から複素数cまでの線分を描くか
){
PVector trans_c = c.copy().mult(width / 2.0 / range);
if( line_flag ){
line(0.0, 0.0, trans_c.x, trans_c.y);
}
strokeWeight(5);
point(trans_c.x, trans_c.y);
strokeWeight(1);
}
ソースコード2 複素数を複素数平面上にプロットする関数
plot_complex_number 関数には、3つの引数を設定します。
c:複素数平面にプロットしたい複素数 PVectorクラス
range:複素数平面の表示範囲を指定する変数 float型
line_flag:複素数平面の原点から複素数cまでの線分を描くか boolean型
なお、range は、実軸方向、虚軸方向の両方に対して -range から range までの表示範囲とします。また、line_flag は複素数 c を複素数平面上にプロットする際に、複素数平面の原点から複素数 c までの線分を描くかどうかを指定するフラグ変数となっています。
複素数の四則演算を行う関数の準備で開発環境ウィンドウのタブ欄に「c_arithmetic_operations」タブを追加したときと同じやり方で、「plot_complex_number」タブを追加します(図8)。
この「plot_complex_number」タブのテキストエディタ部分にソースコード2を書き写します(図9)。
このとき、スケッチ「plot_complex_numbers」のフォルダには、plot_complex_number.pde ファイルが追加されます(図10)。
複素数を複素数平面上にプロットする
ここまでで複素数を扱ったり複素数平面上にプロットする準備が整いましたので、問題の複素数を複素数平面上にプロットして、またそれぞれの複素数の絶対値をコンソールに出力するプログラムを作成します。
// 複素数を複素数平面にプロットする
// 複素数の絶対値を計算してコンソールに出力する
void setup(){
size(500,500,P2D); // widthとheightは同じにしておく
noLoop();
float range = 10.0; // 実軸と虚軸の表示範囲 -rangeからrangeまで
setAxes(range, range); // 座標軸の準備
// 以下、複素数平面に複素数をプロットしていく
noFill(); // グラフの中身を塗りつぶさない
stroke(0,0,0); // グラフの線の色を黒色に設定
// 複素数平面の原点から複素数までの線分を描く
boolean line_flag = true;
// 複素数α, βの準備
PVector alpha = new PVector(1.0, -1.0);
PVector beta = new PVector(2.0, 3.0);
// 複素数α, βをプロット
plot_complex_number(alpha, range, line_flag);
plot_complex_number(beta, range, line_flag);
// (1) c1 = α+β
stroke(255,0,0);
PVector c1 = c_sum(alpha, beta);
plot_complex_number(c1, range, line_flag);
float c1_mag = c_absolute_value(c1);
println("(1)の絶対値:", c1_mag);
// (2) c2 = α-β
stroke(0,255,0);
PVector c2 = c_sub(alpha, beta);
plot_complex_number(c2, range, line_flag);
float c2_mag = c_absolute_value(c2);
println("(2)の絶対値:", c2_mag);
// (3) c3 = 3α+2β
stroke(0,0,255);
PVector c3 = c_sum(alpha.copy().mult(3.0), beta.copy().mult(2.0));
plot_complex_number(c3, range, line_flag);
float c3_mag = c_absolute_value(c3);
println("(3)の絶対値:", c3_mag);
// (4) c4 = -2α+β
stroke(255,255,0);
PVector c4 = c_sum(alpha.copy().mult(-2.0), beta);
plot_complex_number(c4, range, line_flag);
float c4_mag = c_absolute_value(c4);
println("(4)の絶対値:", c4_mag);
}
ソースコード3 複素数を複素数平面上にプロット、複素数の絶対値を出力するプログラム
開発環境ウィンドウのタブ欄で「plot_complex_numbers」タブを選択して、そのテキストエディタ部分にソースコード3を書き写します(図11)。
最後に、スケッチ「plot_complex_numbers」を実行すると、図12のように、複素数$${\alpha, \beta}$$が黒色、(1) $${ \alpha + \beta }$$が赤色、(2) $${ \alpha - \beta }$$が緑色、(3) $${ 3 \alpha + 2 \beta }$$が青色、(4) $${ -2 \alpha + \beta }$$が黄色でそれぞれ複素数平面上にプロットされます。
また、開発環境ウィンドウのコンソール部分に、
(1)の絶対値: 3.6055512
(2)の絶対値: 4.1231055
(3)の絶対値: 7.615773
(4)の絶対値: 5.0
とそれぞれの絶対値が出力されます(図13)。
おまけ:複素数平面の原点から複素数までの線分を描かない場合
ソースコード3の中の、
// 複素数平面の原点から複素数までの線分を描く
boolean line_flag = true;
の部分を
// 複素数平面の原点から複素数までの線分を描かない
boolean line_flag = false;
に置き換えると、複素数平面の原点から複素数までの線分を描かないようにすることができます(図14)。
まとめ
今回は、数学IIIで学ぶ「複素数平面」について、複素数を複素数平面上にプロットするプログラムと複素数の絶対値をコンソールに出力するプログラムを作成しました。
Processingには複素数を直接扱うような変数はありません。そのため、記事『高校数学をプログラミングで解く(数学II編)「1-1 複素数」』と同じように、複素数をPVectorクラスで表すことにしました。また、同じ記事でPVectorクラスの変数を利用して複素数の四則演算を行うための関数を準備していましたので、これらの関数を再利用し、別のpdeファイル「c_arithmetic_operations.pde」に記述して利用しました。
また、複素数平面を描くために、記事『高校数学をプログラミングで解く(数学I編)「1-0-2 グラフを描くための準備(その2)」』で作成した、座標軸を描くための関数 setAxes を定義したpdeファイル「setAxes.pde」を利用しました。
あと、複素数を複素数平面上にプロットする関数 plot_complex_number を準備し、「plot_complex_number.pde」に記述して利用しました。
なお、plot_complex_number 関数内で複素数を複素数平面上にプロットする際に、複素数平面の原点からその複素数までの線分を描くかどうかを選択できるようにしました。どちらを選ぶかは、それをどのように見せたいかにもよると思います。問題によって描く場合と描かない場合を比較して、よりよいものを選ぶようにしてみてください。
参考文献
改訂版 教科書傍用 スタンダード・オリジナル 数学III(数研出版、ISBN9784410209567)
演習問題
次の複素数を表す点を複素数平面上にプロットするプログラムを作成してください。また、その絶対値を求めて、コンソールに出力してください。
$$
(1) \ 3+4i \ \ \ (2) \ 1-2i \ \ \ (3) \ 5i \ \ \ (4) \frac{1+3i}{2-i}
$$
演習問題の解答例
ここから先は
この記事が気に入ったらサポートをしてみませんか?