トップページへ←

複素数という数についての考察

興味がない方はここから戻っていただいても大丈夫です。

目的は、複素数の使い方や応用例について、です。複素数の正体など

複素数。誰もが数学で高校2,3年頃に習う単元であるが、今回はこの数について少し考察を試みたいと思います。
まずは、

		i ** 2 = -1 (2乗の記号が存在しないのでPython式の書き方で書きます)
という式から始まりますね。 2乗すると -1 になる数なんて、どこを探してもあるはずがない。ところが数学ではあると仮定する。
このような数を定義することによって、今まで実現できなかった複雑な処理が実現可能になったこともあり、
複素数は現代科学において結構
重要視されています。例えば、セキュリティの分野においても、複素数は利用されており、非常に精度の高いセキュリティ技術が実現されています。
画像の特徴抽出や、画像認識・音声認識・自然言語処理といった高度な処理においても、複素数は利用されています。
非常に摩訶不思議な数であり、魅力も多分にあるこの複素数という数について、ここでいろいろとお話しできたらと思っています。
それでは、まずは、複素数は、 a + bi という形で記述され、 a を実部、b を虚部といいます。

また、 b = 0 のときの複素数は実数と呼ばれ、 a = 0 のときの複素数 (b ≠ 0)は、純虚数と呼ばれます。
複素数は、複素数平面と呼ばれる平面上に表わすことができます。複素数平面上の原点 0 を通る横軸を、実軸、縦軸は虚軸
と呼ばれます。 2次元の座標平面上では、それぞれ x軸、y軸に対応します。このように複素数はすべて、平面上に表わすことが可能です。

複素数は、回転移動や対称移動、平行移動、拡大・縮小が簡単にできます。これは、複素数同士の四則演算で可能になります。
複素数同士を加算するということは、その点の原点からの分だけ平行移動するということになります。引き算はその点から原点までの分だけ平行移動
するということになります。乗算が、回転移動と拡大や対称移動で、除算が、同じく乗算とは逆の回転移動、対称移動そして縮小に相当します。
ちょっと大雑把に書きましたが、実際には、もっといろいろとできます。しかし、複素数平面上で、回転移動ができるという点がおそらく最も大事な点で、
ネックかと個人的にはそう思います。

そもそも複素数は何に使われるのか?

複素数は非常に不思議な数であり、電気工学や波動、セキュリティ、コンピューターグラフィックスや 3Dゲームなどの分野においてなくては
ならない存在なのです。
複素数は複素平面上では、極形式という形で表すことが可能です。これは、任意の複素数を z とした場合、
z = r (cos θ + i sin θ) と表すことができます。これが極形式と呼ばれているものになります。
この式を使って、電気信号や波の解析をしたり、加工する際に用います。あとは、フラクタルという自己相似図形にも複素数は利用されています。
フラクタルは主に自然界に出現するもので、雪の結晶や、海岸線や、木は葉など、複素数の関数で記述することが可能です。
私も実際に、どういうものかはあまりよくわかっていませんが、出来上がりは非常にきれいなもので、感心してしまうほどの美しさです。
例えて言うなら、万華鏡の中をのぞいているような感覚ですね。でも、勉強し過ぎはあまりお勧めしません。頭が混乱してきます。

実は上記の極形式は、乗算や除算をするときに非常に重宝します。なぜかというと、z1,z2 という2つの複素数において、z1×z2は、
原点からの距離(長さ)は、r1,r2を掛けたもの、角度は、theta 1 と theta 2 を足し算したものです。割り算は、z1 / z2 は
それぞれ r1 / r2 と、theta1 - theta2 となります。このようにして、極形式で表すと、計算が非常に簡潔になります。
特に興味深いのが、角度が、加算と減算で表すことができることだと思うのですが。証明は、三角関数の加法定理を使用.
話を戻しますが、複素数は、セキュリティにも応用されています。興味がある方は、四元数という数で検索してみてください。
ここでは詳しくは触れませんが、四元数は3Dコンピューターゲームにも応用されています。ネットで調べていただければ見つかります。
他には、エッジ抽出という画像処理においても利用されています。より精度が高い抽出が可能だそうです。あとは音声認識においても
同じくより精度が高い認識が可能となっていて、非常に興味深いと思います。自然言語処理においては、深く意味を捉えることが可能に なるそうです。でも、詳しいアルゴリズムや仕組みに関しては、私自身まだよくわかっていないのです・・・。

複素数は周期関数にも多用される

少しばかり、専門的な話になりますが、複素数は電気工学や電磁気学、通信工学の分野でよく出てきます。私達が普段使用している電気は、
電流・電圧の値が時間とともに絶えず変化しており、交流と呼ばれています。しかも、周期というものを持っており、西日本と東日本でその値は
異なります。静岡県の富士川と新潟県の糸魚川辺りを境にして、西日本が 60 Hzで東日本が 50 Hzで、Hz はヘルツと読み、ドイツの物理学者の名前
から取られた単位で、1秒間に何回振動するかを示した値になります。これが周波数です。電流の向きがプラスマイナスと周期的に変化するので、
電流の向きの矢印が左向きになったり、右向きになったり、長さが変わったりと、せわしない状態。この周期性を持った電気が、私達の家庭に届いているわけです。
複素数は、極形式で表せるので、電流の波の振幅と角度を同時に表せるということで利用されています。他には、通信工学という分野で、
よく周波数という言葉を耳にすると思います。電波で情報のやりとりをする無線通信においても、よく複素数は出てきます。
波ということは、周波数なので、大学以上となると複素数が出てくるだろうと考えても間違いありません。なので電気信号解析に多用されるのです。

オイラーの公式について

複素数を勉強する上で、よく出てくる公式に、オイラーの公式があります。これは、次のような公式です。

	e ^ iθ  =  cos θ  +  i sin θ
この公式は、1740年にオイラーによって証明された公式です。左辺が自然対数e を底とする複素指数関数で、右辺が三角関数です。
この公式は有名な式で、必ず学習します。この公式を使うと、三角関数を指数関数に置き換えることが可能となり、計算が楽になります。
あとは、公式を使うことで高校で習った、三角関数の加法定理などの証明などが簡単にできてしまいます。
また、Pythonでも、オイラーの公式を使った計算をすることが可能です。実際にやってみると、
	>>> import math 		# mathモジュールのインポート
	>>> math.e 				# 自然対数eの値
	2.718281828459045 			# 自然対数eの値を求める
	>>> r = 30 * math.pi / 180		# 角度30°をラジアンに変換
	>>> math.e ** (r * 1j)			# θ=30° のときの e ^ (iθ) を計算
	(0.8660254037844387+0.49999999999999994j)		# cos 30° + i sin 30° の計算
	
このように、θ=30°の 時、 cos θ = 0.866025…………… で sin θ = 0.499999…………… となり、計算は大体合っているということになります。
(cos 30° = √3 / 2 、 sin 30° = 1 / 2 なので、計算結果は大方だいたい合っています。)
Pythonの場合、角度はすべてラジアンに変換してから、パラメーターに指定します。角度は、ラジアンに変換することは押さえておいてくださいまし。
例えば、20度の場合、ラジアンは rad = 20 * math.pi / 180、50度の場合は、rad = 50 * math.pi / 180 になりますので、
角度指定をユーザにしてもらう場合、 angle = int(input("角度を指定してください。")) としてから、theta = angle * math.pi / 180
としてあげれば、ラジアンに変換することができます。※実は、Pythonにはラジアンを求める関数が存在します。mathをインポートして、radians()関数
というものが存在しています。これは、角度からラジアンを計算する関数です。ですが、こだわりのある人は、ゼロから関数を自作してみるのもいいかも
しれません。逆に、ラジアンから角度を求める関数も、Pythonに存在します。

オイラーの公式の基本式について

上のオイラーの公式にて、θ=π(パイ) とおくと、

e ^ iπ = -1
となります。なぜかというと θ=π ということは、π → 180°ということなので、θ が 180°のときの cos θ + i sin θ を求めていることと同等になります。
三角関数が苦手な方は、複素数平面を思い浮かべてもらえればわかりやすくなると思います。原点0中心の半径1の円を描いて、実軸の正の向きから
ちょうど180° だけ方向転換してあげれば、その点が、-1 となります。この点が、なんと、e ^ iπ と同等になるのです。

イメージしづらいですよね。しかし、この式が、いろいろと解析とかに使われるので、知っておいて、損など全くありません。非常に有用な式です。
例えば、ある複素数の点 z を30°だけ原点0を中心に回転した点を求めたい場合、 z(cos 30° + i sin 30°) と書かずに、
z * e^(iπ/6)
と済んでしまいます。このように、指数関数を掛けるで済んでしまいます。e ≓ 2.718 なので、この値を iπ 乗すると、-1 になるというのは
なんだかとでも不思議な気がして仕方がないです。

複素数の正体は、あっちの世界の数

私達の住んでいるこの世界では、実数という数が至るところで使われています。実数は、実際にある数で、例えば温度や湿度、得点、計測値、確率、
速度、パーセンテージ、アンペア、電圧、周波数、BMI、ポイント数、危険度、評価指数など、例を挙げれば切りがないほど挙げられます。
ところが、複素数となると、例を挙げようにも挙げられません。複素数というのは、私達の住むこの世界では、決して触れることのできない
理解できない数であるということ。理解しようとしても、そこにはないので、理解できない。それが複素数の正体なんだ。
理解しようとすると、頭が混乱の域に達する。知覚的に理解するのは、まず無理な数だというのは、おさえてほしいところです。

しかし、複素数平面を導入することによって、図形的に複素数というものをある程度、理解はできるのではないかと思うのです。
まず、複素数平面を導入すれば、複素数を習う際に必ず出てくる。iの定義式

i ^ 2 = -1
という式そのものの意味がわかってくる。なぜかというと、i は原点0中心とした半径1の円上にあり、cos 90° + i sin 90°と表せる
これにさらに 同じ i をかけるわけで、cos (90° + 90°) + i sin (90° + 90°) = cos 180° + i sin 180° = -1
となる。i に i を掛けるということは、つまりは、i という点を 90° だけ 0 中心に左回転してあげるということと同等である。
これで納得がいくのではと思うのです。実数の世界では絶対に見えてこない現象を、この複素数平面上で観測できると言うことになります。

最後になりましたが

なぜこんなに複素数について熱く語っているかというと、高校時代に数学を勉強していて、一番面白いと感じたのが複素数だったからです。
他にも面白いと感じる単元はありましたが、特に、複素数や行列、数Ⅱで習う(今はどうかな?)図形と方程式という単元が個人的に
は面白いと感じておりました。あとは、数列で和を求めたり、一般項を求めたり、Σを使った計算も面白いとは感じていました。
あとは、集合と論理のところですかね。当時プログラミング言語に馴染みがあったので、すんなり理解ができました。
当時 BASIC(n88-BASIC(DOS)など) が健在で、雑誌もあったくらいなので、数学のほとんどの単元がこのおかげで理解できた という
こともあり、助かっていました。しかし、数Ⅲは結構難しく、BASIC言語でも歯が立たない感じで、限界を感じていました。
BASICは、NEC desktopパソコンでしかも、 N88-日本語BASIC(DOS版) というものが搭載されていたので、例えば自分でゲーム
ソフトを開発してみたり、何か役に立つツールや、ユーティリティーソフトなど、開発しようと思ったら開発できる環境下にありました。

 しかし時代の流れは進むにつれて、BASICだけでは処理を行うのには限界を感じていました。
例えば、Pythonみたいに、複素数の計算はできないことや、もちろん認識処理もできません。BASICにはリストに相当する、配列という機能が
ありましたが、Pythonのように、追加や削除はできないですし、検索もスムーズにできません。文字列処理を行うメソッドもパイソンほど多くはなく、
小文字変換や、大文字変換、判定メソッドも、ありません。検索などは、INSTR() 関数で可能ではありますが…。
音楽も今と違って、容易に鳴らせるわけではなく、専用のハードウェアが必要でした。FM音源とか、そういうものが必要だったのです。
BASICには、PLAY コマンドという命令があり、ここに MML という文字列を指定することで、音楽や BGM、効果音などを鳴らせました。
他にも、VOICE コマンドや、VOICE LFO など、ボイスを定義するというコマンドも存在しており、私のNECパソコンではこれらの命令が
使えなかったので、非常になんか悔しい思いをした(?)記憶があります。今では、ノートパソコンでもデフォルトで鳴らせると思います。
正直、今の時代に生まれてればと思うこともあります。便利な時代になったと思います。音楽ソフトを導入すれば、すぐにDTM始められるので.
グラフィックス処理も格段に進歩しました。昔のパソコンは、円やらせんや模様を描くだけでも、数分かかったりと、非常に低速だったのですが、
本当にGPU性能が上がりました。コンピュータがAIも含め、進歩しているのは本当に注目すべきことで、興味津々に見ておりますが。
でも、時々昔のパソコンに思いを馳せることもあります。ああ、こんなにグラフィックス性能は遅かったんだな、とか。このゲームは懐かしいな…
などなど。BASICは本当に面白い言語だった…とか。BASICに関しましては、個人的にいろいろと思い入れがあり、切っても切り外せない存在です
BASICは今や廃れてあまり話題も聞きませんし、当然のことながら知らない方も多いと思います。
でも、BASICの考え方や哲学(?)は、今やほとんどのコンピューター言語の土台となっていて、受け継がれています。
PythonやJavaなどを勉強していると、それを感じることはよくあります。特にPythonにBASICの考え方が受け継がれているかなと感じています。
ああ、ずいぶんと長くなってしまいました。話すことはたぶん全部話したと思います。懐かしさで、なんかほっこりした気分です。
BASICは、今だとコンパイル言語では Visual Basic というのがありますので、そちらを連想される方がたぶん大多数だと思います。
VBも学びましたが、Windowsアプリケーションを開発するのに適した言語ですが、あまり自分の手で作ったという感じがしないので、Basicも
ああ、チーム型に切り替わってしまったな…と感じたこともあります。でも、それでもいいのです。時代の流れです。自然の流れというものです.
私は昔BASICでよく本を買って、プログラムを打ち込んだり、他人の作ったゲームプログラムなどを打ち込んで、それで遊んでいました。
あとは、雑誌を定期購読していて、それを自分のパソコンに打ち込んで、いろいろと実験していたりもしていました。
やっぱりそういう経験をしていると、否が応でもパソコンがわかってくるので、なんか重宝しているというか。論理演算とか、画像表示のしくみとか。
ゲームでよく使われている、キャラクター表示の処理や、重ね合わせの原理、放物線の運動や、ボールの移動。破壊処理や、崩落の処理。
当時はプログラムを打ち込んでいるだけでしたが、プログラムの意味を考えたりするのも、非常に有用だったと思います。
あとは画面の動きなどを見て、プログラムを予測してみるとか、このIFブロックの処理はなんだろうとか、このDATA文のMapのそれぞれの数値の意味
とか。解析するのも結構面白く、やってみても、やっぱりわからない。当時はそんな感じで、手探りでプログラムを打ち込んでいた記憶あります.

もちろん手を動かすことは大事で、プログラミングは実際にやってみることで、上達します。これは、どの言語であっても同じで、BASICに限らずです
Pythonは最初わからなかったのに、プログラムを打ち込んでいるうちに、文法や処理内容もわかってきました。そういうものだと思います。
何か新しいことを始めるときには、やっぱり尻込みせずに、やってみた方がいいです。やらないとやっぱりどうしても後悔しますし、後味が悪いと
思いますが、やってみたら、後々になって経験談などいろいろと他の方にも教えられるので、やってみるに越したことは無いと思います。