Info

This question is closed. Reopen it to edit or answer.

Numerical solution to heat equation using FTCS

1 view (last 30 days)
Hi,
I expect that error should increase as final time T increases but opposite is happening:
Norm of error = 1.1194e-003 at T = 0.9
dt = 0.02
Norm of error = 1.5872e-006 at T = 2
dt = 0.02
Norm of error = 4.9910e-012 at T = 4
dt = 0.02
I have checked my code several times but cannot figure out what is wrong. The code follows:
function [errout, ue] = heatFTCS(dt, nx, k, L, T, errPlots)
% heatFTCS solves 1D heat equation with the FTCS scheme
% Input: dt - step size in time
% nx - number of lattice points
% k - thermal diffusivity
% L - length of space
% T - final time
% errPlots - flag for plotting results
% Output: errout - error in the numerical solution
% ue - exact solution
% Set default input arguments
if nargin < 1, dt = 0.02; end
if nargin < 2, nx = 11; end
if nargin < 3, k = 1/6; end
if nargin < 4, L = 1; end
if nargin < 5, T = 4.0; end
if nargin < 6, errPlots = 0; end
% determine space grid size, number of time steps and some intermediate values
dx = L/(nx-1);
nt = ceil(T/dt + 1);
r = k*(dt/dx^2);
if r > 0.5
fprintf('\nr = %g, solution may not converge',r);
end
% create spatial grid and initialize numerical solution
x = linspace(0, L, nx)';
U = zeros(nx, nt);
% Set initial and boundary conditions
U(:,1) = sin(2*pi*x/L);
U(1,:) = 0; U(nx,:) = 0;
% employ numerical scheme
for m = 2 : nt
for i = 2 : nx-1
U(i,m) = r*U(i-1, m-1) + (1 - 2*r)*U(i, m-1) + r*U(i+1, m-1);
end
end
% Evaluate exact solution and absolute error
u = sin(2*pi*x/L)*exp(-4*k*(pi/L)^2*T);
err = abs(U(:,nt) - u);
% Specify output arguments, print and plot results
if nargout > 0, errout = err; end
if nargout > 1, ue = u; end
fprintf('\nNorm of error = %12.4e at T = %g\n', norm(err), T);
fprintf('dt = %g\n', dt);
if ~errPlots, return; end
clf reset;
subplot(2,1,1)
plot(x, U(:,nt), '-', x,u, 'o');
legend('FTCS (U)','Exact (u)');
xlabel(sprintf('\\fontname{math}x'),'fontsize',10);
title(sprintf('Numerical (FTCS) vs Exact solution, \\fontname{math}T = %g, dt = %g\n',T,dt),'fontsize',10)
subplot(2,1,2)
plot(x, err,'--r');
xlabel(sprintf('\\fontname{math}x'),'fontsize',10); ylabel(sprintf('\\fontname{math}U - u'),'fontsize',10);
title(sprintf('Error in numerical scheme, \\fontname{math}T = %g, dt = %g\n',T,dt),'fontsize',10)
Thank you!
  2 Comments
Tom
Tom on 8 Sep 2012
Edited: Tom on 8 Sep 2012
Why would you expect the error to increase? As far as I can see, you've started with a sinusoidal distribution (symmetric, average being zero), and you're letting it diffuse without any boundary conditions. From this, you'd expect everything to reach a uniform temperature of zero.

Answers (0)

This question is closed.

Tags

Products

Community Treasure Hunt

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

Start Hunting!