python - 在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”值的大函数内部,因此这个错误并不总是发生在同一个地方。
谢谢。
解决方案
在大范围使用指数函数时,这种溢出经常发生。除了好的非常好的评论之外exp(x)/(1+exp(x)) = 1/(1+exp(-x))
,如果您找不到简单的转换,另一种通用方法是使用对数使中间数字更易于管理,然后最终反转此操作。对于许多大(或非常小)项的乘积尤其如此,通过应用对数,这些乘积变成一个简单的总和。
推荐阅读
- php - WooCommerce 订阅 - 通知翻译不起作用
- c# - 是否可以在 C# 中从 HelixToolKit.WPF 迁移到 HelixToolKit.WPF.SharpDX
- python - 在 Google Colab 上将列表转换为单热编码列表时 RAM 内存不足
- java - 如何将 com.vaadin.ui 导入 Java 项目
- node.js - 导入 node.js 模块 - SyntaxError: Unexpected identifier
- influxdb - 带有多个标签值的勾选脚本
- node.js - 将相同的 objectID 发布到不同的表中
- cucumber - 带有多个标签的黄瓜场景
- c# - INFORMIXSERVER 与 DBSERVERNAME 或 DBSERVERALIASES 都不匹配
- google-kubernetes-engine - 初始化容器是否与 GKE 中的应用容器在同一节点上运行