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;%时间步
%给网格点编号,定义边界
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代码主要实现了二维非稳态导热问题的数值模拟,并对模拟结果进行可视化展示。下面详细介绍代码的功能:

1. 初始化参数

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;%时间步
  • 清除命令窗口、工作区变量并关闭所有图形窗口。
  • 定义了二维区域的尺寸(xlengthylength)、导温系数 a、网格数目(nxny)、总时间 t 和时间步长数目 nt,并计算了单个网格长度(deltaxdeltay)以及时间步长 deltat

2. 计算相关参数并判断稳定性

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 判断数值解是否稳定。

3. 初始化温度场

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 和边界温度(TtopTleftTrightTbottom)。
  • 通过三重循环,根据网格点的位置设置初始温度场,边界点设置为相应的边界温度,内部点设置为初始内热源温度。

4. 迭代求解温度场

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
  • 使用显式差分格式对内部网格点的温度进行迭代更新,直到达到总时间步数。

5. 可视化结果

初始时刻温度分布
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 函数绘制温度场随时间变化的三维动画,展示非稳态导热过程。

综上所述,该代码通过有限差分法模拟了二维非稳态导热问题,并将初始时刻、最终时刻的温度分布以及温度场随时间的变化进行了可视化展示。

你可能感兴趣的:(算法,matlab,matlab,算法,开发语言)