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