我一直在为我的一位教授将一些MatLab代码转换成python(这不是一项仅仅是整理一些东西的作业),我被困在这一部分
当我运行代码时,我得到了UnitTypeError:“只能对无量纲量应用'exp'函数”,我尝试解决这个问题的所有方法都不起作用。我猜想这个错误是由linspace命令引起的,但我不确定。这方面的任何帮助都会很好
这是电话线
IM0 = ((2*h*c**2)/(l**5))/(np.exp(h*c/( h*c/(k*T1*l)))-1)
常数来自astropy
h = const.h;
c = const.c;
k = const.k_B;
l = np.linspace(0, 1.5e-6, 1500);
T1 = 3750
astropy
常量是类的实例。在将它们用作np.exp()
的参数之前,请尝试提取每个的“值”:但是请注意
IM0
存在数值问题。分母在所有l
上为零accepted answer很好,只要您确信所使用的裸值在正确的维度上,它就可以工作。但是一般来说,使用
.value
并丢弃单位信息可能会有潜在的危险,使用Quantitieswith units可以确保所有计算都是使用兼容的单位完成的让我们看看指数中的指数,它通常应该是一个无量纲量
首先请注意,您从Astropy使用的所有常量都有单位:
然后声明了一些无单位值并将其与以下值混合:
以焦耳/开尔文为单位给出
k_B
的结果,需要用正确单位中的一些值进行抵消。我猜T1
应该是以开尔文表示的温度(我不确定l
但假设它是J-1中的热力学β,尽管你应该仔细检查这个值应该是什么单位)因此,您可能需要使用适当的单位声明这些值(顺便说一句,您可以通过定义一些ε并将其用作范围的起点来避免恼人的除以零):
现在,指数是一个无量纲的量:
(在这种情况下,无量纲值都非常接近于零,指数四舍五入为1。如果这不正确,那么您需要检查我关于单位的一些假设)
在任何情况下,这就是该库的使用方式,而您得到的错误是针对您的假设进行的故意安全检查
更新:我在your other question中看到您为您的问题提供了更多的上下文,特别是指定
l
是以米为单位的波长(这是我的第一个猜测,但根据您给出的等式我不确定)实际上,通过利用等价性,您可以避免在普朗克方程中直接使用
h
和c
。在这里,您可以将l
定义为以米为单位的波长:并将其直接转换为光谱能量:
然后在普朗克定律方程中写出指数,如:
(这里它给出了一些接近低波长的无穷大,但是你可以通过剪切到一个更大的下限来避免)
相关问题 更多 >
编程相关推荐