clc; clear; close all;
% Parâmetros do problema
dx = 0.2; % Passo espacial
a = 0.5; % Coeficiente de difusão
L = 1; % Comprimento da barra
% Passo de tempo máximo para estabilidade (CFL: r = alpha*dt/dx^2 <= 0.5)
dr = 0.5; % Critério de estabilidade para o método explícito
dt = dr * dx^2 / a;
% Exibir resultado do item (a)
fprintf('Passo de tempo máximo para estabilidade: dt = %.4f s\n', dt);
% Discretização espacial e temporal
x = 0:dx:L;
nx = length(x); % Número de pontos no espaço
tmax = 3 * dt; % Tempo máximo a ser calculado
nt = round(tmax/dt); % Número de passos de tempo
% Condições iniciais e de contorno
u = ones(nx, 1); % Condição inicial u(x,0) = 1
u(1) = 0; % Condição de contorno u(0,t) = 0
u(end) = 0; % Condição de contorno u(1,t) = 0
% Matriz para armazenar os resultados ao longo do tempo
U = zeros(nx, nt+1);
U(:,1) = u;
% Iteração no tempo (método explícito)
for n = 1:nt
u_new = u;
for i = 2:nx-1
u_new(i) = u(i) + dr * (u(i+1) - 2*u(i) + u(i-1));
end
u = u_new;
U(:,n+1) = u;
end
% Exibir resultados do item (b) para x = 0.6 e x = 0.8 nos três primeiros
tempos
idx_06 = find(abs(x - 0.6) < 1e-6);
idx_08 = find(abs(x - 0.8) < 1e-6);
fprintf('\nValores de u(x,t) para os três primeiros passos de tempo (método
explícito):\n');
for n = 1:3
fprintf('t = %.4f s: u(0.6,t) = %.4f, u(0.8,t) = %.4f\n', n*dt, U(idx_06,
n+1), U(idx_08, n+1));
end
% Método implícito (Matriz Tridiagonal)
r = a * dt / dx^2;
main_diag = (1 + 2*r) * ones(nx-2,1);
off_diag = -r * ones(nx-3,1);
A = diag(main_diag) + diag(off_diag,1) + diag(off_diag,-1);
% Inicializando solução
temp = ones(nx-2,1); % Considerando os pontos internos
U_implicit = zeros(nx, nt+1);
U_implicit(:,1) = u;
for n = 1:nt
temp = A \ temp;
U_implicit(2:end-1, n+1) = temp;
end
% Exibir resultados do item (c) para x = 0.6 e x = 0.8 nos três primeiros
tempos
fprintf('\nValores de u(x,t) para os três primeiros passos de tempo (método
implícito):\n');
for n = 1:3
fprintf('t = %.4f s: u(0.6,t) = %.4f, u(0.8,t) = %.4f\n', n*dt,
U_implicit(idx_06, n+1), U_implicit(idx_08, n+1));
end
% Geração do gráfico 3D
[T, X] = meshgrid(0:dt:tmax, x);
figure;
surf(T, X, U);
xlabel('Tempo (s)'); ylabel('Posição x'); zlabel('Temperatura u(x,t)');
title('Solução da Equação do Calor (Método Explícito)');
colorbar; shading interp;
figure;
surf(T, X, U_implicit);
xlabel('Tempo (s)'); ylabel('Posição x'); zlabel('Temperatura u(x,t)');
title('Solução da Equação do Calor (Método Implícito)');
colorbar; shading interp;
clc; clear; close all;
% Parâmetros do problema
dx = 0.2; % Passo espacial
a = 0.5; % Coeficiente de difusão
L = 1; % Comprimento da barra
% Passo de tempo máximo para estabilidade (CFL: r = alpha*dt/dx^2 <= 0.5)
dr = 0.5; % Critério de estabilidade para o método explícito
dt = dr * dx^2 / a;
% Exibir resultado do item (a)
fprintf('Passo de tempo máximo para estabilidade: dt = %.4f s\n', dt);
% Discretização espacial e temporal
x = 0:dx:L;
nx = length(x); % Número de pontos no espaço
tmax = 3 * dt; % Tempo máximo a ser calculado
nt = round(tmax/dt); % Número de passos de tempo
% Condições iniciais e de contorno
u = ones(nx, 1); % Condição inicial u(x,0) = 1
u(1) = 0; % Condição de contorno u(0,t) = 0
u(end) = 0; % Condição de contorno u(1,t) = 0
% Matriz para armazenar os resultados ao longo do tempo
U = zeros(nx, nt+1);
U(:,1) = u;
% Iteração no tempo (método explícito)
for n = 1:nt
u_new = u;
for i = 2:nx-1
u_new(i) = u(i) + dr * (u(i+1) - 2*u(i) + u(i-1));
end
u = u_new;
U(:,n+1) = u;
end
% Exibir resultados do item (b) para x = 0.6 e x = 0.8 nos três primeiros
tempos
idx_06 = find(abs(x - 0.6) < 1e-6);
idx_08 = find(abs(x - 0.8) < 1e-6);
fprintf('\nValores de u(x,t) para os três primeiros passos de tempo
(método explícito):\n');
for n = 1:3
fprintf('t = %.4f s: u(0.6,t) = %.4f, u(0.8,t) = %.4f\n', n*dt, U(idx_06,
n+1), U(idx_08, n+1));
end
% Método implícito (Matriz Tridiagonal)
r = a * dt / dx^2;
main_diag = (1 + 2*r) * ones(nx-2,1);
off_diag = -r * ones(nx-3,1);
A = diag(main_diag) + diag(off_diag,1) + diag(off_diag,-1);
% Inicializando solução
temp = ones(nx-2,1); % Considerando os pontos internos
U_implicit = zeros(nx, nt+1);
U_implicit(:,1) = u;
for n = 1:nt
temp = A \ temp;
U_implicit(2:end-1, n+1) = temp;
end
% Exibir resultados do item (c) para x = 0.6 e x = 0.8 nos três primeiros
tempos
fprintf('\nValores de u(x,t) para os três primeiros passos de tempo
(método implícito):\n');
for n = 1:3
fprintf('t = %.4f s: u(0.6,t) = %.4f, u(0.8,t) = %.4f\n', n*dt,
U_implicit(idx_06, n+1), U_implicit(idx_08, n+1));
end
% Geração do gráfico 3D
[T, X] = meshgrid(0:dt:tmax, x);
figure;
surf(T, X, U);
xlabel('Tempo (s)'); ylabel('Posição x'); zlabel('Temperatura u(x,t)');
title('Solução da Equação do Calor (Método Explícito)');
colorbar; shading interp;
figure;
surf(T, X, U_implicit);
xlabel('Tempo (s)'); ylabel('Posição x'); zlabel('Temperatura u(x,t)');
title('Solução da Equação do Calor (Método Implícito)');
colorbar; shading interp;