普朗克能量密度Python

2024-10-04 01:23:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用Python绘制不同温度和频率的曲线图,我定义了一个函数,但是当我想绘制它时,它显示了一个错误。在

def planck(v,T):
    h=6.62606957*(10**-34.0)
    c=3*(10**8.0)
    k=1.3806488*(10**-23.0)

    x=(h*8*pi/c**3.0)
    y=v**3
    exponente = (h*v/k*T)
    ex = math.exp(exponente)-1

    PLANCK=(x*y)*(ex**-1)
    return PLANCK

x0, xf, dx = 800,2*(10**8),1000  
X = arange(x0, xf, dx)
print X

P1=planck(X, 3000)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-16-034ad82af010> in <module>()
----> 1 P1=planck(X, 3000)

<ipython-input-11-e52b9512e92c> in planck(v, T)
      7     y=v**3
      8     exponente = (h*v/k*T)
----> 9     ex = math.exp(exponente)-1
     10 
     11     PLANCK=(x*y)*(ex**-1)

 TypeError: only length-1 arrays can be converted to Python scalars

然后,如果我只使用exp而不是math.exp,那么图的结果是一个常量。在


Tags: ininputipython绘制math温度exxf
3条回答

@Sven Marnach的编程位正确,您需要使用Numpyexp。在

至于为什么要得到常数,你已经用国际单位制写了你的函数。因此,您的输入必须使用国际单位制。在

如果你的波长是纳米的话,你想用X除以1e9。就目前情况来看,你通过的波长约为800米。在

除了使用numpy.exp而不是math.exp,还需要将X的数据类型指定为float,而不是{}。对于int32,可表示的最大数为

In [46]: np.iinfo('int32').max
Out[46]: 2147483647

并且y=v**3超过此值:

^{pr2}$

因此,您的值看起来像常量的原因是因为算术溢出。在

所以改变

X = np.arange(x0, xf, dx)

X = np.arange(x0, xf, dx, dtype='float')

import matplotlib.pyplot as plt
import numpy as np
pi = np.pi

def planck(v,T):
    h=6.62606957*(10**-34.0)
    c=3*(10**8.0)
    k=1.3806488*(10**-23.0)

    x=(h*8*pi/c**3.0)
    y=v**3
    exponente = (h*v/k*T)
    ex = np.exp(exponente)-1

    PLANCK=(x*y)*(ex**-1)
    return PLANCK

x0, xf, dx = 800,2*(10**8),1000  
X = np.arange(x0, xf, dx, dtype='float')

P1 = planck(X, 3000)
plt.plot(X, P1)
plt.show()

enter image description here

计算一次常量值,然后硬编码,如果你需要一些速度。。。在

相关问题 更多 >