Python while循环未遍历delta_omega数组,无限循环问题求助
解决Python循环无限重复输出的问题
问题根源
你的while循环里初始化了i=0,但全程没更新i的值——i永远是0,一直满足i < len(delta_omega)的条件,所以会无限重复处理数组第一个元素。加break的话会直接终止循环,自然只算一次。
两种解决方法
方法1:修复while循环,手动递增计数器
在while循环的末尾加上i += 1,让计数器每次循环后加1,遍历数组所有元素:
delta_omega = np.array([-5*10**6, -10*10**6, -30*10**6]) #range of frequencies i = 0 while i<len(delta_omega): # 保留原有计算逻辑 B_p = (h/mu_eff) * (delta_omega[i] + (1/lmbda)*(vf_oven**2 - (2*a*length_slow))**0.5) B_n = (h/mu_eff) * (delta_omega[i] - (1/lmbda)*(vf_oven**2 - (2*a*length_slow))**0.5) delta_n = delta_omega[i] + (k*vf_oven) - (mu_eff*B_n)/hbar delta_p = delta_omega[i] - (k*vf_oven) + (mu_eff*B_p)/hbar F = (hbar*k*L)/2 * ((II_sat/(1+II_sat+(2*delta_n/L)**2)) - (II_sat/(1+II_sat+(2*delta_p/L)**2))) accn = abs(F/m_Rb) vf_slower = (vf_oven**2 - (2*accn*length_slow))**0.5 t_d = 1/accn * (vf_oven - vf_slower) #time taken during slower # After slower da = 0.1 #distance from end of slower to the middle of the MOT vf_MOT = (vf_slower**2 - (2*accn*da))**0.5 t_a = da/vf_MOT #time taken after slower r0 = 0.01 #MOT capture radius vr_max = r0/(t_b+t_d+t_a) # Flux of atoms captured f_oven = ((n*A)/4) * (2/(np.pi)**0.5) * ((2*k_b*T)/m_Rb)**0.5 f = f_oven * (1 - np.exp(-vr_max**2/vp**2))*(1 - np.exp(-vz_max**2/vp**2)) print('The rate of capture at a detuning of', delta_omega[i], 'is', format(f, '.1E')) # 关键:让计数器递增 i += 1
方法2:改用for循环(更推荐)
直接遍历delta_omega的每个元素,不用手动管理计数器,代码更简洁,也不容易出错:
delta_omega = np.array([-5*10**6, -10*10**6, -30*10**6]) #range of frequencies # 直接遍历数组中的每个detuning值 for detuning in delta_omega: # 把原来的delta_omega[i]换成detuning即可 B_p = (h/mu_eff) * (detuning + (1/lmbda)*(vf_oven**2 - (2*a*length_slow))**0.5) B_n = (h/mu_eff) * (detuning - (1/lmbda)*(vf_oven**2 - (2*a*length_slow))**0.5) delta_n = detuning + (k*vf_oven) - (mu_eff*B_n)/hbar delta_p = detuning - (k*vf_oven) + (mu_eff*B_p)/hbar F = (hbar*k*L)/2 * ((II_sat/(1+II_sat+(2*delta_n/L)**2)) - (II_sat/(1+II_sat+(2*delta_p/L)**2))) accn = abs(F/m_Rb) vf_slower = (vf_oven**2 - (2*accn*length_slow))**0.5 t_d = 1/accn * (vf_oven - vf_slower) #time taken during slower # After slower da = 0.1 #distance from end of slower to the middle of the MOT vf_MOT = (vf_slower**2 - (2*accn*da))**0.5 t_a = da/vf_MOT #time taken after slower r0 = 0.01 #MOT capture radius vr_max = r0/(t_b+t_d+t_a) # Flux of atoms captured f_oven = ((n*A)/4) * (2/(np.pi)**0.5) * ((2*k_b*T)/m_Rb)**0.5 f = f_oven * (1 - np.exp(-vr_max**2/vp**2))*(1 - np.exp(-vz_max**2/vp**2)) print('The rate of capture at a detuning of', detuning, 'is', format(f, '.1E'))
内容的提问来源于stack exchange,提问作者Rainydays123
相关产品推荐
相关产品推荐

