Você está na página 1de 27

UNIVERSIDADE ESTADUAL DE CAMPINAS

FACULDADE DE ENGENHARIA MECÂNICA

EM503 - Introdução aos Métodos Numéricos Aplicados à


Engenharias - Prof. Calos Henrique Daros
Projeto Computacional 1

Caio Brait - 238420

CAMPINAS
2023
SUMÁRIO

1 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 DESENVOLVIMENTO . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1 Solução analítica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Solução numérica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Analise de erro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3 ANÁLISES E CONCLUSÕES . . . . . . . . . . . . . . . . . . . . . . . 15

4 ANEXOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.1 Anexo A - Código em MATLAB com a calculo da solução de Regime . . 16
4.2 Anexo B - Código em MATLAB com implementação do Solver ’pdepe’ . 17
4.3 Anexo C - Código em MATLAB com solução utilizando o método de
Euler Regressivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.4 Anexo D - Código em MATLAB com a anália de erro . . . . . . . . . . . 22

5 REFERENCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3

1 INTRODUÇÃO

A transferência de calor desempenha um papel fundamental em inúmeras aplicações,


desde sistemas de resfriamento de motores até processos de aquecimento industrial. A compre-
ensão e resolução de problemas relacionados à transferência de calor são cruciais para otimizar a
eficiência de sistemas térmicos complexos.
Este relatório concentra-se na investigação e resolução de um problema específico de
transferência de calor em uma barra. A barra em questão possui um comprimento l e é isolada
ao longo de seu comprimento, permitindo que o calor flua apenas para dentro ou para fora das
extremidades, mas não através do contorno lateral. Inicialmente, a barra é mantida à temperatura
T0 . Em t = 0, as extremidades esquerda e direita da barra são submetidas a temperaturas T1
e T2 , respectivamente, e mantidas nessas temperaturas para todos os tempos subsequentes. A
barra possui uma fonte interna de calor com variação senoidal no espaço ao longo do tempo. O
Problema de Valor de Contorno inicial pode ser resumido da seguinte forma:

Figura 1 – Esquema do problema a ser resolvido.

Para abordar esse desafio, utilizaremos métodos analíticos e numéricos, incluindo a


implementação do Método de Euler Regressivo no ambiente de programação MATLAB, bem
como o uso do solver incorporado do MATLAB.
O principal objetivo deste estudo é realizar análises de estabilidade numérica e precisão
numérica do Método de Euler implícito, considerando diferentes valores para os passos de tempo
e intervalos de espaço. Além disso, este relatório visa uma comparação detalhada entre a solução
analítica e os resultados obtidos por meio da solução numérica.
Para iniciar a abordagem do problema, realizaremos uma análise preliminar do desafio
em questão. O problema é descrito pela seguinte equação de transferência de calor:

ut = α 2 uxx + sin(x), 0 ≤ x ≤ l, 0≤t ≤∞

Juntamente com as condições iniciais:


Capítulo 1. Introdução 4

u(x, 0) = T0 , u(0,t) = T1 , u(l,t) = T2 .

Os valores numéricos usados para os parâmetros são: α 2 = 0, 1 m2 /s, l = 30 m, T0 =


10◦ C, T1 = 20◦ C e T2 = 40◦ C.
É importante destacar que o problema em questão envolve uma Equação Diferencial
Parcial linear não homogênea com coeficientes constantes e condições de contorno de Dirichlet
em ambas as extremidades. Com essa compreensão, podemos prosseguir para a resolução efetiva
do problema.
5

2 DESENVOLVIMENTO

2.1 Solução analítica


O primeiro passo na análise proposta envolve o cálculo da solução analítica, que será
utilizada como referência para a análise de erro do problema. Esta solução de referência será
obtida por meio do pacote "pdepe"do MATLAB para a solução transiente do problema. Já para a
solução de regime, será realizada analiticamente pelo pacote simbólico do MATLAB.
Embora o pacote "pdepe"não calcule a solução exata para a Equação Diferencial Parcial
(EDP), a solução numérica gerada por ele é altamente precisa. Portanto, essa solução numérica
será adotada como a solução analítica de referência para fins deste estudo. Essa abordagem será
usada porque a EDP a ser resolvida não é homogênea, o que torna muito difícil obter a solução
analítica para o regime transiente. Além disso, a aplicação do método de separação de variáveis
seria inviável, sendo necessário recorrer a métodos mais sofisticados, como a transformada de
Fourier, que estão fora do escopo do curso.
A solução de regime pode ser deduzida facilmente. Partindo da EDP que rege o problema,
podemos considerar a derivada parcial temporal nula, uma vez que, para tempos muito longos, a
solução não dependerá do tempo. Assim, podemos simplificar a EDP para a seguinte EDO:

d 2 u(x)
α + sen(x) = 0 (2.1)
dx2
A EDO acima pode ser facilmente resolvida com o pacote simbólico do MATLAB e
obter o seguinte perfil:
assim obtemos que a solução de regime permenete é:

sin(30◦ ) 2
 
u(x) = 10 sin(x) − x − + 20 (2.2)
3 3

NOTA: o código utilizado para a obtenção da equação 2.2 e da figura 2 está anexado ao
relatório como Anexo A.
Capítulo 2. Desenvolvimento 6

Figura 2 – Solução de regime utilizando o Solver do MATLAB.

Partindo para a resolução utilizando o pacote pdepe, ao analisarmos 5000 segundos com
um intervalo de 100 segundos entre cada solução, e com uma discretização espacial de 500
pontos (o domínio do problema foi dividido em 500 intervalos), obtemos a seguinte superfície:

Figura 3 – Solução da EDP utilizando o Solver do MATLAB.

Visualizando em 2D para facilitar a interpretação, podemos observar a progressão tem-


poral da distribuição de temperatura no plano da seguinte maneira:
Capítulo 2. Desenvolvimento 7

Figura 4 – Evolução temporal da EDP utilizando o Solver do MATLAB.

Podemos observar que, no tempo 0, ocorrem "saltos"nas extremidades devido às con-


dições de contorno e à condição inicial extremamente forçada. À medida que o tempo avança,
notamos que as condições de contorno são mantidas em todos os momentos, e o perfil senoidal
da solução gradualmente se inclina em direção a uma reta que "cruza"as duas condições de
contorno. Esse resultado é altamente coerente com o que intuitivamente esperávamos.
NOTA: o código utilizado para a obtenção das figuras 3 e 4 está anexado ao relatório
como Anexo B.

2.2 Solução numérica


O segundo passo da análise consiste na implementação da solução numérica utilizando o
método de Euler Implicitado, permitindo assim a posterior comparação entre as duas soluções.
Iniciamos discretizando a Equação Diferencial Parcial (EDP) utilizando diferenças finitas regres-
sivas para a primeira derivada no tempo e diferenças finitas centrais para a segunda derivada no
espaço.

∂u 2
2∂ u
=α + sin(x) (2.3)
∂t ∂ x2
Discretiza-se o tempo (t) em incrementos ∆t e o espaço (x) em incrementos ∆x. Utiliza-se
j
a notação ui para representar o valor de u no ponto xi e no tempo t j .
Primeiro, discretizamos a derivada em relação ao tempo usando diferenças finitas regres-
sivas:

j+1 j
∂ u ui − ui
≈ (2.4)
∂t ∆t
Capítulo 2. Desenvolvimento 8

Em seguida, discretizamos a segunda derivada em relação ao espaço usando diferenças


finitas centrais:

j+1 j+1 j+1


∂ 2 u ui−1 − 2ui + ui+1
≈ (2.5)
∂ x2 (∆x)2

Agora, substituímos essas discretizações na equação original:

j+1 j j+1 j+1 j+1


ui − ui u − 2ui + ui+1
= α 2 i−1 + sin(xi ) (2.6)
∆t (∆x)2
j+1
Isolando ui (o próximo valor de u no tempo) na equação:

j+1 j α 2 ∆t j+1 j+1 j+1


ui = ui + (u − 2ui + ui+1 ) + ∆t sin(xi ) (2.7)
(∆x)2 i−1

α 2 ∆t
É possível montar o conjunto de n − 1 equações na seguinte forma, onde r = (∆x)2
.

    
j+1 j
1 + 2r −r 0 0 ··· 0 u1 u1 + ∆t sin(x1 ) + ru0
   j+1   j 
 −r 1 + 2r −r 0 ··· 0  u2 + ∆t sin(x2 )
  u2  
   
 
j+1  j
 0
 −r 1 + 2r −r · · · 0   u3  = 
   u3 + ∆t sin(x3 ) 
 (2.8)
 . . . . . .  .   . 
 .. .. .. .. .. ..   ..   .. 
    
j+1 j
0 0 0 0 −r 1 + 2r un−1 un−2 + ∆t sin(xn−1 ) + run

j+1 j+1
Nesse sistema de equações, u1 até un−1 representam os valores de u nos pontos internos
j+1 j+1
no espaço no tempo t j+1 , enquanto u0 e un são as condições de contorno conhecidas nos
pontos x0 e xn para qualquer tempo.
A solução desse sistema é encontrada iterativamente para calcular os valores de u em
todos os pontos internos no espaço no próximo passo de tempo t j+1 . Esse método é chamado
de método implícito no espaço devido à dependência do ponto espacia atual do ponto futuro no
espaço.
Ao iniciar a implementação em MATLAB, foi definido os valores numéricos relevantes,
temperatura no contorno e de condição inicial, comprimento da barra, difusividade térmica e os
passos temporais e espaciais necessários para o problema.
Em seguida, foi inicializado os vetores de solução do problema e implementado o
método iterativo, criando um loop de iterações no tempo com o comando "for". Dentro desse
loop, definimos uma matriz "A"tridiagonal para os coeficientes usando o comando "tridiag"e
uma matriz "B"para os termos independentes, que são atualizados a cada iteração do loop. A
matriz "u", representando a solução, foi ajustada de acordo com as condições de contorno.
Capítulo 2. Desenvolvimento 9

Figura 5 – Implementação do Método de Euler Regressivo

Posteriormente, foi plotada uma superfície 3D e o avanço temporal da temperatura como


uma série de curvas 2D utilizando os mesmos parâmetros adotados com o solver pdepe (5000
segundos com um intervalo de 100 segundos entre cada solução e uma discretização espacial de
500 pontos). Observar os resultados:

Figura 6 – Solução do Método de Euler Regressivo


Capítulo 2. Desenvolvimento 10

Figura 7 – Progressão temporal do Método de Euler Regressivo

NOTA: o código script para a obtenção das figuras 2.2 e da figura 2 está anexado ao
relatório como Anexo C.
Em uma breve análise qualitativa, é notável que ambas as curvas estão condizentes com
a curva de referência calculada pelos métodos analíticos e pelo solver "pdepe". É possível notar
que, para o tempo zero, observa-se descontinuidades em ambas as extremidades e a progressiva
inclinação do perfil senoidal em direção à reta que "cruza"as duas condições de contorno. Isso é
um forte indicativo de que a solução foi implementada corretamente.
Tendo implementado corretamente, é possível analisar a estabilidade do método. Para
isso, basta variar o parâmetro r e observar o resultado, pois esse parâmetro, no método de Euler
Progressivo, é o que garante a estabilidade. O método é considerado estável quando r ≤ 0, 5.
É notável que, para os resultados calculados anteriormente, r = 1.3889e + 03, e o método se
mostrou muito estável. Isso significa que, mesmo com passos temporais elevados, o método
permaneceu estável com uma malha espacial não muito refinada.
Caso diminuíssemos ainda mais o refinamento da malha espacial de 500 (como calculado
anteriormente) para 50, obteríamos um valor de r = 13.8889. Observa-se:
Capítulo 2. Desenvolvimento 11

Figura 8 – Solução do Método de Euler Regressivo (r = 13.8889)

Figura 9 – Progressão temporal do Método de Euler Regressivo (r = 13.8889)

É notável que, para o novo resultado, há uma diminuição na resolução dos resultados, mas
ainda assim, os resultados capturam bem o perfil esperado, sem nenhuma degradação absurda
dos resultados em nenhum ponto.
Capítulo 2. Desenvolvimento 12

Diminuindo ainda mais a discretização espacial, de 50 para 10, e aumentando o número


de pontos calculados no tempo, de 100 para 250, de modo a forçar o parâmetro r a adquirir um
valor de r = 0.2222, obtemos:

Figura 10 – Solução do Método de Euler Regressivo (r = 0.2222)

Figura 11 – Progressão temporal do Método de Euler Regressivo (r = 0.2222)

Novamente, o único efeito observado foi uma resolução mais pobre dos resultados, mas
sem nenhuma degeneração devido a acúmulos exponenciais de erro ("explosão"da solução) em
nenhum ponto. Portanto, como esperado, é possível observar que o método é incondicionalmente
estável, o que se deve ao fato de ser um método implícito.

2.3 Analise de erro


Antes de tudo, é importante ressaltar que é esperado que a ordem de erro do método
seja O(∆x2 ) para o espaço e O(∆t) para o tempo, devido à discretização por elementos finitos
adotada para o método. No espaço, utilizam-se diferenças finitas centradas, enquanto no tempo,
empregam-se diferenças finitas regressivas.
Capítulo 2. Desenvolvimento 13

Ao implementar ambas as soluções, a Euler Regressiva e o solver “pdepe,” e calcular a


norma 2 ponto a ponto, além de comparar a ultima solução temporal calculada e com a solução
de regime obtida, obténs-se os seguintes gráficos:

Figura 12 – gráfico do erro, diferença absoluta entre as duas soluções

Figura 13 – gráfico da progressão da diferença absoluta entre as duas soluções

Figura 14 – norma 2 do erro entre soluções numéricas e solução de regime

Nos dois gráficos que comparam as soluções numéricas, observa-se uma grande diferença
nos resultados na primeira iteração. Isso pode ser atribuído à maior precisão do solver do
Capítulo 2. Desenvolvimento 14

MATLAB, que consegue suavizar a solução de forma mais eficaz nos primeiros momentos,
especialmente devido às abruptas descontinuidades presentes nas condições de contorno e iniciais
do problema. O método de Euler Regressivo, por ser uma implementação menos sofisticada,
encontra dificuldades em suavizar essas descontinuidades abruptas, o que afeta de forma mais
significativa o início da solução.
Nos passos de tempo subsequentes, observamos que a diferença entre os dois métodos
tende a diminuir. Isso ocorre porque a solução se aproxima do regime permanente, apresentando
pouca variação ao longo de grandes intervalos de tempo. Além disso, no âmbito espacial, as
soluções mostram uma menor divergência conforme se aproximam das extremidades, devido às
condições de contorno conhecidas e inequívocas em ambas as extremidades.
Ao comparar a solução analítica de regime com ambos os métodos numéricos, podemos
observar novamente que a solução é mais precisa próximo às extremidades à medida que nos
aproximamos das condições de contorno. Além disso, a precisão de ambos os métodos é muito
semelhante para tempos muito longos, como no caso da imagem acima, com 5000 segundos,
embora o solver do MATLAB tenha demonstrado ser ligeiramente mais preciso.
NOTA: o código para a obtenção das figuras 12, 13 e 14 está anexado ao relatório como
Anexo D.
15

3 ANÁLISES E CONCLUSÕES

Em conclusão, é notável que o método de Euler regressivo se destaca por sua incondicio-
nal estabilidade, o que significa que não importa o tamanho dos passos no tempo ou no espaço, a
solução não apresentará oscilações indesejadas ou divergências. Essa característica é de extrema
importância ao lidar com problemas complexos que demandam uma ampla gama de resoluções
temporais e espaciais. A estabilidade incondicional oferece uma grande flexibilidade na escolha
dos parâmetros de discretização, tornando o método uma escolha sólida em diversas aplicações.
Além disso, é essencial ressaltar que o método de Euler regressivo oferece uma precisão
aceitável, com erros de ordem O(∆x2 ) no espaço e O(∆t) no tempo. Isso significa que, embora
possa haver alguma perda de resolução ao usar discretizações mais grosseiras, os resultados
ainda são confiáveis e aproximam-se bem da solução exata. Essa capacidade de manter um
nível aceitável de precisão, mesmo com discretizações menos refinadas, faz com que o método
seja uma ferramenta valiosa, especialmente em cenários onde a eficiência computacional é uma
consideração importante. Portanto, o método de Euler regressivo se destaca não apenas por sua
estabilidade incondicional, mas também pela sua capacidade de fornecer resultados confiáveis
com eficiência computacional, tornando-o uma escolha sólida para uma variedade de problemas
de análise numérica.
16

4 ANEXOS

4.1 Anexo A - Código em MATLAB com a calculo da solução


de Regime

clc;
clear all;
close all;

T1 = 20;
T2 = 40;
L = 30;
alpha = 0.1;
% Definindo variáveis simbólicas
syms u(x)

Du = diff(u);
% Definindo a equação diferencial
ode = diff(u,x,2) == -sin(x)/alpha;

% Condições de contorno
cond1 = u(0) == T1;
cond2 = u(L) == T2;
conds = [cond1 cond2];

% Resolvendo a equação diferencial com as condições de contorno


uSol(x) = dsolve(ode,conds);
uSol = simplify(uSol)

% Valores de x para os quais queremos plotar a solução


x_values = linspace(0, L, 1000); % Aqui, usei 1000 pontos no intervalo [0, L]

% Avaliando a solução em x_values


u_values = double(subs(uSol, x, x_values)); % Convertendo para valores numéricos

% Plotando a solução
Capítulo 4. Anexos 17

figure;
plot(x_values, u_values, ’b’, ’LineWidth’, 2);
title(’Solução da Equação Diferencial’);
xlabel(’x’);
ylabel(’Temperatura(x)’);
grid on;

4.2 Anexo B - Código em MATLAB com implementação do


Solver ’pdepe’

%clc; clear all; close all;

% Parâmetros
global T0 T1 T2 k; % Declare as variáveis como globais
k = 0.1; % Coeficiente de difusão (alpha^2)
L = 30; % Comprimento do domínio
T0 = 10; % Condição inicial
T1 = 20; % Condição de contorno em x = 0
T2 = 40; % Condição de contorno em x = l
num_points_x = 500; % Número de pontos no espaço
num_points_t = 100; % Número de pontos no tempo
total_time = 5000; % Tempo total
num_curves = 20; % Número de curvas desejadas no gráfico 2D

% Defina o domínio espacial


x = linspace(0, L, num_points_x); % Discretização do domínio espacial
m = 0; % Modo espacial, pode ser alterado se necessário

% Defina o intervalo de tempo


tspan = linspace(0, total_time, num_points_t); % Discretização do domínio de tempo

% Resolva a equação diferencial parcial


sol = pdepe(m, @heat_eqn, @heat_ic, @heat_bc, x, tspan);

u1 = sol; %armazenando os resultados para posterior comparaçao

% Plote a solução 3D
Capítulo 4. Anexos 18

figure;
mesh(x, tspan, sol(:,:,1));
xlabel(’Posição (x)’);
ylabel(’Tempo (t)’);
zlabel(’Temperatura (u)’);
title(’Solução da Equação de Calor 1D (3D)’);
view(45, 45);

% Defina as cores para as curvas 2D


colors = jet(num_curves); % Defina o número de cores para curvas

% Plote as curvas 2D da progressão temporal da temperatura


figure;

curve_step = floor(num_points_t / num_curves); % Passo para selecionar curvas

for i = 1:curve_step:num_points_t
u = sol(i,:,1);
color_index = max(1, round(i/curve_step)); % Garante que o índice de cores sej
plot(x, u, ’Color’, colors(color_index,:)); % Use cores diferentes
hold on;
end

xlabel(’Posição (x)’);
ylabel(’Temperatura (u)’);
title(’Progressão Temporal da Temperatura no Domínio (2D)’);
legend(arrayfun(@(t) sprintf(’t = %.2f’, t), tspan(1:curve_step:num_points_t), ’Uni
hold off;

% Crie uma figura para a animação


animation_fig = figure;

% Defina as cores para as curvas 2D


colors = jet(num_curves); % Defina o número de cores para curvas

% Loop para animação


for i = 1:num_points_t
u = sol(i,:,1);
color_index = min(num_curves, max(1, round((i / num_points_t) * num_curves)));
Capítulo 4. Anexos 19

plot(x, u, ’Color’, colors(color_index,:)); % Use cores diferentes


xlabel(’Posição (x)’);
ylabel(’Temperatura (u)’);
title(’Progressão Temporal da Temperatura no Domínio (2D)’);
legend(sprintf(’t = %.2f’, tspan(i)), ’Location’, ’NorthEast’);
axis([0 L min(sol(:)) 60]); % Ajuste os limites do eixo y para acompanhar a ani
drawnow; % Atualize a figura
pause(0.01); % Pausa para controlar a taxa de animação (ajuste conforme necessá

% Salvar cada quadro como imagem (opcional)


%saveas(animation_fig, sprintf(’frame_%04d.png’, i));
end

% Feche a figura de animação ao final (opcional)


% close(animation_fig);

function [c, f, s] = heat_eqn(x, t, u_x, dudx)


global k;
c = 1;
f = k * dudx;
s = sin(x);
end

function u0 = heat_ic(x)
global T0;
u0 = T0;
end

function [pl, ql, pr, qr] = heat_bc(xl, ul, xr, ur, t)


global T1 T2;
pl = ul - T1; % Condição de contorno em x = 0
ql = 0;
pr = ur - T2; % Condição de contorno em x = l
qr = 0;
end
Capítulo 4. Anexos 20

4.3 Anexo C - Código em MATLAB com solução utilizando o


método de Euler Regressivo

clc; clear all; close all;

% Parâmetros da solução numérica


T0 = 10; % Temperatura inicial da barra
T1 = 20; % Temperatura da extremidade esquerda
T2 = 40; % Temperatura da extremidade direita
L = 30; % Comprimento da barra
total_time = 5000; % Intervalo de tempo
num_points_x = 500; % Número de pontos no espaço
num_points_t = 100; % Número de pontos no tempo
k = 0.1; % Coeficiente de difusão (alpha^2)
num_curves = 20; % Número de curvas desejadas no gráfico 2D

% Discretização
dx = L / num_points_x; % Passo de espaço
dt = total_time / num_points_t; % Passo de tempo
x = linspace(0, L, num_points_x+1)’; % Vetor de posição
tspan = linspace(0, total_time, num_points_t+1); % Vetor de tempo
alpha = k * dt/(dx^2);

% Condições Iniciais e de Contorno da solução numérica


u0 = T0 * ones(num_points_x+1, 1); % Condição inicial
u0(1) = T1; % Condição de contorno em x = 0
u0(end) = T2; % Condição de contorno em x = L

% Inicialização da matriz de solução da solução numérica


u = zeros(num_points_x+1, num_points_t+1);
u(:,1) = u0; % Condição inicial

% Aplicação do método de Euler regressivo


for n = 1:num_points_t
A = eye(num_points_x-1) + alpha* gallery(’tridiag’, num_points_x-1, -1, 2, -1);
B = u(2:end-1,n) + dt .* sin(x(2:end-1)); % Termo não homogêneo
B(1) = B(1) + alpha*T1;
B(end) = B(end) + alpha*T2;
u(2:end-1,n+1) = A \ B;
Capítulo 4. Anexos 21

% Aplicação das condições de contorno


u(1,n+1) = 20; % Condição de contorno em x = 0
u(end,n+1) = 40; % Condição de contorno em x = L
end

u2 = u; %armazenando os resultados para posterior comparaçao

% Crie o vetor ’x’ após a discretização


x = linspace(0, L, num_points_x+1)’;

% Redefina X e T usando meshgrid, mas ajuste as dimensões


[X, T] = meshgrid(x, tspan);

% Redimensione as matrizes X e T para ter as mesmas dimensões que u


X = X’;
T = T’;

% Plot 3D da evolução temporal


figure;
surf(X, T, u);
title(’Evolução Temporal da Solução pelo método de Euler Regressivo 3D’);
xlabel(’Posição (x)’);
ylabel(’Tempo (t)’);
zlabel(’Temperatura (T)’);
view(45, 45);

% Plot 2D da solução numérica


figure;
hold on;

curve_step = floor(num_points_t / num_curves); % Passo para selecionar curvas

for n = 1:curve_step:num_points_t+1
plot(x, u(:,n), ’DisplayName’, [’Tempo t = ’, num2str(tspan(n))]);
end

xlabel(’Posição (x)’);
ylabel(’Temperatura (T)’);
Capítulo 4. Anexos 22

title(’Evolução Temporal da Solução pelo método de Euler Regressivo 2D’);


legend(’show’);

hold off;

% Preparação para a animação


animation_fig = figure;
colors = jet(num_curves); % Defina o número de cores para as curvas

% Loop para a animação


for n = 1:num_points_t

% Plote a temperatura atualizada na figura da animação


figure(animation_fig);
clf; % Limpe a figura antes de plotar a próxima frame
plot(x, u(:,n+1), ’Color’, colors(1,:), ’DisplayName’, sprintf(’t = %.2f’, tspa
xlabel(’Posição (x)’);
ylabel(’Temperatura (u)’);
title(’Progressão Temporal da Temperatura no Domínio (2D)’);
legend(’show’);
axis([0 L 0 60]); % Ajuste os limites do eixo y conforme necessário
drawnow; % Atualize a figura
pause(0.01); % Pausa para controlar a taxa de animação (ajuste conforme necessá

% Salvar cada quadro como imagem (opcional)


% saveas(animation_fig, sprintf(’frame_%04d.png’, n));
end

4.4 Anexo D - Código em MATLAB com a anália de erro

clc; clear all; close all;

% Parâmetros
global T0 T1 T2 k; % Declare as variáveis como globais
k = 0.1; % Coeficiente de difusão (alpha^2)
L = 30; % Comprimento do domínio
T0 = 10; % Condição inicial
Capítulo 4. Anexos 23

T1 = 20; % Condição de contorno em x = 0


T2 = 40; % Condição de contorno em x = L
num_points_x = 500; % Número de pontos no espaço
num_points_t = 100; % Número de pontos no tempo
total_time = 5000; % Tempo total
num_curves = 20; % Número de curvas desejadas no gráfico 2D

% Defina o domínio espacial


x = linspace(0, L, num_points_x+1); % Discretização do domínio espacial
m = 0; % Modo espacial,( cooredenadas cartesianas, cilindricas ou esfericas)

% Defina o intervalo de tempo


tspan = linspace(0, total_time, num_points_t); % Discretização do domínio de tempo

% Resolva a equação diferencial parcial com o pdepe


sol1 = pdepe(m, @heat_eqn, @heat_ic, @heat_bc, x, tspan);

% Discretização do método de Euler Regressivo


dx2 = L / num_points_x;
dt2 = total_time / num_points_t;
x2 = linspace(0, L, num_points_x+1)’;
tspan2 = linspace(0, total_time, num_points_t+1);
alpha2 = k * dt2/(dx2^2);

% Condições Iniciais e de Contorno do método de Euler Regressivo


u0_2 = T0 * ones(num_points_x+1, 1);
u0_2(1) = T1;
u0_2(end) = T2;

% Inicialização da matriz de solução do método de Euler Regressivo


u2 = zeros(num_points_x+1, num_points_t+1);
u2(:,1) = u0_2;

% Aplicação do método de Euler regressivo


for n = 1:num_points_t
A = eye(num_points_x-1) + alpha2* gallery(’tridiag’, num_points_x-1, -1, 2, -1)
B = u2(2:end-1,n) + dt2 .* sin(x2(2:end-1));
B(1) = B(1) + alpha2*T1;
B(end) = B(end) + alpha2*T2;
Capítulo 4. Anexos 24

u2(2:end-1,n+1) = A \ B;

% Aplicação das condições de contorno


u2(1,n+1) = 20; % Condição de contorno em x = 0
u2(end,n+1) = 40; % Condição de contorno em x = L
end

% Calcule a norma L2 da diferença ponto a ponto entre as duas soluções


norm_diff = zeros(num_points_t, num_points_x+1);

for i = 1:num_points_t
for j = 1:num_points_x+1
diff = sol1(i,j,1) - u2(j,i+1);
norm_diff(i,j) = sqrt(diff^2);
end
end

% Plote o gráfico 3D da norma L2 da diferença


[X, T] = meshgrid(x, tspan);

figure;
mesh(X, T, norm_diff);
xlabel(’Posição (x)’);
ylabel(’Tempo (t)’);
zlabel(’Norma L2 da Diferença’);
title(’Norma L2 da Diferença entre as Soluções’);
view(45, 45);

% Ajuste os limites do eixo z para variar de 0 a 16


zlim([0, 30]);

% Calcule o erro ponto a ponto entre as duas soluções


error = zeros(num_points_x+1, num_points_t);

for n = 1:num_points_t
for j = 1:num_points_x+1
error(j, n) = abs(sol1(n, j, 1) - u2(j, n+1));
end
end
Capítulo 4. Anexos 25

% Plote várias curvas 2D mostrando a evolução temporal do erro ao longo do espaço


figure;
hold on;

curve_step = floor(num_points_t / num_curves); % Passo para selecionar curvas

for i = 1:curve_step:num_points_t
plot(x, error(:,i), ’DisplayName’, [’Tempo t = ’, num2str(tspan(i))]);
end

xlabel(’Posição (x)’);
ylabel(’Erro’);
title(’Evolução do Erro entre as Soluções em Função do Espaço’);
legend(’show’);

hold off;

% Calcular a curva analítica uSol(x)


uSol = 10*sin(x) - x*(sin(30)/3 - 2/3) + 20;

% Cálculo dos erros ponto a ponto para Euler Regressivo e pdepe


error_euler = abs(u2(:, end) - uSol’);
error_pdepe = abs(sol1(end,:,1)’ - uSol’);

% Calcule a norma L2 do erro ao longo da posição x


norma_erro_euler = sqrt(sum(error_euler.^2, 2));
norma_erro_pdepe = sqrt(sum(error_pdepe.^2, 2));

% Plote a norma L2 do erro ao longo da posição x


figure;
plot(x, norma_erro_euler, ’b’, ’DisplayName’, ’Euler Regressivo’);
hold on;
plot(x, norma_erro_pdepe, ’r’, ’DisplayName’, ’pdepe’);
xlabel(’Posição (x)’);
ylabel(’Norma L2 do Erro’);
title(’Norma L2 do Erro entre a Última Solução Numérica e a Solução Analítica ao Lo
legend(’show’);
Capítulo 4. Anexos 26

grid on;

% Funções para a equação de calor e condições de contorno


function [c, f, s] = heat_eqn(x, t, u_x, dudx)
global k;
c = 1;
f = k * dudx;
s = sin(x);
end

function u0 = heat_ic(x)
global T0;
u0 = T0;
end

function [pl, ql, pr, qr] = heat_bc(xl, ul, xr, ur, t)


global T1 T2;
pl = ul - T1;
ql = 0;
pr = ur - T2;
qr = 0;
end
27

5 REFERENCIAS

MathWorks. Pdepe. Disponível em: <https://www.mathworks.com/help/matlab/ref/pdepe.


html>. Acesso em:25 setembro de 2023.
DAROS, Carlos Henrique. Aula 5 - EM503 – Introdução aos Métodos Numéricos em
Engenharia. 2023. Disponível em: <https://moodle.ggte.unicamp.br/pluginfile.php/3757637/
mod_resource/content/1/aula5_EM503moodle.pdf>.Acesso em:20 setembro de 2023.
INCROPERA, F. P.; DEWITT, D. P.; BERGMAN, T. L.; LAVINE, A. S. Fundamentos
da Transferência de Calor e Massa. 6ª ed. Rio de Janeiro: LTC, 2008.
COLEMAN, M. P. An Introduction to Partial Differential Equations with MATLAB. 2.
ed. Boca Raton: CRC Press, 2013.

Você também pode gostar