clc;
clear all;
close all;
xlength=1;%x方向长度
ylength=1;%y方向长度
a=1e-4;%导温系数
nx=15;%x方向网格数目
ny=15;%y方向网格数目
deltax=xlength/nx;%x方向单个网格长度
deltay=ylength/ny;%y方向单个网格长度
t=1600;%总时间
nt=150;%时间步长
deltat=t/nt;%时间步
%给网格点编号,定义边界
n=((xlength/deltax)+1)^2;%点的数目
m=xlength/deltax+1;%行上的点数目或者是列上的点数目
r=(t/deltat)+1;%时间步数目
Fo=a*deltat/deltax^2;%网格Fo数
if Fo<0.25
disp('有稳定解');
else
disp('解发生震荡');
end
T=zeros(m,m,r);
Ti=200;%初始内热源温度;
Ttop=100;%顶部温度
Tleft=100;%左边温度
Tright=100;%右边温度
Tbottom=100;%底部温度
Tmax=max([Ttop,Tleft,Tbottom,Ti]);
for k=1:r
for i=1:m
for j=1:m
if(i==1)&&(j==1)
T(i,j,k)=(Tbottom+Tleft)/2;
elseif(i==1)&&(j==m)
T(i,j,k)=(Ttop+Tleft)/2;
elseif(i==m)&&(j==m)
T(i,j,k)=(Ttop+Tright)/2;
elseif(i==m)&&(j==1)
T(i,j,k)=(Tbottom+Tright)/2;
elseif(i==1)&&(j>1&&j<m)
T(i,j,k)=Tleft;
elseif(i==m)&&(j>1&&j<m)
T(i,j,k)=Tright;
elseif(j==m)&&(i>1&&i<m)
T(i,j,k)=Ttop;
elseif(j==1)&&(i>1&&i<m)
T(i,j,k)=Tbottom;
else
T(i,j,k)=Ti;
end
end
end
end
for k=1:r-1
for i=2:m-1
for j=2:m-1
T(i,j,k+1)=T(i,j,k)+Fo*(T(i+1,j,k)+T(i-1,j,k)+T(i,j+1,k)+T(i,j-1,k)-4.*T(i,j,k));
end
end
end
figure(1)
Tinistial=imagesc(T(:,:,1));colorbar
title(['Temperature Profile','time(t)=',num2str(0),'s','Ttop=',num2str(Ttop),'^oC'])
set(gca,'xtick',[]);
xlabel(['Tbottom=',num2str(Tbottom),'^oC'])
yyaxis left
set(gca,'ytick',[]);
ylabel(['Tleft=',num2str(Tleft),'^oC'])
yyaxis right
set(gca,'ytick',[]);
ylabel(['Tright=',num2str(Tright),'^oC'])
figure(2)
%Tfinal=imagesc(T(:,:,r));colorbar;shading interp;
Tfinal=pcolor(T(:,:,r));colorbar;shading interp;
title(['Temperature Profile','time(t)=',num2str(0),'s','Ttop=',num2str(Ttop),'^oC'])
set(gca,'xtick',[]);
xlabel(['Tbottom=',num2str(Tbottom),'^oC'])
yyaxis left
set(gca,'ytick',[]);
ylabel(['Tleft=',num2str(Tleft),'^oC'])
yyaxis right
set(gca,'ytick',[]);
ylabel(['Tright=',num2str(Tright),'^oC']);
figure(3)
x=1:m;
y=1:m;
for k=1:r
h=surf(x,y,T(:,:,1));colormap(jet);shading interp;colorbar;
axis([0 m 0 m 0 Tmax]);%坐标设计长宽高的范围
title({['非稳态/瞬态导热'];['time(t)=',num2str((k-1)*deltat),'s']});colorbar;
drawnow;pause(0.0001);
refreshdata(h);
if k~=r
T(:,:,1)=T(:,:,k+1);
else
break;
end
end
这段MATLAB代码主要实现了二维非稳态导热问题的数值模拟,并对模拟结果进行可视化展示。下面详细介绍代码的功能:
clc;
clear all;
close all;
xlength=1;%x方向长度
ylength=1;%y方向长度
a=1e-4;%导温系数
nx=15;%x方向网格数目
ny=15;%y方向网格数目
deltax=xlength/nx;%x方向单个网格长度
deltay=ylength/ny;%y方向单个网格长度
t=1600;%总时间
nt=150;%时间步长
deltat=t/nt;%时间步
xlength
和 ylength
)、导温系数 a
、网格数目(nx
和 ny
)、总时间 t
和时间步长数目 nt
,并计算了单个网格长度(deltax
和 deltay
)以及时间步长 deltat
。n=((xlength/deltax)+1)^2;%点的数目
m=xlength/deltax+1;%行上的点数目或者是列上的点数目
r=(t/deltat)+1;%时间步数目
Fo=a*deltat/deltax^2;%网格Fo数
if Fo<0.25
disp('有稳定解');
else
disp('解发生震荡');
end
n
、每行(列)的网格点数 m
和时间步数 r
。Fo
,并根据 Fo
是否小于 0.25 判断数值解是否稳定。T=zeros(m,m,r);
Ti=200;%初始内热源温度;
Ttop=100;%顶部温度
Tleft=100;%左边温度
Tright=100;%右边温度
Tbottom=100;%底部温度
Tmax=max([Ttop,Tleft,Tbottom,Ti]);
for k=1:r
for i=1:m
for j=1:m
if(i==1)&&(j==1)
T(i,j,k)=(Tbottom+Tleft)/2;
elseif(i==1)&&(j==m)
T(i,j,k)=(Ttop+Tleft)/2;
elseif(i==m)&&(j==m)
T(i,j,k)=(Ttop+Tright)/2;
elseif(i==m)&&(j==1)
T(i,j,k)=(Tbottom+Tright)/2;
elseif(i==1)&&(j>1&&j<m)
T(i,j,k)=Tleft;
elseif(i==m)&&(j>1&&j<m)
T(i,j,k)=Tright;
elseif(j==m)&&(i>1&&i<m)
T(i,j,k)=Ttop;
elseif(j==1)&&(i>1&&i<m)
T(i,j,k)=Tbottom;
else
T(i,j,k)=Ti;
end
end
end
end
T
,用于存储不同时刻每个网格点的温度。Ti
和边界温度(Ttop
、Tleft
、Tright
、Tbottom
)。for k=1:r-1
for i=2:m-1
for j=2:m-1
T(i,j,k+1)=T(i,j,k)+Fo*(T(i+1,j,k)+T(i-1,j,k)+T(i,j+1,k)+T(i,j-1,k)-4.*T(i,j,k));
end
end
end
figure(1)
Tinistial=imagesc(T(:,:,1));colorbar
title(['Temperature Profile','time(t)=',num2str(0),'s','Ttop=',num2str(Ttop),'^oC'])
set(gca,'xtick',[]);
xlabel(['Tbottom=',num2str(Tbottom),'^oC'])
yyaxis left
set(gca,'ytick',[]);
ylabel(['Tleft=',num2str(Tleft),'^oC'])
yyaxis right
set(gca,'ytick',[]);
ylabel(['Tright=',num2str(Tright),'^oC'])
imagesc
函数绘制初始时刻(t = 0
)的温度分布图像,并添加颜色条和标题。figure(2)
Tfinal=pcolor(T(:,:,r));colorbar;shading interp;
title(['Temperature Profile','time(t)=',num2str(0),'s','Ttop=',num2str(Ttop),'^oC'])
set(gca,'xtick',[]);
xlabel(['Tbottom=',num2str(Tbottom),'^oC'])
yyaxis left
set(gca,'ytick',[]);
ylabel(['Tleft=',num2str(Tleft),'^oC'])
yyaxis right
set(gca,'ytick',[]);
ylabel(['Tright=',num2str(Tright),'^oC']);
pcolor
函数绘制最终时刻的温度分布图像,并添加颜色条和标题。figure(3)
x=1:m;
y=1:m;
for k=1:r
h=surf(x,y,T(:,:,1));colormap(jet);shading interp;colorbar;
axis([0 m 0 m 0 Tmax]);%坐标设计长宽高的范围
title({['非稳态/瞬态导热'];['time(t)=',num2str((k-1)*deltat),'s']});colorbar;
drawnow;pause(0.0001);
refreshdata(h);
if k~=r
T(:,:,1)=T(:,:,k+1);
else
break;
end
end
surf
函数绘制温度场随时间变化的三维动画,展示非稳态导热过程。综上所述,该代码通过有限差分法模拟了二维非稳态导热问题,并将初始时刻、最终时刻的温度分布以及温度场随时间的变化进行了可视化展示。