とらりもんHOME  Index  Search  Changes  Login

とらりもん - python入門: 複素関数 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

複素数の関数について学ぼう。たとえば複素数c=x+yiについて, 「その2乗」という関数は, c^2=x^2-y^2+2xyiとなる。この実部はx^2-y^2, 虚部は2xyである。

複素数cは複素平面上の点とみなせるので, この関数は, 複素平面上の各点について, 実部がx^2-y^2, 虚部が2xyという複素数を対応させる。つまり, 平面上の実数関数が2つ(この場合はx^2-y^2と2xy)できるというわけだ。

このように, 複素数を与えて複素数を返すような関数を「複素関数」という。そしてひとつの複素関数は, 2つの平面グラフ(曲面)で表現される。

では, f(c)=c^2という複素関数のグラフを描いてみよう:

import numpy as np
import matplotlib.pyplot as plt
X0, X1, dx = -2, 2, 0.002
Y0, Y1, dy = -2, 2, 0.002
x=np.arange(X0, X1, dx)
y=np.arange(Y1, Y0, -dy)
x, y=np.meshgrid(x, y)
c=x+y*1j
f=c**2
plt.subplot(121)
plt.imshow(f.real)
plt.subplot(122)
plt.imshow(f.imag)
plt.show()

左のグラフが実部, 右のグラフが虚部である。

ここで,
X0, X1, dx = -2, 2, 0.002
というのは, python独特の記法で, 複数の変数への代入を1行で済ます。つまり,
X0 = -2
X1 = 2
dx= 0.002
という3つのコマンドと同等である。また,
c=x+y*1j
でできるcは, 複素数からなる行列で, その各成分の実部は行列x, 虚部は行列yのそれぞれの対応する箇所から拾っている。
c
で内容を確認しよう。また,
c.real
とすることで, その実部だけが表示される。これは,
x
と同じ結果になるはずだ(やってみよ)。

課題: plt.imshow(f.real)を, plt.imshow(f.real%2)に, plt.imshow(f.imag)を plt.imshow(f.imag%2)に修正してやってみよ。何が起きるか? それはなぜか?

レポート課題: 15-1: f(c)=c^3のグラフを描いてみよ。

レポート課題: 15-2: f(c)=sin cのグラフを描いてみよ。

レポート課題: 15-3: f(c)=1/cのグラフを描いてみよ(つまらなかったら%2などをやってみよ)。

レポート課題: 15-4: グラフを3枚横に並べて表示し, 左は実部, 真ん中は虚部, 右は絶対値を表示するようにして, これらの関数を描きなおしてみよ。ヒント: 絶対値はnp.abs()。

単純な関数が, 複素数の世界では多彩なグラフ(図形)を描くことがわかるだろう。

!オーバーフロー

では, cの1000乗を計算してみよう:
f=c**1000
すると, 何やら"overflow"という語を含んだメッセージが出る。これはエラーでなく警告である。fはうまく計算されているだろうか?
f
で見てみよう。すると, inf-infjとかinf+infjというのがずらっと出てくる。infとはinfinity, つまり∞のことだ。実部や虚部が, 正負の無限大に発散してしまった, という意味である。もっとも, 数学的には, 有限の複素数を100乗しても発散することはない。ここでは, pythonが扱うことのできる数値の限界を超えてしまった, という意味での∞である。このように, 計算の結果, 計算機が扱うことのできる数の限界を超えてしまう現象を「オーバーフロー」という。