我正在尝试数值求解热方程,并使用颜色映射实时可视化解决方案。但是,贴图中的颜色不会更新。原因何在?代码如下:
from __future__ import division
from pylab import *
dx, dy = 0.01, 0.01
D = 0.01
dx2, dy2 = dx**2 ,dy**2
dt = (dx2*dy2)/(2*D*(dx2+dy2))
endt = 0.1
Nt = int (endt/dt)
endX,endY = 1,1
nx, ny = int(endX/dx), int(endY/dy)
T = zeros([nx,ny])
Tcopy = zeros([nx,ny])
"""initial conditions"""
for i in range(nx):
for j in range(ny):
if( ((i*dx - 0.5)**2 +(j*dy - 0.5)**2 < 0.1) and ((i*dx - 0.5)**2 +(j*dy - 0.5)**2 >0.05) ):
T[i][j] = 10
def integrate(T,Tcopy):
T[1:-1, 1:-1] = Tcopy[1:-1, 1:-1] + D*dt*( (Tcopy[2:, 1:-1] - 2*Tcopy[1:-1, 1:-1] + T[:-2, 1:-1])/dx2 + (Tcopy[1:-1, 2:] - 2*Tcopy[1:-1, 1:-1] + T[1:-1, :-2])/dy2 )
Tcopy = copy(T)
return Tcopy,T
x = arange(0, endX, dx)
y = arange(0, endY, dy)
X,Y = meshgrid(x, y)
"""creating the plot"""
fig, ax_lst = plt.subplots(1, 1)
im = ax_lst.imshow(T, interpolation='nearest',
origin='bottom',
aspect='auto',
vmin=np.min(T),
vmax=np.max(T),
cmap='hot',extent=[0,1,0,1])
fig.colorbar(im)
"""main loop"""
for t in range(Nt):
im.set_data(T)
plt.draw()
plt.pause(0.1)
Tcopy,T = integrate(T,Tcopy)发布于 2013-04-14 12:41:04
比较左边和右边:
from __future__ import division
from pylab import *
dx, dy = 0.01, 0.01
D = 0.01
dx2, dy2 = dx**2 ,dy**2
dt = (dx2*dy2)/(2*D*(dx2+dy2))
endt = 0.1
Nt = int (endt/dt)
endX,endY = 1,1
nx, ny = int(endX/dx), int(endY/dy)
T = zeros([nx,ny])
Tcopy = zeros([nx,ny])
"""initial conditions"""
for i in range(nx):
for j in range(ny):
if( ((i*dx - 0.5)**2 +(j*dy - 0.5)**2 < 0.1) and ((i*dx - 0.5)**2 +(j*dy - 0.5)**2 >0.05) ):
T[i][j] = 10
def integrate(T,Tcopy):
T[1:-1, 1:-1] = Tcopy[1:-1, 1:-1] + D*dt*( (Tcopy[2:, 1:-1] - 2*Tcopy[1:-1, 1:-1] + T[:-2, 1:-1])/dx2 + (Tcopy[1:-1, 2:] - 2*Tcopy[1:-1, 1:-1] + T[1:-1, :-2])/dy2 )
Tcopy = copy(T)
return Tcopy,T
x = arange(0, endX, dx)
y = arange(0, endY, dy)
X,Y = meshgrid(x, y)
"""creating the plot"""
fig, ax_lst = plt.subplots(1, 2)
ax_lst[0].imshow(T, interpolation='nearest',
origin='bottom',
aspect='auto',
vmin=np.min(T),
vmax=np.max(T),
cmap='hot',extent=[0,1,0,1])
im = ax_lst[1].imshow(T, interpolation='nearest',
origin='bottom',
aspect='auto',
vmin=np.min(T),
vmax=np.max(T),
cmap='hot',extent=[0,1,0,1])
fig.colorbar(im)
"""main loop"""
for t in range(Nt):
im.set_data(T)
plt.draw()
plt.pause(0.1)
Tcopy,T = integrate(T,Tcopy)
print np.mean(T), np.max(T), np.min(T)颜色在变化(至少在我的机器上是这样),只是它足够微妙,很难看清。
您可能还想尝试使用对数刻度
im = ax_lst.imshow(T, interpolation='nearest',
origin='bottom',
aspect='auto',
vmin=np.min(T) + .01, # so 0 doesn't blow up the log
vmax=np.max(T),
cmap='hot',extent=[0,1,0,1],
norm=matplotlib.colors.LogNorm(clip=True),)发布于 2013-04-14 12:18:21
如果希望颜色栏表示的范围更改动画的每一帧,请按如下所示修改for循环:
for t in range(Nt):
im.set_data(T)
im.set_clim(T.min(),T.max())
plt.draw()
plt.pause(0.1)
Tcopy,T = integrate(T,Tcopy)https://stackoverflow.com/questions/15995644
复制相似问题