複素数。誰もが数学で高校2,3年頃に習う単元であるが、今回はこの数について少し考察を試みたいと思います。
まずは、
i ** 2 = -1 (2乗の記号が存在しないのでPython式の書き方で書きます)という式から始まりますね。 2乗すると -1 になる数なんて、どこを探してもあるはずがない。ところが数学ではあると仮定する。
複素数は非常に不思議な数であり、電気工学や波動、セキュリティ、コンピューターグラフィックスや 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 を底とする複素指数関数で、右辺が三角関数です。
>>> 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…………… となり、計算は大体合っているということになります。
上のオイラーの公式にて、θ=π(パイ) とおくと、
e ^ iπ = -1となります。なぜかというと θ=π ということは、π → 180°ということなので、θ が 180°のときの cos θ + i sin θ を求めていることと同等になります。
z * e^(iπ/6)と済んでしまいます。このように、指数関数を掛けるで済んでしまいます。e ≓ 2.718 なので、この値を iπ 乗すると、-1 になるというのは
私達の住んでいるこの世界では、実数という数が至るところで使われています。実数は、実際にある数で、例えば温度や湿度、得点、計測値、確率、
速度、パーセンテージ、アンペア、電圧、周波数、BMI、ポイント数、危険度、評価指数など、例を挙げれば切りがないほど挙げられます。
ところが、複素数となると、例を挙げようにも挙げられません。複素数というのは、私達の住むこの世界では、決して触れることのできない
理解できない数であるということ。理解しようとしても、そこにはないので、理解できない。それが複素数の正体なんだ。
理解しようとすると、頭が混乱の域に達する。知覚的に理解するのは、まず無理な数だというのは、おさえてほしいところです。
しかし、複素数平面を導入することによって、図形的に複素数というものをある程度、理解はできるのではないかと思うのです。
まず、複素数平面を導入すれば、複素数を習う際に必ず出てくる。iの定義式
i ^ 2 = -1という式そのものの意味がわかってくる。なぜかというと、i は原点0中心とした半径1の円上にあり、cos 90° + i sin 90°と表せる
なぜこんなに複素数について熱く語っているかというと、高校時代に数学を勉強していて、一番面白いと感じたのが複素数だったからです。
他にも面白いと感じる単元はありましたが、特に、複素数や行列、数Ⅱで習う(今はどうかな?)図形と方程式という単元が個人的に
は面白いと感じておりました。あとは、数列で和を求めたり、一般項を求めたり、Σを使った計算も面白いとは感じていました。
あとは、集合と論理のところですかね。当時プログラミング言語に馴染みがあったので、すんなり理解ができました。
当時 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は最初わからなかったのに、プログラムを打ち込んでいるうちに、文法や処理内容もわかってきました。そういうものだと思います。
何か新しいことを始めるときには、やっぱり尻込みせずに、やってみた方がいいです。やらないとやっぱりどうしても後悔しますし、後味が悪いと
思いますが、やってみたら、後々になって経験談などいろいろと他の方にも教えられるので、やってみるに越したことは無いと思います。