Построение идеализированных спектров черного тела - PullRequest
0 голосов
/ 29 апреля 2020

Итак, я получаю пару ошибок

RuntimeWarning: overflow encountered in exp
intensity = a/ ( (wav**5) * (np.exp(b) - 1.0) )

и

RuntimeWarning: invalid value encountered in multiply
intensity = a/ ( (wav**5) * (np.exp(b) - 1.0) )

Даже с этими ошибками (и еще одним делением на ноль, которое я игнорирую, lol) мой график получается правильно в любом случае. Мне просто интересно, если кто-нибудь может помочь мне устранить эти ошибки? Пожалуйста и спасибо.

Вот полный код:

import numpy as np
import matplotlib.pyplot as plt
from astropy import constants as const


def planck(T, wav):
    a = 2.0*h*c**2
    b = h*c/(wav*k*T)
    intensity = a/ ( (wav**5) * (np.exp(b) - 1.0) )
    return intensity

# Part 1: Plotting Planck's Law

T1 = 3750
T2 = 5200
T3 = 9600 # Temperature of M0 star, the Sun, and A0 star (K)
c = const.c.value
h = const.h.value
k = const.k_B.value
l = np.linspace(0, 1.5e-6, 1500) #Array of wavlengths (meters)
IM0 = planck(T1, l) 
Isun = planck(T2, l)
IA0 = planck(T3, l) # Planck's law intensities 

plt.figure(1) # Plot of the three idealized blackbody spectra
plt.plot(l, IM0, 'k-', label = 'M0 Star')
plt.plot(l, Isun, 'r--', label = 'Sun')
plt.plot(l, IA0, 'b-.', label = 'B0')
plt.xlabel('Wavelength (meters)')
plt.ylabel('Intensity (W sr^{-1} m^{-3})')
plt.title('Idealized Blackbody Spectra')
#plt.legend('M0 Star', 'Sun', 'B0 Star')
leg = plt.legend()
plt.ticklabel_format(axis="x", style="sci", scilimits=(0,0)) # Scientific not

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

Первые 5 значений l слишком малы, что приводит к большим значениям b и, следовательно, к числовому переполнению в exp (поскольку exp (1500) - просто очень большое число).

Фактически, первое значение в l просто равно нулю, и поэтому wav в planck() становится бесконечным, а 1/wav**5 - NaN.

Отсюда и все предупреждения. Установите l = np.linspace(6e-9, 1.5e-6, 1500) и все будет в порядке.

И нет, index , это не предупреждение IDE, это Python предупреждение. Существуют способы подавления таких предупреждений, но вы можете сделать это только тогда, когда точно знаете, что вы подавляете и почему.

0 голосов
/ 29 апреля 2020

Поскольку ваш код выполняется, просто игнорируйте RuntimeWarning, потому что это просто предупреждение, которое не влияет на ваш код или что-либо еще. Ваша IDE просто предупреждает вас. Я думаю, что если вы попробуете в другой IDE, не будет никакого предупреждения. Но я могу ошибаться

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...