2013-11-26 47 views
0

我想繪製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,圖形結果不變。

回答

5

除了使用numpy.exp代替math.exp,你還需要指定的X的D型是float而非int32。隨着int32,數量最多的是表示的

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

y=v**3超過此值:

In [38]: v 
Out[38]: 
array([  800,  1800,  2800, ..., 199997800, 199998800, 
     199999800]) 
In [37]: y 
Out[37]: 
array([ 512000000, -2147483648, -2147483648, ..., -2147483648, 
     -2147483648, -2147483648]) 

因此,爲什麼你的價值觀像是常量的原因是因爲算術溢出。

因此改變

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

+0

非常感謝。這真的很有幫助。這正是我需要的! – user3037208

-1

計算恆定值一次,然後硬編碼它們,如果你需要一些速度。 ..

0

@Sven Marnach得到的編程權利,你需要使用Numpy exp

至於你爲什麼得到常數,你已經寫了你的函數使用SI單位。因此,您的輸入必須以SI單位表示。

如果您的波長爲納米,您想劃分X1e9。就目前而言,你正在傳遞約800米的波長。