虽有q+=1但While循环未正常运行,ffa值重复问题求助
问题分析与修复方案
核心问题
你的代码得到全相同的ffa列表,根源有两个:
- 加速度变量被覆盖而非累加:内部循环中
accn每次被赋值为单个标量,下一次循环会直接覆盖上一次的值,最终np.sum(accn)实际只是最后一次计算的加速度值,和mdelt的取值无关。 - 循环变量
i未重置:i在外部初始化,第一次循环后i会停在上次循环的末尾位置,逻辑上不符合每次处理新mdelt时从delta_0第一个元素遍历的需求。
修复后的代码
import numpy as np from scipy.integrate import quad # 请确保以下物理量已正确定义 k = ... v_p = ... mu_eff = ... B = ... hbar = ... L = ... s0 = ... m_Rb = ... z0 = ... def Maxwell(v): # 此处补充麦克斯韦分布的实现 ... # 修正mdelt:原包含0值会导致linspace报错,改为从8开始 mdelt = np.arange(8, 160, 8) ffa = [] fslow = [] q = 0 while q < len(mdelt): i = 0 # 每次处理新mdelt时重置i delta_0 = np.linspace(-180*10**6, -20*10**6, mdelt[q]) accn_list = [] # 用列表收集所有加速度值 while i < len(delta_0): delta_p = delta_0[i] - (k*v_p) + (mu_eff*B)/hbar delta_n = delta_0[i] + (k*v_p) - (mu_eff*B)/hbar F = (hbar*k*L*s0)/2 * (1/(1+s0+(2*delta_p/L)**2) - 1/(1+s0+(2*delta_n/L)**2)) accn = F / m_Rb accn_list.append(accn) # 将当前加速度加入列表 i += 1 a = np.sum(accn_list) # 对所有加速度求和 D = 0.040 v_cMOT = (-2*a*D)**0.5 v_cSLOW = (v_cMOT**2 - 2*a*z0)**0.5 fa, err = quad(Maxwell, 0, v_cMOT) ffa.append(fa) q += 1 # 绘制mdelt与ffa的关系图 import matplotlib.pyplot as plt plt.plot(mdelt, ffa) plt.xlabel('mdelt') plt.ylabel('ffa') plt.title('mdelt vs ffa') plt.show()
关键修复点
- 将
i = 0移到外层while q循环内部,确保每次处理新的mdelt值时,都从delta_0的第一个元素开始遍历。 - 用
accn_list列表收集每次计算的加速度值,避免单个变量被覆盖,这样np.sum(accn_list)才是所有加速度的总和,会随mdelt的取值变化。 - 移除
mdelt中的0值:np.linspace的num=0会抛出错误,若需要保留0的情况,需添加判断跳过该值。
内容的提问来源于stack exchange,提问作者Rainydays123
相关产品推荐
相关产品推荐

