我正在实现Jacobi迭代法
问题是我不能在每次迭代后存储计算出的矩阵,我试图附加到一个空列表中,但它一直覆盖该列表中以前的元素,我最终得到一个矩阵重复K次。你知道吗
我需要对这些矩阵进行减法运算,得到收敛准则
# Iterate Jacobi until convergence
U = np.array([[8.9,8.9,8.9,8.9,8.9],[8.4,0,0,0,9.2],[7.2,0,0,0,9.4],[6.1,6.8,7.7,8.7,6.1]])
UI=U
UF=U
UFK=[]
k=0
while k<3:
k=k+1 # update the iteration counter
for i in range (1,Nx-1):
for j in range (1,Ny-1):
UF[j,i] = (UI[j+1,i]+UI[j,i+1]+UI[j-1,i]+UI[j,i-1])*0.25 #the matrix i want to store after each iteration
UFK.append(UF) #
print (UF) # when i print UF i get the correct matrix at each iteration displayed
[[ 8.9 8.9 8.9 8.9 8.9 ]
[ 8.4 4.325 3.30625 5.3515625 9.2 ]
[ 7.2 4.58125 3.896875 6.83710938 9.4 ]
[ 6.1 6.8 7.7 8.7 6.1 ]]
[[ 8.9 8.9 8.9 8.9 8.9 ]
[ 8.4 6.296875 6.11132812 7.76210937 9.2 ]
[ 7.2 6.0484375 6.67421875 8.13408203 9.4 ]
[ 6.1 6.8 7.7 8.7 6.1 ]]
[[ 8.9 8.9 8.9 8.9 8.9 ]
[ 8.4 7.36494141 7.67531738 8.47734985 9.2 ]
[ 7.2 7.00979004 7.62979736 8.5517868 9.4 ]
[ 6.1 6.8 7.7 8.7 6.1 ]]
print(UFK) # when i display the appended UFK it is just repeating a single matrix 3 times
[array([[ 8.9 , 8.9 , 8.9 , 8.9 , 8.9 ],
[ 8.4 , 7.36494141, 7.67531738, 8.47734985, 9.2 ],
[ 7.2 , 7.00979004, 7.62979736, 8.5517868 , 9.4 ],
[ 6.1 , 6.8 , 7.7 , 8.7 , 6.1 ]]),
array([[ 8.9 , 8.9 , 8.9 , 8.9 , 8.9 ],
[ 8.4 , 7.36494141, 7.67531738, 8.47734985, 9.2 ],
[ 7.2 , 7.00979004, 7.62979736, 8.5517868 , 9.4 ],
[ 6.1 , 6.8 , 7.7 , 8.7 , 6.1 ]]),
array([[ 8.9 , 8.9 , 8.9 , 8.9 , 8.9 ],
[ 8.4 , 7.36494141, 7.67531738, 8.47734985, 9.2 ],
[ 7.2 , 7.00979004, 7.62979736, 8.5517868 , 9.4 ],
[ 6.1 , 6.8 , 7.7 , 8.7 , 6.1 ]])]
在附加UFK之前,必须设置它的维数,否则总是要多次复制同一个矩阵。以下代码可以正确生成输出:
另一种附加数组的方法是
UFK = np.vstack((UFK, UF))
,它将给出相同的结果。你知道吗UFK
现在应该是k
UF
数组的列表。你知道吗因为您正在覆盖
UF
的所有元素,所以它的初始化方式无关紧要,只要它不踩到其他数组,包括以前迭代中的UF
。你知道吗但进一步考虑,也许改变
UI
是计划的一部分。如果是这样,为什么要用UF
和UI
变量来掩盖事实呢?在这种情况下,您可以使用U.copy()
收集中间迭代—也就是说,将U
的副本保存到列表中,而不是U
本身。你知道吗列表包含指向对象的指针。如果我写
10000
将出现在列表的所有3个元素中-因为它们是相同的东西。你知道吗在您的代码中,将case
UF
添加到列表中,然后在每次迭代时修改它。结果是您的列表只包含指向同一数组的k
指针。你知道吗相关问题 更多 >
编程相关推荐