计算玻尔兹曼方程并绘图出现Overflow Error,Second_factor溢出求替代方案
问题原因
- 单位换算错误:计算用的能量DE单位是电子伏特(eV),而玻尔兹曼常数K的单位是焦耳/开尔文(J/K),两者单位不统一,导致
DE/(K*T)的计算结果比实际值大了近10^19倍,指数运算直接超出浮点数范围触发溢出错误。 - 列表索引错误:你构造的
n列表存储的就是1到100的能级值,循环for i in n时直接用i即可,不需要再写n[i],否则会出现索引越界或者取值错误的问题。 - 指数运算精度问题:直接用
pow(2.71828, x)的精度远低于Python内置的math.exp(x),也更容易触发精度溢出。
可行解决方案
第一步:补充eV到J的单位换算
1eV = 1.602×10^-19 J,计算DE后乘以这个换算系数统一单位。
第二步:修正列表索引逻辑
直接用循环变量i作为能级值,不需要额外索引n列表。
第三步:极端参数场景可选优化
如果需要计算极低温或者极高能级的场景,可以先对玻尔兹曼分布取对数计算,最后再做指数还原,或者使用numpy的高精度浮点运算处理。
修正后可运行代码
import matplotlib.pyplot as plt import math n = [] NnN1 = [] n2i = 2 K = 1.38 * (10 ** -23) eV_to_J = 1.602 * (10 ** -19) # eV转J单位换算系数 # 构造能级列表 for i in range(1, 101): n.append(i) T = 100 for i in n: DE = -13.6 * (1 / (i ** 2) - 1 / n2i) * eV_to_J # 补充单位换算 gn = 2 * (i ** 2) Dg = gn / n2i Second_factor = math.exp(DE/(K*T)) # 改用高精度exp函数 Nn = Dg * Second_factor NnN1.append(Nn) # 绘制分布图像 plt.plot(n, NnN1) plt.xlabel("能级n") plt.ylabel("Nn/N1") plt.show() print(NnN1)
内容的提问来源于stack exchange,提问作者FTL WRATH
相关产品推荐
相关产品推荐

