Первое, что нужно отметить (и это незначительно), это то, что astropy
не требуется для запуска вашего кода. Таким образом, вы можете упростить операторы импорта.
import matplotlib.pylab as plt
import numpy as np
import scipy.constants
%matplotlib inline
#Importing constants to use.
h = scipy.constants.h
c = scipy.constants.c
k = scipy.constants.k
wavelengths= np.arange(1000,30000,100)*1.e-10 # here, I chose steps of 100, because plotting 29000 datapoints takes a while
temperature=[3000,4000,5000,6000]
Во-вторых, чтобы немного прибавить l oop, вы можете написать вспомогательную функцию, которую вы будете вызывать из себя l oop:
def f(lam, T):
return ((2*h*c**2)/(lam**5))*((1)/(np.exp((h*c)/(lam*k*T))-1))
теперь вы можете собрать выходные данные вашей функции вместе с входными параметрами, например, в списке кортежей:
outputs = []
for lam in wavelengths:
for T in temperature:
outputs.append((lam, T, f(lam, T)))
Поскольку вы изменяете как длину волны, так и температуру, 3D График имеет смысл:
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(111, projection='3d')
ax.plot(*zip(*outputs))
Альтернативой может быть отображение данных в виде изображения с использованием цвета для обозначения выходных данных функции.
Я также включаю альтернативный метод для генерации данных в этом. Поскольку функция f
может принимать массивы в качестве входных данных, вы можете подавать одну температуру за раз, а вместе с ней - все длины волн одновременно.
# initialise output as array with proper shape
outputs = np.zeros((len(wavelengths), len(temperature)))
for i, T in enumerate(temperature):
outputs[:,i] = f(wavelengths, T)
Теперь вывод представляет собой большую матрицу, которую можно визуализировать как изображение:
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(outputs, aspect=10e8, interpolation='none',
extent=[
np.min(temperature),
np.max(temperature),
np.max(wavelengths),
np.min(wavelengths)]
)