Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 每次迭代计算后在matplotlib中实时更新pcolormesh绘图_Python_Matplotlib - Fatal编程技术网

Python 每次迭代计算后在matplotlib中实时更新pcolormesh绘图

Python 每次迭代计算后在matplotlib中实时更新pcolormesh绘图,python,matplotlib,Python,Matplotlib,我有以下用于求解2D热方程的python代码。我可以运行此代码进行一定次数的迭代并保存所有计算,然后使用FuncAnimation为迭代设置动画。然而,我更愿意做的是,根据初始条件创建一个初始图,然后在每次迭代后更新这个图。在下面的代码中,我可以做到这一点。但是,为了更新,我必须关闭每个图形,我正在寻找的是相同图形中代码的完整动画,而无需在每次集成后关闭每个图形。然后,我希望最后一个数字保持不变(不接近) 我目前的代码是: import numpy as np import matplotlib

我有以下用于求解2D热方程的python代码。我可以运行此代码进行一定次数的迭代并保存所有计算,然后使用FuncAnimation为迭代设置动画。然而,我更愿意做的是,根据初始条件创建一个初始图,然后在每次迭代后更新这个图。在下面的代码中,我可以做到这一点。但是,为了更新,我必须关闭每个图形,我正在寻找的是相同图形中代码的完整动画,而无需在每次集成后关闭每个图形。然后,我希望最后一个数字保持不变(不接近)

我目前的代码是:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.animation import FuncAnimation

plate_length = 50
max_iter = 25 

alpha = 2
delta_x = 1

delta_t = (delta_x ** 2)/(4 * alpha)
gamma = (alpha * delta_t) / (delta_x ** 2)

# Initialize solution: the grid of u(k, i, j)
u = np.empty((max_iter, plate_length, plate_length))

# Boundary conditions
u_top = 100.0
u_left = 0.0
u_bottom = 0.0
u_right = 0.0

# Set the initial condition
u.fill(0.)

# Set the boundary conditions
u[:, (plate_length-1):, :] = u_top
u[:, :, :1] = u_left
u[:, :1, 1:] = u_bottom
u[:, :, (plate_length-1):] = u_right

# Plot initial condition
cm = plt.pcolormesh(u[0], cmap=plt.cm.jet, vmin=0, vmax=100)
plt.show()

# Do the calculation here, update u for each k iteration
for k in range(0, max_iter, 1):
    for i in range(1, plate_length-1, delta_x):
        for j in range(1, plate_length-1, delta_x):
            u[k + 1, i, j] = u[k][i][j] + \
                             gamma * (u[k][i+1][j] + u[k][i-1][j] + \
                                      u[k][i][j+1] + u[k][i][j-1] - 4*u[k][i][j]) 

# Plot current value of u
    cm = plt.pcolormesh(u[k], cmap=plt.cm.jet, vmin=0, vmax=100)
    plt.show()
如果您能提供任何帮助,我们将不胜感激

谢谢,

几句话:

  • 为了提高计算效率,在计算扩散项时避免for循环(非常慢)。矢量化形式要快得多:
  • 找到一个使用它的代码
  • 注:对于大多数实际应用,时间步长“delta_t”必须更小,迭代次数“max_iter”必须比使用explicite时间步长方案时此处假设的要大得多。(使用隐式时间步进时会发生更改。)。因此,在u型阵列的k分量中保留每个时间步的结果仅适用于第一次试验
对于绘制中间结果,可能有不同的方法

(i) 仅绘制每个时间步mT,例如:

mT = 10
for k in range(max_iter):
   DU = ......
   u = u + DU
   if k % mT == 0:   # modulo-operator
       plot_uField(u)
(ii)在一个图中显示多个时间步:as或or

(iii)考虑带或带的动画(对于3D和动画,效率更高)。但是计算最终的视频可能很耗时


我希望这能给你一些想法。

我能够通过替换上面的代码来实现这一点

#绘制初始条件

有以下几点

# Plot initial condition
fig = plt.figure()

plt.pcolormesh(u[0], cmap=plt.cm.jet, vmin=0, vmax=100)
fig.canvas.draw()
plt.pause(0.01)

# Do the calculation here, update u for each k iteration
for k in range(0, max_iter-1, 1):
    for i in range(1, plate_length-1, delta_x):
        for j in range(1, plate_length-1, delta_x):
            u[k + 1, i, j] = u[k][i][j] + \
                             gamma * (u[k][i+1][j] + u[k][i-1][j] + \
                                      u[k][i][j+1] + u[k][i][j-1] - 4*u[k][i][j]) 

    plt.pcolormesh(u[k], cmap=plt.cm.jet, vmin=0, vmax=100)
    fig.canvas.draw()
    plt.pause(0.01)
    
plt.show()

这是一个很好的信息,将利用其中的许多评论。我的基本问题在你的陈述(i)中,也在我的“k”循环中的代码中,
cm=plt.pcolormesh(u[k],cmap=plt.cm.jet,vmin=0,vmax=100)
。我的问题是我不想关闭一个数字,然后弹出新的数字。我想要一个用新值“u”更新的数字。对于直线图,我只需声明
set_xdata
set_ydata
,我的图就会用当前数据更新。如何使用
pcolormesh
?我自己没有尝试过:在本例中,当您用cm=plt.pcolormesh(u[k],cmap=plt.cm.jet,vmin=0,vmax=100)替换()line 1,=ax.plot(x,y)时会发生什么?不幸的是,这只适用于线图,因为它使用set_xdata和setydata调用更新数据。如果pcolormesh有这样的东西就好了。请看酷!我在朱皮特试过。但它会生成k画布/图像