Solcore
前回、Pythonのitertoolsを使った組み合わせ、順列、そして複数のリストの要素の総組み合わせの作成方法を紹介しました。
今回は太陽電池解析用ライブラリSolcoreを使って太陽光、LED光、レーザー光、ハロゲン光のスペクトルをグラフ化する方法を紹介します。
私は太陽電池の研究をやっているわけではないのですが、ふとしたことから各種光源の強度比較が必要になりました。
でも調べれば調べるほど光源の単位って出てくるわけで、そうなると私の様な光の素人にとっては、どう比較していいのか分からない。
そんなときに頼りになったのが、こちらのSolcoreというライブラリ。
太陽電池のライブラリですが、太陽光のスペクトルがすでに含まれていて、さらにレーザー様の出力(LEDもこれに含まれます)、ハロゲン光源(黒体放射の光源、熱光源)のスペクトルも自由に設定できる優れものです。
ということで今回ちょっと紹介してみます。
それでは始めていきましょう。
ライブラリのインストール
Solcoreのライブラリはいつも通りpipでインストールすることができます。
pip install solcore
太陽光スペクトルの取得とグラフ化
まずは太陽光スペクトルの取得とグラフ化を紹介します。
太陽光スペクトルを取得するにはまず「solcore.light_source」から「LightSource」をインポートします。
from solcore.light_source import LightSource
そして表示する波長範囲のリストを作成し、「LightSource(source_type=”standard”, x=wavelength, version=”AM1.5g”)」で太陽光スペクトルを取得します。
得られたデータは「.spectrum()」とすることで波長と強度のデータを取得することができます。
import numpy as np
import matplotlib.pyplot as plt
from solcore.light_source import LightSource
wavelength = np.arange(300, 3000)
AM15G = LightSource(source_type='standard', x=wavelength, version='AM1.5g')
print(AM15G.spectrum())
実行結果
(array([ 300, 301, 302, ..., 2997, 2998, 2999]),
array([0.0010205 , 0.00193 , 0.0029209 , ..., 0.00570418,
0.00641852, 0.00713286]))
ここまでデータが得られればmatplotlibでグラフ化するだけです。
import numpy as np
import matplotlib.pyplot as plt
from solcore.light_source import LightSource
wavelength = np.arange(300, 3000)
AM15G = LightSource(source_type='standard', x=wavelength, version='AM1.5g')
fig = plt.figure()
plt.clf()
plt.plot(AM15G.spectrum()[0], AM15G.spectrum()[1])
plt.xlabel('Wavelength (nm)')
plt.ylabel('Power density (Wm$^{-2}$nm$^{-1}$)')
fig.tight_layout()
plt.show()
ちなみに強度の単位は「W m-2 nm-1(1 nmあたり1 m2あたりのW)」です。
レーザー、LEDのスペクトルの表示
次にレーザーとLEDのスペクトルを表示する方法を紹介します。
レーザー、LEDのスペクトルと言っていますが、実際にはピーク波長、半値幅、強度(W)を設定し、ガウス分布を表示するという形です。
ですのでレーザーもLEDも同じ方法で表示できるというわけです。
また実際にはスペクトルは左右非対称になったりしますが、そこまではシミュレートはできない様です。
スペクトルの取得方法は「LightSource(source_type=”laser”, x=wavelength, center=ピーク波長, linewidth=半値幅, power=強度)」です。
import numpy as np
import matplotlib.pyplot as plt
from solcore.light_source import LightSource
wavelength = np.arange(300, 3000)
AM15G = LightSource(source_type='standard', x=wavelength, version='AM1.5g')
Laser = LightSource(source_type='laser', x=wavelength, center=1550, linewidth=1, power=10)
LED = LightSource(source_type='laser', x=wavelength, center=800, linewidth=50, power=50)
fig = plt.figure()
plt.clf()
plt.plot(*AM15G.spectrum(), label="AM1.5G")
plt.plot(*Laser.spectrum(), label="Laser")
plt.plot(*LED.spectrum(), label="LED")
plt.xlabel('Wavelength (nm)')
plt.ylabel('Power density (Wm$^{-2}$nm$^{-1}$)')
plt.legend()
fig.tight_layout()
plt.show()
実行結果
ハロゲン光源(熱光源、黒体放射)スペクトルの表示
ハロゲン光源(熱光源、黒体放射)のスペクトルを取得するには「LightSource(source_type=”black body”, x=wavelength, T=色温度, entendue=強度)」とします。
import numpy as np
import matplotlib.pyplot as plt
from solcore.light_source import LightSource
wavelength = np.arange(300, 3000)
AM15G = LightSource(source_type='standard', x=wavelength, version='AM1.5g')
Halogen1 = LightSource(source_type='black body', x=wavelength, T=5800, entendue='Sun')
Halogen2 = LightSource(source_type='black body', x=wavelength, T=4500, entendue='Sun')
Halogen3 = LightSource(source_type='black body', x=wavelength, T=3200, entendue='Sun')
fig = plt.figure()
plt.clf()
plt.plot(*AM15G.spectrum(), label="AM1.5G")
plt.plot(*Halogen1.spectrum(), label="Halogen1")
plt.plot(*Halogen2.spectrum(), label="Halogen2")
plt.plot(*Halogen3.spectrum(), label="Halogen3")
plt.xlabel('Wavelength (nm)')
plt.ylabel('Power density (Wm$^{-2}$nm$^{-1}$)')
plt.legend()
fig.tight_layout()
plt.show()
実行結果
扱いに困るのが「entendue」ですが、「”Sun”」だと太陽スペクトルに近い色温度5800Kにおいて、太陽1つ分の強度となる様な値のようです。
ただ色温度は温度によってスペクトルが変化するため、どの色温度においても1Sunの強度というわけではないことに注意してください。
ちなみに値を指定することもできて「6.8e-5」が「Sun」と同値です。
そのため半分の「3.4e-5」を指定すると単純にグラフの高さが半分になります。
import numpy as np
import matplotlib.pyplot as plt
from solcore.light_source import LightSource
wavelength = np.arange(300, 3000)
AM15G = LightSource(source_type='standard', x=wavelength, version='AM1.5g')
Halogen1 = LightSource(source_type='black body', x=wavelength, T=5800, entendue='Sun')
Halogen2 = LightSource(source_type='black body', x=wavelength, T=5800, entendue=6.8e-5 )
Halogen3 = LightSource(source_type='black body', x=wavelength, T=5800, entendue=3.4e-5 )
fig = plt.figure()
plt.clf()
plt.plot(*AM15G.spectrum(), label="AM1.5G")
plt.plot(*Halogen1.spectrum(), label="Halogen1")
plt.plot(*Halogen2.spectrum(), label="Halogen2", ls="--")
plt.plot(*Halogen3.spectrum(), label="Halogen3")
plt.xlabel('Wavelength (nm)')
plt.ylabel('Power density (Wm$^{-2}$nm$^{-1}$)')
plt.legend()
fig.tight_layout()
plt.show()
実行結果
次回はOpenCVを使って画像データをR(赤)、G(緑)、B(青)のデータに分離する方法を紹介します。
ではでは今回はこんな感じで。
コメント