首页 > 解决方案 > 在python中处理无穷大的操作

问题描述

我有一段代码可以进行简单的计算。

import numpy as np

#Constants
R = 8.314462
T = 298.15
e = -678.692
e_overkbT = e*1000/(R*T)

#Independent variable
mu = np.linspace(-2000,2000,1000)  
mu_overkbT = mu*1000/(R*T)


#Calculation
aa = (np.exp(mu_overkbT- e_overkbT))
theta = aa/(1+aa)

对于“mu”的负值,“aa”非常小,因此变量“theta”非常接近 0。对于“mu”的正值,“aa”非常大。因此,对于大数,“theta”接近 1。(大数超过大数 + 1)。

对于较大的“aa”值,python 将“theta”四舍五入为 1,这很好。然而,最终对于足够大的数字,python 会说 'aa' 是 'inf'。因此,在计算“theta”的最后一步中,我遇到了除以“inf”/“inf”的运行时错误。

我需要某种方式来处理这个错误,以便它给我'1'作为'theta'的结果。我不能减小变量“mu”的范围并在错误之前停止,因为这个计算是在一个改变“e”值的大函数内部,因此这个错误并不总是发生在同一个地方。

谢谢。

标签: pythonnumpyprecisionnumericinfinity

解决方案


在大范围使用指数函数时,这种溢出经常发生。除了好的非常好的评论之外exp(x)/(1+exp(x)) = 1/(1+exp(-x)),如果您找不到简单的转换,另一种通用方法是使用对数使中间数字更易于管理,然后最终反转此操作。对于许多大(或非常小)项的乘积尤其如此,通过应用对数,这些乘积变成一个简单的总和。


推荐阅读