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 のメニューからマクロを実行してください。各マクロは以下の関数を意味します。マクロ名が AaaZ_O となっているものは、z 側で半径 0.1 の同心円上の点, 半径 0.2 の同心円上の点, 半径 0.3 の同心円上の点, ... のようにトレースし、マクロ名が AaaZ_II となっているものは、z 側で実数値を -3.0, -2.9, -2.8, ... にとる際、虚数値を -0.1i → 0.1i, -0.2i → 0.2i, -0.3i → 0.3i, ... のようにトレースして描画します。(← うーむ、分かりにくいね。実際に実行すれば一目瞭然です。)

ExpZ_II ExpZ_O →  w = e^z (y = e^x に相当)
InverseZ_II InverseZ_O →  w = 1/z (y = 1/x に相当)
LinearZ_II LinearZ_O →  w = z (y = x に相当)
LogZ_II LogZ_O →  w = log z (y = log x に相当)
SinZ_II SinZ_O →  w = sin z (y = sin x に相当)
SqrtZ_II SqrtZ_O →  w = √(z) (y = √(x) に相当)
SquareZ_II SquareZ_O →  w = z^2 (y = x^2 に相当)

AaaZ_II と AaaZ_O は同じ関数を全く同じ範囲で描画していますが、見た目はだいぶ異なって見えるかもしれません。理由は描画精度が粗いからで、本当はAaaZ_II と AaaZ_O は全く同じ描画なのです。試しにマクロ中で精度を細かく(たとえば Step (CELL_SCALE * 2) の記述を、Step (CELL_SCALE * 0.5) などに)して、かつ描画範囲を狭く(たとえば (CELL_SCALE * 64) の記述を、(CELL_SCALE * 32) などに)して、実行してください。w 側の同じような範囲が色付けされるはずです。

さて、これらのことを利用すれば、w = z^2+z+1 や w = z sin(1/z) などの関数でも描画できるので、マクロ中の関数を書き換えて試してください。描画に使用する関数 w = f(z) は主に、z = r e^(iθ) = r(cosθ+i sinθ) を利用しました(θ は弧度法による角度)。複素数関数は多価関数、つまり虚軸方向に 2πiの周期性があるため、w = log z と w = √(z) は周期を調整して描画しました。

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