类型错误:无法转换表达式

2024-05-16 11:47:18 发布

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

我是个Python新手。我试图用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

Tags: infrompyimport程序错误linefloat
3条回答

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

这个问题是由指数函数引起的,它理所当然地希望得到一个无量纲的参数。由于您传递的参数不包括单位,Sympy将它们视为无量纲浮点数,而不是根据需要的温度和长度。

似乎您正在混合名称空间,因为您正在使用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)

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

如果除以Km,就可以得到一个结果:

exp(h*f/(k*T)/K/m)

但这毫无意义。只是为了让程序运行起来(变成废话)。

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

编辑:

正如帕斯卡所指出的,您只是缺少传递参数的单位。试试看:

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

返回:

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

相关问题 更多 >