python - 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 和一般编程的新手,我似乎找不到不需要更新的原因。我真的希望你能,非常感谢!
解决方案
推荐阅读
- c# - NullReferenceException:对象引用未设置为对象的实例。通过 Unity 教程
- google-apps-script - 循环浏览多个谷歌表格的多个标签
- firebase - Firestore whereNotIn 查询
- html - 创建响应式 CSS 记分板,其数值紧邻条形左侧
- javascript - 从数据库显示多个区域到谷歌地图
- sql - 打印表 1 中的所有数据和表 2 中的匹配数据,但如果表 2 为空怎么办
- python - 所有时间序列数组都是向量吗?
- amazon-cloudformation - 我想将 API Gateway 查询字符串参数添加到 cloudformation 模板
- firebase - Flutter 无法将文件上传到 Firebase 存储
- angular - 角度http回调函数