You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算电子透射概率时,np.linspace遍历能量值出现NaN的问题

这种情况我之前做量子力学数值计算时也踩过坑!大概率是你的getT函数分支逻辑没适配numpy数组输入导致的,咱们来拆解清楚:

核心原因:标量分支逻辑不适用于数组输入

你单独调用getT(5)时,传入的是标量,函数里的if/else判断能明确走对应分支(比如E<15时计算q的透射表达式)。但当你传入np.linspace生成的数组时,问题就来了:

假设你的函数里有类似这样的逻辑:

def getT(E):
    V0 = 15
    if E < V0:
        # 计算E < V0时的透射系数(用q)
        q = np.sqrt(2*m*(V0-E)/hbar**2)
        T = ...
    else:
        # 计算E >= V0时的透射系数(用k)
        k = np.sqrt(2*m*(E-V0)/hbar**2)
        T = ...
    return T

当传入numpy数组时,E < V0会返回一个布尔数组(每个元素对应True/False),这时候直接用if判断,numpy会抛出警告,而且只会根据数组的“整体布尔值”(比如是否全为True)来走分支。比如你的数组里包含E=15以上的值,if判断会认为条件不成立,直接走else分支——那所有小于15的元素都会去计算k = sqrt(2*m*(E-V0)/hbar²),这时候根号里是负数,自然得到NaN!

解决方案:改用向量化分支处理

把标量的if/else换成numpy的元素级分支函数,让每个元素都走对应的计算路径,比如用np.where:

import numpy as np

def getT(E):
    V0 = 15
    m = 9.11e-31
    hbar = 1.0546e-34
    L = 1e-9  # 假设势阱宽度,替换成你的实际值
    
    # E < V0时的透射系数公式(以矩形势阱为例)
    q = np.sqrt(2 * m * (V0 - E) / hbar**2)
    T_low = 1 / (1 + ((V0**2 * np.sinh(q*L))**2) / (4*E*(V0-E)))
    
    # E >= V0时的透射系数公式
    k = np.sqrt(2 * m * (E - V0) / hbar**2)
    T_high = 1 / (1 + ((V0**2 * np.sin(k*L))**2) / (4*E*(E-V0)))
    
    # 为每个元素选择对应结果
    return np.where(E < V0, T_low, T_high)

这样不管是标量还是数组输入,每个元素都会根据自己的E值走正确的计算分支,不会出现批量NaN的情况。

额外提示:处理浮点精度误差

如果遇到E非常接近V0的情况,可能会因为浮点误差导致根号下出现极小的负数,这时候可以加一个微小的epsilon来避免:

epsilon = 1e-10
T_boundary = 1.0  # 假设E=V0时透射系数为1,根据你的模型调整
return np.where(
    E < V0 - epsilon, 
    T_low, 
    np.where(E > V0 + epsilon, T_high, T_boundary)
)

内容的提问来源于stack exchange,提问作者user9421252

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:33:39