TypeError:不能将表达式转换为float

时间:2014-03-21 09:38:39

标签: python python-2.7 numpy scipy sympy

我是一个蟒蛇新手。我正在尝试使用python评估普朗克方程。我写了一个简单的程序。但是,当我给它输入时,给我一个错误。任何人都可以告诉我哪里出错了?这是程序和错误:

程序:

from __future__ import division
from sympy.physics.units import *
from math import *
import numpy
from scipy.interpolate import interp1d

#Planck's Law evaluation at a single wavelength and temperature
def planck_law(wavelength,temperature):
    T=temperature
    f=c/wavelength
    h=planck
    k=boltzmann
    U=2*h/(c**3)*(f**3)/(exp(h*f/(k*T))-1)
    return U.evalf()

输入: 我已将该函数导入为'cp',输入如下

value = (cp.planck_law(400,2000))

错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>`enter code here`
  File "Camera_performance.py", line 14, in planck_law
  U=2*h/(c**3)*(f**3)/(exp(h*f/(k*T))-1)
  File "/usr/lib/python2.7/dist-packages/sympy/core/expr.py", line 221, in __float__
  raise TypeError("can't convert expression to float")

TypeError: can't convert expression to float

3 个答案:

答案 0 :(得分:6)

您似乎在混合名称空间,因为您使用的是from ... import *。您想使用sympy.exp(),但您的代码使用math.exp()。最好将命名空间保持分离,即永远不要使用from ... import * - 最初可能看起来更像打字,但最终会产生更清晰易懂的代码。 尝试:

import sympy as sy
import sympy.physics.units as units

def planck_law(wavelength,temperature):
     """Planck's Law evaluation at a single wavelength and temperature """   
     T=temperature
     f=units.c/wavelength
     h=units.planck
     k=units.boltzmann
     U=2*h/(units.c**3)*(f**3)/(sy.exp(h*f/(k*T))-1)
     return U.evalf()

# Test:
print(planck_law(640e-9*units.m, 500*units.K))
# Result: 1.503553603007e-34*kg/(m*s)

答案 1 :(得分:1)

您的字词h*f/(k*T)不是无单位的,因此您无法将其传递给exp()。在物理环境中没有意义; - )

如果您将结果除以Km

,则可以得到结果
exp(h*f/(k*T)/K/m)

但这肯定没有意义。它只是让程序运行(变成废话)。

我想你必须检查你的公式并找出你真正想要计算你要传递给exp()的值的方式。

编辑:

正如Pascal指出的那样,你只是错过了你传递的参数的单位。尝试使用:

planck_law(400e-9*m,2000*K)

返回:

3.20224927538564e-22*kg/(m*s)

答案 2 :(得分:1)

调用函数时,需要将单位传递给温度和波长参数。致电cp.planck_law(400*meters,2000*K)可获得预期的1.15133857387385e-33*kg/(m*s)

问题出现在指数函数中,理所当然地,它期望接收无量纲参数。由于您传递的参数不包含单位,因此Sympy将它们视为无量纲浮点数,而不是温度和长度。