matlab練習程序(差分法解二維熱傳導方程)


上一篇實現了一維熱傳導方程數值解,這一篇實現二維熱傳導方程數值解。

套路是一樣的,先列微分方程,再改為差分方程,然后遞推求解,不同的是一維熱傳導需要三維顯示,而二維熱傳導需要四維,因此最后做了個三維動態圖。

二維熱傳導方程如下:

另外四條邊界都是0。

寫成差分方程為:

整理一下就能得到u(i+1,j,k)。

matlab代碼如下:

clear all;close all;clc;

t = 0.03;       %時間范圍,計算到0.03秒
x = 1;y = 1;    %空間范圍,0-1米
m = 320;        %時間t方向分320個格子
n = 32;         %空間x方向分32個格子
k = 32;         %空間y方向分32個格子
ht = t/(m-1);   %時間步長dt
hx = x/(n-1);   %空間步長dx
hy = y/(k-1);   %空間步長dy

u = zeros(m,n,k);

%設置邊界
[x,y] = meshgrid(0:hx:1,0:hy:1);
u(1,:,:) = sin(4*pi*x)+cos(4*pi*y);

%按照公式進行差分
for ii=1:m-1
    for jj=2:n-1
        for kk=2:k-1
            u(ii+1,jj,kk) = ht*(u(ii,jj+1,kk)+u(ii,jj-1,kk)-2*u(ii,jj,kk))/hx^2 + ...
                ht*(u(ii,jj,kk+1)+u(ii,jj,kk-1)-2*u(ii,jj,kk))/hy^2 + u(ii,jj,kk);
        end
    end
end

for i=1:200
    figure(1);
    mesh(x,y,reshape(u(i,:,:),[n k]));
    axis([0 1 0 1 -2 2]);
    
%     F=getframe(gcf);
%     I=frame2im(F);
%     [I,map]=rgb2ind(I,256); 
%     if i == 1
%         imwrite(I,map,'test.gif','gif','Loopcount',inf,'DelayTime',0.05);
%     else
%         imwrite(I,map,'test.gif','gif','WriteMode','append','DelayTime',0.05);    
%     end
end

結果如下:

三維熱傳導用差分法也可以解,不過不太容易可視化,就不再實現了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM