首页 > 解决方案 > While 循环自动更新以前的列表值

问题描述

我正在尝试在 Python 3.X 中实现 SOR 算法以解决静电问题。但是,当在 while 循环中时,中断条件(先前和当前迭代之间的相对误差)似乎在第一次迭代中得到满足,这肯定是不正确的。在对问题进行故障排除时,我发现以前的迭代和当前的迭代具有匹配的值:

def solve_laplace_SOR(w,tolerance,cant_puntos,step,volt):
   phi_vec=np.zeros(cant_puntos)# zero seed vector, stores previous iteration
   phi_vec_k1=np.zeros(cant_puntos) #Stores current iteration
   b_vec=load_ind_term(volt,cant_puntos) #independent term 
   E_vec=np.zeros(cant_puntos) #Electric field
   R_error=100 #Initializes relative error condition so as to enter the loop
   i=0 #counts iterations made

   #Initializes boundary conditions
   phi_vec_k1[0]=volt/2
   phi_vec_k1[cant_puntos-1]=-volt/2
   while R_error > tolerance: 
       phi_vec=phi_vec_k1[:] #Stores previous value as a copy, I checked this using id() function
       phi_vec_k1[1]=((b_vec[0]-phi_vec[2])/(-2)-phi_vec[1])*w+phi_vec[1]
       for x in range(2,cant_puntos-3):
           phi_vec_k1[x]=((b_vec[x-1]-phi_vec[x+1]-phi_vec_k1[x-1])/(-2)-phi_vec[x])*w+phi_vec[x]
           E_vec[x]=(-(phi_vec_k1[x+1]-phi_vec_k1[x-1])/(2*step)) 
           pass
       phi_vec_k1[cant_puntos-2]=((b_vec[cant_puntos-2]-phi_vec_k1[cant_puntos-3])/(-2)-  phi_vec[cant_puntos-2])*w+phi_vec[cant_puntos-2]
       E_vec[cant_puntos-2]=(-(phi_vec_k1[cant_puntos-1]-phi_vec_k1[cant_puntos-3])/(2*step))
       E_vec[1]=(-(phi_vec_k1[2]-phi_vec_k1[0])/(2*step))
       R_error=np.linalg.norm(np.array(phi_vec_k1)-np.array(phi_vec),1)/np.linalg.norm(phi_vec_k1,1)
       i+=1
       print(phi_vec_k1) #This outputs the same values
       print(phi_vec)
       pass
return E_vec

当设置一个始终为真的中断条件时,该函数会收敛到预期值。由于我是 python 和一般编程的新手,我似乎找不到不需要更新的原因。我真的希望你能,非常感谢!

标签: pythonpython-3.xlistnumpynumerical-methods

解决方案


推荐阅读