Complex value function by VBA

複素数関数 w = f(z) なるものを視覚的に見るために Excel の VBA でマクロを組んでみました。

ここからファイルをダウンロードして、自由に試してください(プラウザ上でファイルを開くことができるかもしれませんが、これはダウンロードして実行することが前提のファイルです)。

普通、関数 y = f(x) は xy座標平面を使ってグラフ化できます。y = x なら直線が、y = x^2 なら放物線がグラフ上に浮かびます。複素数に複素数を対応させる関数は一枚のグラフで見ることができません。そこで、シートの左側に z(実数関数の x にあたる値)の変化を、シートの右側に w(実数関数の y にあたる値)の変化を点(複素数)で表してみました。

y = f(x) なら、たとえば x = 0.1, 0.2, 0.3, ... というように値を代入していくのでしょうが、w = f(z) では z が平面上に広がっているのでそうもいきません。そこで、z の値としてたとえば、半径 0.1 の同心円上の点, 半径 0.2 の同心円上の点, 半径 0.3 の同心円上の点, ... というような代入のしかたをしています。z 側の点は単一色で表し、w 側の点は複数色で表したのは、w 側では同じ点を通ることがままあるので、少しでも区別できるようにするためです。

なにせ、Excel のシートを利用しているので、グラフは相当粗くなっています。グラフのサイズはマクロ中のモジュール DrawRoutine の定数 CELL_SCALE で調整してください。たとえば CELL_SCALE = 0.5 とすれば、1セルが 0.5 の目盛に相当し、実軸、虚軸には 10ごとに赤い印がつきます。CELL_SCALE = 0.03 とすれば、1セルが 0.03 の目盛に相当し、実軸、虚軸には 0.1ごとに赤い印がつきます。印の付け方を決めるのはモジュール DrawRoutine の定数 SCALE_UNIT に与えた式中の値 1.5 です。これで 1.5桁上の 10 の倍数に丸めた数ずつの目盛がつきます。(← うーむ、強引な言い方だ。詳しくは式を読み砕いてください。)

Excel のメニューからマクロを実行してください。各マクロに応じた関数を描画します。各マクロは次の関数を意味します。

Exp_z: w = e^z (y = e^x に相当)
Inverse_z: w = 1/z (y = 1/x に相当)
Linear_z: w = z (y = x に相当)
Log_z: w = log z (y = log x に相当)
Sin_z: w = sin z (y = sin x に相当)
SqRoot_z: w = root(z) (y = root(x) に相当)
Square_z: w = z^2 (y = x^2 に相当)

描画に使用する関数 w = f(z) には、z = r e^(i th) = r(cos th+i sin th) を用いています(th は弧度法による角度)。ただし、w = e^z と w = sin z は、cos z = 1-z^2/2!+z^4/4!-z^6/6!+..., sin z = z/1!-z^3/3!+z^5/5!-... を n = 5 までで打ち切って用いています。実は、n = 5 までで打ち切っているため、r が大きくなるにつれ正しい値から乖離してしまいます。そこで、マクロ中には、n = 9 までの項をコメント扱いで含めてあります。'(アポストロフィー)を削除してコメント扱いの式を有効にすると、だいぶマシな描画をするようになるので、n = 5 までの場合と比較してもらいたいものです。

これらのことを利用すれば、w = z^2+z+1 や w = z sin(1/z) などの関数でも描画できるので、マクロ中の関数を書き換えて試してください。ちなみに、w = log z は多価関数ですが、そのことを無視して描画しています。

コードには、チューンアップの余地が山のようにあることは確かです。それは各自の楽しみということで、是非コードを書き換えてください。ちなみに、この [[ VBA 版 複素数関数の描画 ]] は Windows、Mac OS 上の Microsoft Excel 2000 以降のバージョンで動作を確認しています。