【发布时间】:2019-04-15 19:58:04
【问题描述】:
我想绘制普朗克定律的频率版本。我首先尝试独立完成此操作:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
%matplotlib inline
# Planck's Law
# Constants
h = 6.62607015*(10**-34) # J*s
c = 299792458 # m * s
k = 1.38064852*(10**-23) # J/K
T = 20 # K
frequency_range = np.linspace(10**-19,10**19,1000000)
def plancks_law(nu):
a = (2*h*nu**3) / (c**2)
e_term = np.exp(h*nu/(k*T))
brightness = a /(e_term - 1)
return brightness
plt.plot(frequency_range,plancks_law(frequency_range))
plt.gca().set_xlim([1*10**-16 ,1*10**16 ])
plt.gca().invert_xaxis()
这不起作用,我在某种程度上遇到了缩放问题。我的下一个想法是尝试使用这个问题中的这个人的代码:Plancks Formula for Blackbody spectrum
import matplotlib.pyplot as plt
import numpy as np
h = 6.626e-34
c = 3.0e+8
k = 1.38e-23
def planck_f(freq, T):
a = 2.0*h*(freq**3)
b = h*freq/(k*T)
intensity = a/( (c**2 * (np.exp(b) - 1.0) ))
return intensity
# generate x-axis in increments from 1nm to 3 micrometer in 1 nm increments
# starting at 1 nm to avoid wav = 0, which would result in division by zero.
wavelengths = np.arange(1e-9, 3e-6, 1e-9)
frequencies = np.arange(3e14, 3e17, 1e14, dtype=np.float64)
intensity4000 = planck_f(frequencies, 4000.)
plt.gca().invert_xaxis()
这不起作用,因为我得到了除以零的错误。除了我没有看到除以零之外,分母不应该是零,因为指数项不应该等于一。我选择了频率作为示例代码中波长值的转换。
谁能帮助解决这个问题或解释我如何才能得到普朗克定律的频率而不是波长?
【问题讨论】:
-
在第二个示例中,您似乎没有绘制值。这可能是为什么它被零除失败的原因吗?
-
如果我在第二个示例中添加
plt.plot(frequencies, intensity4000)、plt.gca().set_xlim([3e14, 1e15])和plt.show(),它对我有用,尽管有一些溢出警告。正如@Asmus 正确指出的那样,警告表明您应该仔细查看数字的范围。 -
我想部分问题是
frequency_range = np.linspace(10**-19,10**19,1000000)应该是frequency_range = np.logspace(10**-19,10**19,1000000)。否则,您将计算10**13点。我一般来说你需要在对数空间中操作(即,通过在计算中携带对数来找到强度对数),因为你会用大(或小)的指数和立方数来溢出你的浮点数。
标签: python numpy matplotlib