存储从两个for循环中计算出来的矩阵(添加列表不起作用)

2024-04-19 04:05:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实现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       ]])]

Tags: theinui列表forrange矩阵array
2条回答

在附加UFK之前,必须设置它的维数,否则总是要多次复制同一个矩阵。以下代码可以正确生成输出:

UFK = np.array([]).reshape(0,5)
k = 0
while k < 3:
    k += 1
    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
    UFK = np.append(UFK, UF, axis=0)

另一种附加数组的方法是UFK = np.vstack((UFK, UF)),它将给出相同的结果。你知道吗

UI=U  # why?  UI is not a copy of U, it IS U
# UF=U  # another why?  Changes of UF will change UI and U as well
UFK=[]    # appending to a list is great
k=0
while k<3:
    k=k+1 # update the iteration counter
    UF = np.zeros_like(U)  # a fresh copy for iteration
    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 
    UFK.append(UF) # 
    print (UF) 
print(UFK)

UFK现在应该是kUF数组的列表。你知道吗

因为您正在覆盖UF的所有元素,所以它的初始化方式无关紧要,只要它不踩到其他数组,包括以前迭代中的UF。你知道吗

但进一步考虑,也许改变UI是计划的一部分。如果是这样,为什么要用UFUI变量来掩盖事实呢?在这种情况下,您可以使用U.copy()收集中间迭代—也就是说,将U的副本保存到列表中,而不是U本身。你知道吗

for i... :
   for j....:
        U[j,i] = (U[j+1,i]+U[j,i+1]+U[j-1,i]+U[j,i-1])*0.25 
UFK.append(U.copy())
print (U)

列表包含指向对象的指针。如果我写

alist = [U, U, U]
U[0,0] = 10000

10000将出现在列表的所有3个元素中-因为它们是相同的东西。你知道吗

在您的代码中,将caseUF添加到列表中,然后在每次迭代时修改它。结果是您的列表只包含指向同一数组的k指针。你知道吗

相关问题 更多 >