何が見えるの?
一般式
まず実数範囲のグラフ。
普通にラインを引くと発散している箇所がつながってしまうので点描のグラフに差し替えた。
ソースコード
あまりプログラミングらしいことをしていません。
ソースにほとんど色がつかないのはNumPyとMatplotlibの記述力が高いおかげです。
from scipy.special import gamma from matplotlib import pyplot as plt import numpy as np C = 500 x = np.linspace( -5., 5., C) y = gamma(x) plt.gca().set_autoscale_on(False) plt.axis([-5., 5., -5., 5.]) plt.plot(x, y, "bo") plt.show()
続いて複素数範囲。
複素数平面で色付けされたグラフ。きれいですね!わたしが描いたわけじゃないけど!これはmpmathのサンプルコードなんだけど短すぎてよく分からないんだよね…
ソースコード
複素数の扱いが面倒になって変数を余計に定義することにした。ひどいコード><
from scipy.special import gamma from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np C = 500 x = np.linspace( -5., 5., C) y = np.linspace( -5, 5, C) _y = np.linspace( -5.j, 5.j, C) X, Y = np.meshgrid(x, y) _X, _Y = np.meshgrid(x, _y) z = gamma(X+_Y) plt.gca().set_autoscale_on(False) fig = plt.figure() ax = fig.add_subplot(111, projection="3d") ax.plot_surface(X, Y, np.absolute(z), cmap="autumn") ax.set_zlim3d(0, 10.) ax.autoscale(False) plt.axis([-6., 6., -6., 6.]) plt.show()
トリビア
ガンマ関数の数値計算はランチョスの近似法というのを用いるのが標準だそうです。
Wikipedia:Lanczos approximation