我是个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
调用函数时,需要将单位传递给温度和波长参数。调用
cp.planck_law(400*meters,2000*K)
将给出所需的1.15133857387385e-33*kg/(m*s)
。这个问题是由指数函数引起的,它理所当然地希望得到一个无量纲的参数。由于您传递的参数不包括单位,Sympy将它们视为无量纲浮点数,而不是根据需要的温度和长度。
似乎您正在混合名称空间,因为您正在使用
from ... import *
。您想使用sympy.exp()
,但您的代码使用math.exp()
。保持名称空间的分隔是一个很好的实践,也就是说,不要使用from ... import *
-一开始它看起来像是更多的输入,但最终会产生更清晰、更容易理解的代码。 尝试:您的术语
h*f/(k*T)
不是无单位的,因此您不能将其传递给exp()
。在物理环境中也没有意义;-)如果除以
K
和m
,就可以得到一个结果:但这毫无意义。只是为了让程序运行起来(变成废话)。
我想你必须检查你的公式,找出你真正想如何计算你想传递给
exp()
的值。编辑:
正如帕斯卡所指出的,您只是缺少传递参数的单位。试试看:
返回:
相关问题 更多 >
编程相关推荐