Есть несколько проблем с
Intensity=((2*h*c**2)/(x**5))(1/(exp(((h*c)/(x*k*T)-1))
Скобки несбалансированы, отсутствует пропущенный *
между закрытыми наборами скобок, а функция exp
не определена. Поскольку x
является np.ndarray
, вам нужно использовать np.exp
вместо math.exp
, поэтому оно должно быть
Intensity = ((2 * h * c**2) / x**5) * (1 / (np.exp((h * c) / (x * k * T)) - 1))
Однако следует также отметить, что диапазон (1, 1000)
довольно бесполезен в этой ситуации, поскольку x
(длина волны) находится в метрах , а излучение в диапазоне длин волн от 1 м до 1 км не очень интересно. Это должно быть больше похоже на (1e-8, 1e-6)
(от 10 нм до 1 мкм), которое может быть сгенерировано с помощью np.linspace(1e-8, 1e-6, 1000)
и затем даст нормальные кривые черного тела:
Полный пример кода
import matplotlib.pyplot as plt
import numpy as np
import math
h = 6.62607015e-34
k = 1.380649e-23
c = 299792458.00
sb = (2 * math.pi**5 * k**4) / (15 * c**2 * h**3)
def one_star():
mass = np.random.uniform(0.1, 50)
radius = mass**0.9 * 6.96e8
B = np.random.uniform(3.3, 3.7)
sa = 4 * math.pi * radius**2
T = (luminosity / (sa * sb))**(1/4)
x = np.linspace(1e-8, 1e-6, 1000)
I = ((2 * h * c**2) / x**5) * (1 / (np.exp((h * c) / (x * k * T)) - 1))
plt.plot(x, I)
for i in range(5):
one_star()
plt.show()