我应该使用下面给出的有限差分公式编写一个代码来表示热扩散。
𝑢(𝑡)𝑖𝑗=(𝑢(𝑡−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, ..., 最后 - 12:
入住 2, 3, ..., 最后:-2
停留 0, 1, ..., 最后 - 2
在每次迭代期间,仅更新内部元素(索引 1..LAST-1(