Python线性方程组迭代器循环计数异常问题求助
问题排查与修复
核心问题1:测试代码重复调用迭代方法
你在测试代码里连续调用了两次p_15.Jacobi_iteration():
print('(a) Jacobi solution:',p_15.Jacobi_iteration()[0],'\n iteration count:',p_15.Jacobi_iteration()[1])
第一次调用完成迭代后,第二次调用会重新从初始解开始计算。此时因为第一次迭代已经得到了接近收敛的结果,第二次迭代仅需1步就满足精度要求,所以你看到的itr=1是第二次迭代的次数,并非第一次完整迭代的次数。
核心问题2:Jacobi迭代方法的初始化逻辑错误
在Jacobi_iteration()中,第一次进入循环时就将curr_sol替换为空的next_sol,导致首次计算用的是未初始化的空数组,逻辑完全错误。同时,nthsol_update的参数是1-based索引,但循环中传入的是0-based的i,会引发索引越界问题。
修复后的代码
修正Jacobi迭代方法
def Jacobi_iteration(self): curr_sol = copy.deepcopy(self.ini) next_sol = np.empty_like(curr_sol) acc_test = False itr = 0 # 首次迭代:用初始解计算next_sol for i in range(curr_sol.shape[0]): next_sol[i,0] = self.nthsol_update(curr_sol, i+1) # 传入1-based索引 itr += 1 acc_test = self.acc_test(curr_sol, next_sol) # 后续迭代循环 while not acc_test: curr_sol = copy.deepcopy(next_sol) for i in range(curr_sol.shape[0]): next_sol[i,0] = self.nthsol_update(curr_sol, i+1) acc_test = self.acc_test(curr_sol, next_sol) itr += 1 return(next_sol, itr)
修正测试代码
mat_15=np.array([[4.63,-1.21,3.22],[-3.07,5.48,2.11],[1.26,3.11,4.57]]) p_15=diag_iterator(mat_15,np.array([2.22,-3.17,5.11]),np.zeros(3),1) sol, itr = p_15.Jacobi_iteration() print('(a) Jacobi solution:', sol, '\n iteration count:', itr)
仅调用一次迭代方法,将结果存入变量后再打印,避免重复计算。
额外优化建议
scarborough方法中,当ini_sol为0时,用0.00001做分母可能引入误差,建议改为直接判断绝对误差:def scarborough(self, ini_sol, next_sol, acc): if ini_sol != 0: return abs((ini_sol - next_sol)/ini_sol) < 0.5*10**(-acc) else: return abs(next_sol) < 0.5*10**(-acc)acc_test方法可改用all()函数简化逻辑,更直观:def acc_test(self, ini_vec, next_vec): check_list = [] for i in range(ini_vec.shape[0]): check_list.append(self.scarborough(ini_vec[i,0], next_vec[i,0], self.acc+math.log10(2))) return all(check_list)
内容的提问来源于stack exchange,提问作者boiled_wine_
相关产品推荐
相关产品推荐

