python,绘制通过数组循环的普朗克曲线
我试图让自己熟悉python编程,但我刚刚开始,正在努力解决以下问题。也许有人可以给我一个如何继续的提示,或者我可以在哪里找到一个好的解决方案 我想通过一个循环中的一个循环来绘制6种不同温度下132个波长的普朗克曲线。函数planckwavel接收两个参数,波长和温度,我将它们分为两个循环 到目前为止,我成功地使用了列表,但可能无法以优雅的方式解决:python,绘制通过数组循环的普朗克曲线,python,for-loop,multidimensional-array,Python,For Loop,Multidimensional Array,我试图让自己熟悉python编程,但我刚刚开始,正在努力解决以下问题。也许有人可以给我一个如何继续的提示,或者我可以在哪里找到一个好的解决方案 我想通过一个循环中的一个循环来绘制6种不同温度下132个波长的普朗克曲线。函数planckwavel接收两个参数,波长和温度,我将它们分为两个循环 到目前为止,我成功地使用了列表,但可能无法以优雅的方式解决: plancks = [] temp = [280, 300, 320, 340, 360, 380] temp_len = len(temp)
plancks = []
temp = [280, 300, 320, 340, 360, 380]
temp_len = len(temp)
### via fun planckwavel
for i in range(temp_len):
t_list = [] # list nach jeder j schleife wieder leeren
for j in range(wl_centers_ar.shape[0]):
t = planckwavel(wl_centers_ar[j],temp[i])
t_list.append(t)
plancks.append(t_list)
### PLOT Planck curves
plancks = np.array(plancks).T # convert list to array and transpose
view_7 = plt.figure(figsize=(8.5, 4.5))
plt.plot(wl_centers_ar,plancks)
plt.xticks(rotation='vertical')
但我希望使用数组而不是列表,因为我喜欢在之后继续使用更大的维度图像。因此,我尝试对数组执行相同的操作,但不幸的是,使用以下代码失败:
plancks_ar = zeros([132,6], dtype=float ) # create array and fill with zeros
temp_ar = array([273, 300, 310, 320, 350, 373])
for i in range(temp_ar.shape[0]):
t_ar = np.zeros(plancks_ar.shape[0])
for j in range(plancks_ar.shape[0]):
t = planck(wl_centers_ar[j]*1e-6,temp[1])/10**6
np.append(t_ar,t)
np.append(plancks_ar, t_ar)
plt.plot(wl_centers_ar,plancks)
如果有人能给我一些建议,我将非常感激
Thanx,
致以最良好的祝愿
彼得我想你是在问如何使用NumPy's。下面是一种删除显式Python循环的方法:
import numpy as np
# Some physical constants we'll need
h, kB, c = 6.626e-34, 1.381e-23, 2.998e8
def planck(lam, T):
# The Planck function, using NumPy vectorization
return 2*h*c**2/lam**5 / (np.exp(h*c/lam/kB/T) - 1)
# wavelength array, 3 - 300 um
lam = np.linspace(3, 75, 132)
# temperature array
T = np.array([280, 300, 320, 340, 360, 380])
# Remember to convert wavelength from um to m
pfuncs = planck(lam * 1.e-6, T[:,None])
import pylab
for pfunc in pfuncs:
pylab.plot(lam, pfunc)
pylab.show()
我们要计算每个波长和每个T的planck
,因此我们需要在两个阵列上广播计算结果。按照上面链接的文档中列出的规则,我们可以通过向温度阵列添加一个新轴(使用T[:,None]
):
T[:,None]
的最终维度是1,因此lam
的132个值可以在其上广播,以生成一个6x132
数组:6行(每T一行)的132个值(波长)。我试图使用倒数(亮度温度)来双重检查上述普朗克方程。根据您的代码,我定义了以下功能,预计将获得300开尔文(@10微米,对于10 W/m2/str/微米):
但是得到了一个奇怪的结果
planckInv(10,10)
->3.0039933569668916e-08
有什么建议我的亮度温度功能有什么问题吗
谢谢,
peter这确实是一个单独的问题,但由于不太可能在stackoverlow(!)上得到答案,简短的回答是重新排列的等式是错误的:最后一行应该是
return(h*c/kB/lam)*(1/np.log((2*h*c**2/lam**5)/rad+1))
lam: 132
T 6 x 1
--------------
6 x 132
def planckInv(lam, rad):
rad=rad*1.e6 #convert to W/m^2/m/sr
lam=lam*1.e-6 #convert wavelength to m
return (h*c/kB*lam)*( 1/ np.log( (2*h*c**2/lam**5) / rad +1 ))