用于散热的 Python numpy 矢量化



我应该使用下面给出的有限差分公式编写一个代码来表示热扩散。

𝑢(𝑡)𝑖𝑗=(𝑢(𝑡−1)[𝑖+1,𝑗] + 𝑢(𝑡−1) [𝑖−1,𝑗] +𝑢(𝑡−1)[𝑖,𝑗+1] + 𝑢(𝑡−1)[𝑖,𝑗−1])/4该公式应该只产生时间步长为 1 的结果。因此,如果给出这样的数组:

100   100   100   100   100  
100    0     0     0    100  
100    0     0     0    100  
100    0     0     0    100  
100   100   100   100   100

时间步骤 1 的结果数组将是:

100   100   100   100   100  
100    50    25    50   100   
100    25     0    25   100  
100    50    25    50   100  
100   100   100   100   100

我知道使用 for 循环的表示形式如下,其中数组至少具有 2 行和 2 列作为前提条件:

h = np.copy(u)
for i in range(1,h.shape[0]-1):
for j in range (1, h.shape[1]-1):
num = u[i+1][j] + u[i-1][j] + u[i][j+1] + u[i][j-1]
h[i][j] = num/4

但是我无法弄清楚如何矢量化代码以表示热扩散。我应该使用 numpy 数组和矢量化,不允许用于任何类型的循环,我认为我应该依靠切片,但我无法弄清楚如何写出来并已经开始。

r, c = h.shape
if(c==2 or r==2):
return h

我敢肯定,如果行 = 2 或列 = 2,则数组将按原样返回,但如果我错了,请纠正我。任何帮助将不胜感激。谢谢!

尝试:

h[1:-1,1:-1] = (h[2:,1:-1] + h[:-2,1:-1] + h[1:-1,2:] + h[1:-1,:-2]) / 4

此解决方案在以下情况下使用切片:

  • 1:-1保留索引 1,2, ..., 最后 - 1
  • 2:入住 2, 3, ..., 最后
  • :-2停留 0, 1, ..., 最后 - 2

在每次迭代期间,仅更新内部元素(索引 1..LAST-1(

最新更新