如何解决运行时警告:在 sqrt 中遇到无效值 return np.sqrt((EA**2)-(m**2))/(EA)
正如标题所暗示的,我不断收到平方根错误。我想可能是因为平方根下可能有一个负数,但我似乎找不到。
问题来自这行代码:
lf_rf_momentum_diff_neutrino_pi = find4mtm_C_lf(140,105,5*10**-4,np.pi/6,np.pi/2,1e3)-four_momentum(Enu_rf_pi,140,np.pi/2)
print(lf_rf_momentum_diff_neutrino_pi)
给我这个错误信息:
<ipython-input-19-f3687c795889>:5: RuntimeWarning: invalid value encountered in sqrt
return np.sqrt((EA**2)-(m**2))/(EA)
我已将此问题与函数 find4mtm_C_lf
隔离,该函数本身是一个调用下面列出的其他函数的函数。其定义如下:
def find4mtm_C_lf(m_A,m_B,m_C,theta,phi,EA):
return np.array([boost(four_momentum(energy_func(m_A,m_C),m_A,phi),gamma(m_A,energy_func(m_A,m_C)),beta_calc(m_A,EA))])
里面的各个函数定义如下:
提升
def boost(four_mom,gamma_general,beta):
z_boost = np.array([[gamma_general,-gamma_general*beta],[0,1,0],[-gamma_general*beta,gamma_general]])
boost_general = np.matmul(z_boost,four_mom)
return boost_general
伽玛
def gamma(m,EA):
gamma_general=1/((1-beta_calc(m,EA)**2)**0.5)
return gamma_general
energy_func
def energy_func(m_A,m_C):
E = ((m_A**2)+(m_C**2)-(m_B**2))/(2*m_A)
return E
beta_calc
def beta_calc(m,EA):
return np.sqrt((EA**2)-(m**2))/(EA)
我想我已经将问题进一步隔离到 find4mtm_C_lf
中的 m_A。当 m_A 定义为 60 时,它可以工作,但如果 m_A = 61 或更大,我会收到 sqrt 错误。
手动进行 np.sqrt((EA**2)-(m**2))/(EA)
计算,其中 EA = 1e3,m = m_A = 140 工作正常,特别是因为 EA >> m 所以不应该有平方根误差。
编辑 1 - 使用 beta_calc 生成值
这个值 b_pi
实际上在 lf_rf_momentum_diff_neutrino_pi
中使用,虽然不是直接输入到函数中,而是由函数重新计算。
b_pi=-beta_calc(140,1*10**3)
print('The value of beta in the lab frame seen in the parent particle rest frame is',b_pi)
The value of beta in the lab frame seen in the parent particle rest frame is -0.990151503558925
编辑 2 -four_momentum 的定义
def four_momentum(E_C,phi):
four_mom= np.insert(momentum_vector(E_C,m_C))
return four_mom
编辑 3 -momentum_vector 函数
def momentum_vector(E_C,phi):
p= ((E_C**2)-(m_C**2))**0.5
p_three_vector= p*np.array([np.sin(theta)*np.cos(phi),np.sin(theta)*np.sin(phi),np.cos(theta)])
return p_three_vector
解决方法
当我为我运行它时,beta_calc 遇到的第一个值是 m = 140 和 EA = 30.6...所以你的假设 E >> m 是错误的。这就是您收到警告的原因。 sqrt 返回一个 nan(不是数字)。
如果您确实需要复数,您可以将 np.sqrt((EA**2)-(m**2))/(EA))
交换为 np.sqrt(complex((EA**2)-(m**2))/(EA)))
,它将返回 complex 而不是 NaN,您实际上可以对其进行操作。但仍然可能需要进行故障排除才能知道 E 小于 m 的问题来自哪里。
第一个假设
find4mtm_C_lf(140,105,5*10**-4,np.pi/6,np.pi/2,1e3)
质量为 140 105 和 5e-4,能量为 100
我认为数量级存在问题。使用 (EA**2)-(m**2)
时,您的能量可能以 J 为单位,质量以 kg 为单位,但这可能是因为您没有将所有内容都以标准单位表示。说到物理术语,我的英语水平有限。我可以解释为什么你打算让 E >> m 但它没有出现在这里
第二个假设
在 find4mtm_C_lf 中,您显然将 EA 替换为 energy_func 给出的值,而不是传递 EA,这就是它从 100 变为 36 的原因
def find4mtm_C_lf(m_A,m_B,m_C,theta,phi,EA):
return ... gamma(m_A,energy_func(m_A,m_C)) ...
和 gamma 需要首先 m 然后是 EA :gamma(m,EA)
将 gamma(m_A,m_C))
替换为 gamma(m_A,EA)
会使错误消失,但请检查它是否适合您的模型
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。