Pythonの「クラス」で遊ぶ:Wikipediaの球Bessel関数のグラフを描画

Wikipediaの球Bessel関数のグラフ(Spherical Bessel functions: jn, yn (Wikipedia))を描きます.クラスを使う必要はないのですが,あえてできるだけクラスを使ったコードで遊んでみました.

クラスの簡単な使い方と同時に,キーワード可変長変数(**kwargs)の使い方や,辞書型が**で展開できること(** Dictionary Unpacking — Python Reference (The Right Way) 0.1 documentation)などが学べます.

コードと出力結果

球Bessel関数
出力結果(球Bessel関数)
パラメータをいくつか用意してそれぞれのインスタンスを作成すれば,1つのプログラムでいろいろなグラフが作成できます.したがって,変数の値を変えて色々なグラフを作る場合に「プログラムをコピーして,変数の値だけを変えて実行する」必要がなくなります(こうしてしまうと,メインプログラムを変更した際にコピーしたプログラムを修正しなくてはなりません).

他にも,グラフのプロット方法を指定する変数をパラメータにすれば,設定(例えば描画範囲)を変えてグラフを作成することも簡単です(その際は,ファイル名も変数で指定できるように書き換える必要があります).

import numpy as np
from scipy.special import spherical_jn, spherical_yn
import matplotlib.pyplot as plt
import seaborn as sns

param_order = {
    'n_min': 0,
    'n_max': 2
    }

param_range = {    
    'z_min': 0,
    'z_max': 20,
    'z_num': 100
    }

class SphericalBessel:
    def __init__(self, **kwargs):
        self.n = np.arange(kwargs['n_min'], kwargs['n_max']+1, 1)
        self.z = np.linspace(kwargs['z_min'], kwargs['z_max'], kwargs['z_num'])

    def create_data(self, n):
        jn = spherical_jn(n, self.z, derivative=False)
        yn = spherical_yn(n, self.z, derivative=False)
        return jn, yn

    def plot(self):
        sns.set()
        fig = plt.figure()
        ax1 = fig.add_subplot(2, 1, 1)
        ax2 = fig.add_subplot(2, 1, 2)
        for i in self.n:
            jn, yn = self.create_data(i)
            ax1.plot(self.z, jn, label='j'+str(i))
            ax2.plot(self.z, yn, label='y'+str(i))
        ax1.set_ylim(-0.5, 1.1)
        ax2.set_ylim(-1.625, 0.375)
        ax1.legend()
        ax2.legend()
        plt.savefig('output.pdf')
        plt.show()

result = SphericalBessel(**param_order, **param_range)
result.plot()

参考文献

[1]科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化:第2章のロケットシミュレータのコードを参考にしました.
[2]オブジェクト指向でなぜつくるのか 第2版:クラスの概念や使い方について,かなりわかりやすく説明されています.