2013-04-14 83 views
0

我试图通过数值求解热方程,并使用颜色映射实时显示解决方案。不管怎样,地图中的颜色都没有更新。是什么原因?这是代码:matplotlib imshow未更新

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) 
+1

你是什么意思“地图中的颜色”?你想改变彩条的限制吗? – tacaswell

+1

这段代码似乎对我来说工作得很好,我看到随着时间的推移,这个环传播并且很酷。 – tacaswell

+0

在任何齿我想看到不同地区的温度按颜色(较冷区域,较暗的颜色)。现在,不仅颜色条的限制不会改变(我不希望它改变),而且颜色在模拟过程中根本不会改变。如果某个点的T值从100变为10,我预计该区域的颜色会发生变化,但不会发生。从开始到结束都是一样的红色。但是,如果我创建了2个不同的情节,没有动画,一个在开始和一个在结尾,可以注意到两者之间的颜色差异。 – user1767774

回答

1

比较左,右:

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),) 
+0

非常感谢! ( - : – user1767774

+0

@ user1767774你是否充分理清了这一点? – tacaswell

1

如果你想要的颜色条代表改变动画的每一帧的范围,然后修改您的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) 
+0

谢谢!我如何更新地图中的颜色,而不更新颜色条?我想在整个模拟过程中保持相同的颜色范围。 – user1767774

+1

你必须创建你自己的色彩地图。查看pydoc中的matplotlib.colors.LinearSegmentedColormap并在StackOverflow上参考[http://stackoverflow.com/questions/9893440/python-matplotlib-colormap](here)。您可以使用上面的AxesImage实例的set_cmap方法来指定颜色映射。 – mtadd