Can someone help me with this Matlab code on 2D heat equation

10 vues (au cours des 30 derniers jours)
Eshna Sasha
Eshna Sasha le 2 Avr 2021
Commenté : Eshna Sasha le 2 Avr 2021
I want to plot the temperature contour for the equation ∂T/∂t = ∂2T/∂x2 + ∂2T/∂y2,
The initial condition is taken to be t=0
It throws an error: Index in position 1 exceeds array bounds (must not exceed 1).
Here's my code:
>> nx=10;
>> ny=nx;
>> nt=100;
>> x=linspace(0,1,nx);
>> y=linspace(0,1,ny);
>> dx=x(2)-x(1);
>> dy=dx;
>> error=9e9;
>> tolerance=1e-4;
>> dt=1e-3;
>> T_L=0;
>> T_T=1;
>> T_R=0;
>> T_B=0;
>> T=300*ones(nx,ny);
>> T(2:ny-1,1)= T_L;
>> T(2:ny-1,nx)=T_R;
>> T(1,2:nx-1)=T_T;
>> T(ny,2:nx-1)=T_B;
>> T_old= T;
>> T_initial=0;
>> k1=1.1*(dt/(dx^2));
>> k2=1.1*(dt/(dy^2));
>> Jacobi_iteration=1;
>> for k= 1:nt
error=9e9;
while(error>tolerance)
for i=2:nx-1
for j= 2:ny-1
Term_1= 1/(1+(2*k1)+(2*k2));
Term_2= k1*Term_1;
Term_3= k2*Term_1;
H= (T_old(i-1,j))+(T_old(i+1,j));
V=(T_old(i,j+1))+(T_old(i,j-1));
T(i,j)= (T_initial(i,j)*Term_1)+ (H*Term_2)+(V*Term_3);
end
end
error=max(max(abs(T_old-T)));
T_old=T;
Jacobi_iteration= Jacobi_iteration+1;
end
T_intial=0;
%Plotting
figure(1)
contourf(x,y,T)
clabel(contourf(x,y,T))
colobar
colormap(jet)
set(gca,'ydir','reverse')
xlabel('X-Axis')
y-label('Y-Axis')
title(sprintf('No. of Unsteady Jacobi Iterations(Implicit)=%d', Jacobi_iteration));
pause(0.03)
end

Réponse acceptée

Ravi Kumar
Ravi Kumar le 2 Avr 2021
Your T_initial is declared as a scalar, you are getting the error when you try to index into it beyond its size. Make that zeros of same size as T. You will find the corrected code below. On a related note, if you want to solve more general problems, check PDE Toolbox Heat Transfer workflow.
Regards,
Ravi
nx=10;
ny=nx;
nt=100;
x=linspace(0,1,nx);
y=linspace(0,1,ny);
dx=x(2)-x(1);
dy=dx;
error=9e9;
tolerance=1e-4;
dt=1e-3;
T_L=0;
T_T=1;
T_R=0;
T_B=0;
T=300*ones(nx,ny);
T(2:ny-1,1)= T_L;
T(2:ny-1,nx)=T_R;
T(1,2:nx-1)=T_T;
T(ny,2:nx-1)=T_B;
T_old= T;
T_initial=zeros(size(T));
k1=1.1*(dt/(dx^2));
k2=1.1*(dt/(dy^2));
Jacobi_iteration=1;
for k= 1:nt
error=9e9;
while(error>tolerance)
for i=2:nx-1
for j= 2:ny-1
Term_1= 1/(1+(2*k1)+(2*k2));
Term_2= k1*Term_1;
Term_3= k2*Term_1;
H= (T_old(i-1,j))+(T_old(i+1,j));
V=(T_old(i,j+1))+(T_old(i,j-1));
T(i,j)= (T_initial(i,j)*Term_1)+ (H*Term_2)+(V*Term_3);
end
end
error=max(max(abs(T_old-T)));
T_old=T;
Jacobi_iteration= Jacobi_iteration+1;
end
T_intial=0;
%Plotting
figure(1)
contourf(x,y,T)
clabel(contourf(x,y,T))
colorbar
colormap(jet)
set(gca,'ydir','reverse')
xlabel('X-Axis')
ylabel('Y-Axis')
title(sprintf('No. of Unsteady Jacobi Iterations(Implicit)=%d', Jacobi_iteration));
pause(0.03)
end
  1 commentaire
Eshna Sasha
Eshna Sasha le 2 Avr 2021
A big thank you for the code. But after conducting 102 Jacobi iterations, I get this. Something is wrong for my case. Is it because of this? T=300*ones(nx,ny);

Connectez-vous pour commenter.

Plus de réponses (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by