Buscar

ATIVIDADE COMPLETA DE SIMULAÇÃO EQUAÇÕES DIFERENCIAIS

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 92 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 92 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 92 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Análise e Simulação de Processos:
Relatório da Atividade II
Florianópolis
Sumário
1 Problema 1 5
1.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 Problema 2 9
2.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3 Problema 3 13
3.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.1 Item a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.2 Item b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3.1 Item a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3.2 Item b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4 Problema 4 17
4.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5 Problema 5 20
5.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
6 Problema 6 23
6.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.2 Resolução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
7 Problema 7 25
7.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
7.2 Resolução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
7.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
8 Problema 8 28
8.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
8.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
8.2.1 Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
8.2.2 Resolução - Euler . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
8.2.3 Resolução - Runge-Kutta . . . . . . . . . . . . . . . . . . . . . . . 30
8.2.4 Resolução - Solver . . . . . . . . . . . . . . . . . . . . . . . . . . 31
1
8.3 Item c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
8.3.1 Resolução - Euler . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
8.3.2 Resolução - Runge-Kutta . . . . . . . . . . . . . . . . . . . . . . . 33
8.3.3 Resolução - Solver . . . . . . . . . . . . . . . . . . . . . . . . . . 34
8.4 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
8.4.1 Item b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
8.4.2 Item c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9 Problema 9 41
9.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
9.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
9.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
10 Problema 10 43
10.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
10.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
10.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
11 Problema 11 46
11.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
11.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
11.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
12 Problema 12 49
12.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
12.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
12.2.1 Método de Euler . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
12.2.2 Método de Runge-Kutta . . . . . . . . . . . . . . . . . . . . . . . 50
12.2.3 Solver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
12.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
13 Problema 13 53
13.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
13.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
13.2.1 Efeito de cada termo na equação . . . . . . . . . . . . . . . . . . 55
13.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
13.3.1 Problema principal . . . . . . . . . . . . . . . . . . . . . . . . . . 56
13.3.2 Fast Fourier Transform (FFT) . . . . . . . . . . . . . . . . . . . . 58
14 Problema 14 60
14.1 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
14.2 Item a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
14.2.1 Solução estacionária . . . . . . . . . . . . . . . . . . . . . . . . . 61
14.2.2 Solução transiente . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
14.2.3 Item d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
14.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
14.3.1 Solução transiente - Sistema I . . . . . . . . . . . . . . . . . . . . 66
14.3.2 Solução transiente - Sistema I . . . . . . . . . . . . . . . . . . . . 67
14.3.3 Solução estacionária - Sistema I . . . . . . . . . . . . . . . . . . . 68
2
14.3.4 Solução estacionária - Sistema II . . . . . . . . . . . . . . . . . . 70
15 Problema 15 72
15.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
15.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
15.2.1 Quantidade inicial: (3 ; 1) . . . . . . . . . . . . . . . . . . . . . . 72
15.2.2 Quantidade inicial: (7 ; 4) . . . . . . . . . . . . . . . . . . . . . . 73
15.2.3 Quantidade inicial: (5 ; 2) . . . . . . . . . . . . . . . . . . . . . . 73
15.2.4 Quantidade inicial: (5,01 ; 2) . . . . . . . . . . . . . . . . . . . . 74
15.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
16 Problema 16 76
16.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
16.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
16.2.1 Item a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
16.2.2 Items b e c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
16.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
17 Problema 17 79
17.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
17.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
17.3 Código associado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
18 Problema 18 86
18.1 Enunciado do problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
18.2 Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3
Introdução
Na tentativa de descrever os fenômenos f́ısicos presentes no mundo, é muito comum
deparar-se com equações diferenciais. Na verdade, praticamente tudo que observamos
no nosso dia-a-dia ou em situações extraordinárias, em todos os lugarese em todas as
escalas de grandeza, é definido através deste tipo de equação.
Na engenharia de processos não poderia ser diferente. Desta forma, é de fundamental
importância que o engenheiro tenha conhecimento e domı́nio de diversas metodologias de
resolução para estes problemas.
Neste trabalho, são resolvidos dezoito problemas selecionados de equações diferenciais
aplicadas à engenharia de processos. A ferramenta computacional utilizada foi Python
3.8.5 (default, Jul 28 2020, 12:59:40). Os códigos foram executados no sistema ope-
racional Ubuntu 20.04.1 LTS. As bibliotecas Matplotlib 3.3.1 (gráficos), Numpy 1.19.1
(manipulação de arrays) e Scipy 1.5.3 (computação cient́ıfica) foram utilizadas. Como
biblioteca auxiliar, foi utilizada a TikzPlotLib, que converte gráficos do Matplotlib para
LATEX.
4
1 Problema 1
1.1 Enunciado do problema
Um balanço de massa para um composto qúımico em um reator de mistura pode ser
escrito como
V
dc
dt
= F −Qc− kV c2
onde V é o volume (12 m3), c é a concentração (g/m3), F é a taxa de alimentação
(175 g/min), Q é a vazão (1 m3/min) e k é uma taxa de reação de segunda ordem
(0, 15 m3/g/min). Se c(0) = 0, resolva a EDO até que a concentração atinja um ńıvel
estável. Utilize o método de Euler expĺıcito e o método de Runge-Kutta de quarta ordem
para resolver este problema.
Desafio: se ignorarmos o fato de que as concentrações devem ser positivas, encontre
um intervalo de condições iniciais tal que você obteria uma trajetória muito diferente da
que foi obtida com c(0) = 0. Relacione seus resultados com as soluções estacionárias.
1.2 Solução
Para o problema proposto, a resolução da equação diferencial ordinária é apresentada
na Figura 1.1, com uma discretização que considera um espaçamento de 0, 1 min na
dimensão do tempo.
0 0.5 1 1.5 2 2.5
0
2
4
6
8
10
Tempo (min)
C
on
ce
n
tr
aç
ão
(g
/m
3
)
Euler Expĺıcito
Runge Kutta 4ª Ordem
Figura 1.1: Solução do problema 1 através do método de Euler expĺıcito e do método de
Runge-Kutta de quarta ordem.
As curvas estão suficientemente próximas, especialmente nas regiões lineares do gráfico.
Considera-se o resutado obtido pelo método de Runge-Kutta de quarta ordem mais
confiável devido ao número de parâmetros calculados para obtenção de um dado ponto.
Resposta ao desafio:
5
A solução estacionária para o problema é
F −Qc− kV c2 = 0.
Este polinômio em c tem duas soluções. Naturalmente, uma delas é a encontrada na
resolução gráfica. Para encontrar a outra, basta utilizar a fórmula de Baskhara para a
equação, que fornece:
c2 =
−Q+
√
Q2 + 4kFV
−2kV
= −10, 14 g/m3
Utilizando o valor desta solução estacionária como chute inicial e resolvendo a equação
diferencial ordinária com o método de Runge-Kutta de quarta ordem, obtém-se a solução
da Figura 1.2.
0 0.5 1 1.5 2 2.5
−10.6
−10.4
−10.2
−10
−9.8
−9.6
Tempo (min)
C
on
ce
n
tr
aç
ão
(g
/m
3
)
Figura 1.2: Solução do desafio do problema 1.
1.3 Código associado
1 # @Author: eduardo
2 # @Date: 2020-11-06T22:22:00-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T01:48:01-02:00
5
6
7 import numpy as np
8 import matplotlib.pyplot as plt
9 import euler_explicito
10 import RK_4
11
12 # Parâmetros do problema
6
13
14 V = 12 # m^3
15 F = 175 # g/min
16 Q = 1 # m^3/min
17 k = 0.15 # m^3/g/min
18 c0 = 0 # concentraç~ao inicial
19 dt = 0.1 # stepsize no tempo
20
21 # EDO a ser resolvida
22
23 def dcdt(t, c):
24 dcdt = 1 / V * (F - Q * c - k * V * c ** 2)
25 return dcdt
26
27 # Resoluç~ao
28
29 t_RK, c_RK = RK_4.RK_4(0, 2.5, c0, dt, dcdt)
30 t_euler, c_euler = euler_explicito.Euler(0, 2.5, c0, dt, dcdt)
31
32 # Plot
33
34 plt.plot(t_euler, c_euler, color="#E00650", label="Euler Explı́cito")
35 plt.plot(t_RK, c_RK, color="#2D2E7B", label="Runge Kutta 4ª Ordem")
36 plt.xlabel("Tempo (min)")
37 plt.ylabel("Concentraç~ao ($g/m^3$)")
38 plt.xlim(0, 2.5)
39 plt.ylim(0, 10)
40 plt.legend()
41 plt.grid()
42 plt.show()
1 # @Author: eduardo
2 # @Date: 2020-11-06T22:22:00-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T01:10:04-02:00
5
6 import numpy as np
7 import matplotlib.pyplot as plt
8 import euler_explicito
9 import RK_4
10
11 # Parâmetros do problema
12
13 V = 12 # m^3
14 F = 175 # g/min
15 Q = 1 # m^3/min
16 k = 0.15 # m^3/g/min
7
17 c0 = -10.141822724758168 # concentraç~ao inicial
18 dt = 0.5 # stepsize no tempo
19
20
21 def dcdt(t, c):
22 dcdt = 1 / V * (F - Q * c - k * V * c**2)
23 return dcdt
24
25
26 t_RK, c_RK = RK_4.RK_4(0, 2.5, c0, dt, dcdt)
27 t_euler, c_euler = euler_explicito.Euler(0, 2.5, c0, dt, dcdt)
28
29 plt.plot(t_euler, c_euler, color="#E00650", label="Euler Explı́cito")
30 plt.plot(t_RK, c_RK, color="#2D2E7B", label="Runge Kutta 4ª Ordem")
31 plt.xlabel("Tempo (min)")
32 plt.ylabel("Concentraç~ao ($g/m^3$)")
33 plt.xlim(0, 2.5)
34 plt.grid()
35 plt.show()
8
2 Problema 2
2.1 Enunciado do problema
Se cin = cb(1− e−0,12t), calcule a concentração no escoamento de sáıda de uma substância
conservativa (sem reações) para um único tanque de mistura como uma função do tempo.
Utilize o método de Euler expĺıcito, o método de Runge-Kutta de quarta ordem e um
solver adequado para fazer os cálculos. Use os valores de cb = 40 mg/m
3, Q = 6 m3/min,
V = 100 m3 e c0 = 20 mg/m
3. Faça os cálculos de t = 0 a 100min. Trace seus resultados
com a concentração no escoamento de entrada em função do tempo.
2.2 Solução
Para uma discretização com ∆t = 2 s, apresenta-se a solução para o problema na Fi-
gura 2.1. Note como a resposta obtida através do solver e do método de Runge-Kutta
de quarta ordem são bastante próximas entre si. O método de Euler expĺıcito apresenta
boa precisão em relação aos outros métodos em algumas regiões do gráfico, todavia, em
intervalos onde há grandes mudanças na derivada do gráfico, as soluções apresentam
diferenças consideráveis entre si.
0 20 40 60 80 100
20
25
30
35
40
Tempo (min)
C
on
ce
n
tr
aç
ão
(m
g
/m
3
)
Euler Expĺıcito
Runge Kutta 4ª Ordem
Solver
Figura 2.1: Solução do problema 2.
Ao diminuir-se o espaçamento entre os pontos da discretização, percebe-se como as
respostas utilizando diferentes métodos passam a convergir entre si. Para um ∆t = 0, 1
as três curvas se tornam praticamente indistingúıveis no gráfico, de modo que optou-se
por apresentar os gráficos para os três métodos utilizados de forma individual devido à
grande proximidade dos resultados obtidos.
A Figura 2.2 apresenta a solução pelo método de Euler expĺıcito.
9
0 20 40 60 80 100
20
25
30
35
40
Tempo (min)
C
on
ce
n
tr
aç
ão
(m
g
/m
3
)
Euler Expĺıcito
Figura 2.2: Solução do problema 2 através do método de Euler expĺıcito.
A Figura 2.3 apresenta a solução pelo método de Runge-Kutta de quarta ordem.
0 20 40 60 80 100
20
25
30
35
40
Tempo (min)
C
on
ce
n
tr
aç
ão
(m
g
/m
3
)
Runge Kutta 4ª Ordem
Figura 2.3: Solução do problema 2 através do método de Runge-Kutta de quarta ordem.
A Figura 2.4 apresenta a solução pelo solver solve ivp do pacote Scipy de python com
o método de Radau.
10
0 20 40 60 80 100
20
25
30
35
40
Tempo (min)
C
on
ce
n
tr
aç
ão
(m
g
/m
3
)
Solver
Figura 2.4: Solução do problema 2 através de solver.
2.3 Código associado
1 # @Author: eduardo
2 # @Date: 2020-11-07T16:53:42-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T01:48:36-02:00
5
6 import numpy as np
7 import matplotlib.pyplot as plt
8 import euler_explicito
9 import RK_4
10 import scipy.integrate
11
12 # Parâmetros do problema
13
14 V = 100 # m^3
15 Q = 6 # m^3/min
16 cb = 40 # mg/m^3
17 c0 = 20 # concentraç~ao inicial
18 dt = 0.1 # stepsize no tempo
19
20 # EDO a ser resolvida
21
22 def dcdt(t, c):
23 dcdt = Q / V * (cb * (1 - np.exp(-0.12* t)) - c)
24 return dcdt
25
26 # Resoluç~ao
11
27
28 t_euler, c_euler = euler_explicito.Euler(0, 100, c0, dt, dcdt)
29 t_RK, c_RK = RK_4.RK_4(0, 100, c0, dt, dcdt)
30 sol = scipy.integrate.solve_ivp(dcdt, (0, 100), [c0], method="Radau", max_step = dt)
31
32 # Plot
33
34 plt.plot(t_euler, c_euler, color="#E00650", label="Euler Explı́cito")
35 plt.plot(t_RK, c_RK, color="#2D2E7B", label="Runge Kutta 4ª Ordem")
36 plt.plot(sol.t, sol.y[0], color="#F1A91B", label="Solver")
37 plt.xlabel("Tempo (min)")
38 plt.ylabel("Concentraç~ao ($mg/m^3$)")
39 plt.xlim(0, 100)
40 plt.legend()
41 plt.grid()
42 plt.show()
12
3 Problema 3
3.1 Enunciado do problema
A água do mar com uma concentração de 8000 g/m3 é bombeada para um tanque bem
misturado a uma vazão de 0, 6 m3/h. Por causa de um defeito no trabalho do projeto, a
água está evaporando do tanque a uma vazão de 0, 025 m3/h. A solução salina deixa o
tanque a uma vazão de 0, 6 m3/h.
(a) Se o tanque continha originalmente 1 m3 da solução de entrada, quanto tempo
depois de ligar a bomba de sáıda o tanque secará?
(b) Use métodos numéricos para determinar a concentração de sal no tanque como uma
função do tempo.
3.2 Solução
3.2.1 Item a
A variação de volume no tanque é dada simplesmente pela quantidade de água que
evapora, já que as vazões de entrada e de sáıda são iguais.
Assim, a Equação 3.1 representa um bom modelo para o problema:
dV
dt
= −0, 25 (3.1)
Resolvendo com os métodos de Euler e Runge-Kutta de quarta ordem:
0 5 10 15 20 25 30 35 40
0
0.2
0.4
0.6
0.8
1
Tempo (h)
V
ol
u
m
e
d
o
ta
n
q
u
e
(m
3
)
Euler Expĺıcito
Runge Kutta 4ª Ordem
Figura 3.1: Solução do problema 3 através dos métodos de Euler e Runge Kutta de quarta
ordem.
13
3.2.2 Item b
Para este problema, a modelagem obtida baseia-se em um balanço de massa para o sal
no tanque, representado por
dcV
dt
= Q(cin − c).
Aplicando a regra da cadeia obtém-se
V
dc
dt
+ C
dV
dt
= Q(cin − c).
Sabe-se do item a que
dV
dt
= −Qvap. Aplicando e simplificando, é posśıvel chegar a
Equação 3.2, equação diferencial a ser resolvida.
dc
dt
=
Q(cin − c) +Qvapc
V (t)
(3.2)
0 2 4 6 8 10
8,000
8,050
8,100
8,150
8,200
8,250
8,300
8,350
Tempo (h)
C
on
ce
n
tr
aç
ão
(m
g
/m
3
)
Euler Expĺıcito
Runge-Kutta 4ª Ordem
Figura 3.2: Solução do problema 3 (item b) através dos métodos de Euler e Runge Kutta
de quarta ordem.
3.3 Código associado
3.3.1 Item a
1 # @Author: eduardo
2 # @Date: 2020-11-07T18:35:38-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-19T18:43:40-02:00
5
6 import numpy as np
14
7 import matplotlib.pyplot as plt
8 import euler_explicito
9 import RK_4
10
11 Q = 0.6 # m^3/h
12 dt = 0.01 # stepsize no tempo
13 Qv = 0.025 # m^3/h
14 V0 = 1 # m^3
15
16
17 def dVdt(t, V):
18 dVdt = -Qv
19 return dVdt
20
21
22 t_euler, V_euler = euler_explicito.Euler(0, 40, V0, dt, dVdt)
23 t_RK, V_RK = RK_4.RK_4(0, 40, V0, dt, dVdt)
24
25 plt.plot(t_euler, V_euler, color="#E00650", label="Euler Explı́cito")
26 plt.plot(t_RK, V_RK, linestyle=":", color="#2D2E7B", label="Runge Kutta 4ª Ordem")
27 plt.xlabel("Tempo (h)")
28 plt.ylabel("Volume do tanque ($m^3$)")
29 plt.xlim(0, 40)
30 plt.ylim(0, 1)
31 plt.legend()
32 plt.grid()
33
34 plt.show()
3.3.2 Item b
1 # @Author: eduardo
2 # @Date: 2020-11-07T17:27:26-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-19T19:12:42-02:00
5 import numpy as np
6 import matplotlib.pyplot as plt
7 from scipy.integrate import odeint
8 import RK_4
9 import euler_explicito
10
11
12 Q = 0.6 # m^3/min
13 Qv = 0.025 # m^3/min
14 ci = 8000 # concentraç~ao inicial
15 dt = 0.01 # stepsize no tempo
16
15
17
18 def dcdt(t, c):
19 dcdt = (Q * (ci - c) + Qv * c) / (1 - 0.025 * t)
20 return dcdt
21
22
23 t, c = RK_4.RK_4(0, 10, 8000, dt, dcdt)
24 t_euler, V_euler = euler_explicito.Euler(0, 10, 8000, dt, dcdt)
25
26 # c = odeint(dcdt, 8000, t)
27
28 plt.plot(t_euler, V_euler, color="#E00650", label="Euler Explı́cito")
29 plt.plot(t, c, linestyle ='--',color="#2D2E7B", label='Runge-Kutta 4ª Ordem')
30 plt.xlabel("Tempo (h)")
31 plt.ylabel("Concentraç~ao ($mg/m^3$)")
32 plt.ylim(8000, 8350)
33 plt.xlim(0, 10)
34 plt.grid()
35 plt.legend()
36 plt.show()
16
4 Problema 4
4.1 Enunciado do problema
Uma esfera de gelo que tem 6 cm de diâmetro é removida de um congelador a 0 C e é
colocada em uma tela de rede à temperatura ambiente Ta = 20 C. Qual será o diâmetro
da esfera de gelo como uma função do tempo fora do congelador (supondo que toda a
água que derreteu caia imediatamente pela tela)? O coeficiente de transferência de calor
h para uma esfera em um quarto sem vento é cerca de 3 W/(m2K). O fluxo de calor da
esfera de gelo para o ar é dado por
Fluxo =
q
A
= h(Ta − T )
onde q é o calor e A é a área da superf́ıcie de uma esfera. Use um método numérico
para fazer seus cálculos. Observe que o calor latente de fusão é 333 kJ/kg e que a
densidade do gelo é aproximadamente 917 kg/m3.
4.2 Solução
Como a superf́ıcie da esfera está em constante fusão, sabe-se que sua temperatura está
fixa em 0 °C. Além disso, considera-se que todo calor fornecido para a esfera na forma
convectiva é utilizado no processo do derretimento.
Desta forma, a variação do volume da esfera pode ser dado pela Equação 4.1:
dV
dt
=
−A(t)h(Ta − T )
Qfρ
(4.1)
Fazendo uma mudança de variáveis para escrever o volume e a área superficial da
esfera em função de seu raio,
V =
4
3
πr3
dV = 4πr2dr
A = 4πr2
Substituindo,
4πr2dr
dt
=
4πr2h(Ta − T )
Qfρ
Simplificando, chega-se a equação diferencial ordinária que deve ser resolvida, expressa
pela Equação 4.2:
dr
dt
=
h(Ta − T )
Qfρ
(4.2)
A solução numérica para este problema é apresentada na Figura 4.1.
17
0 0.2 0.4 0.6 0.8 1 1.2 1.4
·105
0
1
2
3
4
5
6
·10−2
Tempo (min)
D
iâ
m
et
ro
(m
)
Runge Kutta 4ª Ordem
Figura 4.1: Solução do problema 4 através do método de Runge Kutta de quarta ordem.
4.3 Código associado
1 # @Author: eduardo
2 # @Date: 2020-11-07T18:48:50-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-19T19:18:15-02:00
5
6 import numpy as np
7 import matplotlib.pyplot as plt
8 import euler_explicito
9 import RK_4
10 from scipy.integrate import odeint
11
12 # Parâmetros do problema
13
14 Tinf = 20 # m^3
15 T = 0 # ºC
16 h = 3 # mg/m^3
17 Qfusao = 333000 # J/Kg
18 rho = 917 # Kg/m^3
19 dt = 1000 # stepsize no tempo
20 r0 = 0.03 # Raio no tempo 0
21
22
23 def dcdt(t, r):
24 drdt = -h * (Tinf - T) / (Qfusao * rho)
25 return drdt
18
26
27
28 t_RK, r_RK = RK_4.RK_4(0, 160000, r0, dt, dcdt)
29
30 plt.plot(t_RK, 2 * r_RK, color="#E00650", label="Runge Kutta 4ª Ordem")
31 plt.xlabel("Tempo (min)")
32 plt.ylabel("Diâmetro (m)")
33 plt.xlim(0, 153000)
34 plt.ylim(0,r0*2)
35 plt.legend()
36 plt.grid()
37 plt.show()
19
5 Problema 5
5.1 Enunciado do problema
As seguintes equações definem a concentração de trés reagentes:
dca
dt
= −10cacc + cb
dcb
dt
= 10cacc − cb
dcc
dt
= −10cacc + cb − 2cc
Se as condições iniciais forem ca = 50, cb = 0 e cc = 40, encontre as concentrações
para instantes entre 0 c 3 s.
5.2 Solução
A solução numérica para o problema é apresentada na Figura 5.1.
0 0.5 1 1.5 2 2.5 3
0
10
20
30
40
50
Tempo (s)
C
on
ce
n
tr
aç
ão
(-
)
Ca
Cb
Cc
Figura 5.1: Solução do problema 5 utilizando o solver com método de impĺıcito de Radau.
Para métodos expĺıcitos, este problema exigiu passos de magnitude muito pequena,
de forma que seu custo computacional aumentou de forma gigantesca.
Observe que neste problema tudo acontece em tempos muito próximos de zero. Para
um intervalo em x menor, é posśıvel visuzizar melhor como as concentrações variam antes
de atingir o estado permanente.
20
0 2 · 10−2 4 · 10−2 6 · 10−2 8 · 10−2 0.1
0
10
20
30
40
50
Tempo(s)
C
on
ce
n
tr
aç
ão
(-
)
Ca
Cb
Cc
Figura 5.2: Solução do problema 5 utilizando o solver com método de impĺıcito de Radau.
5.3 Código associado
1 # @Author: eduardo
2 # @Date: 2020-11-07T19:49:54-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-19T19:31:50-02:00
5
6 import numpy as np
7 import matplotlib.pyplot as plt
8 import scipy.integrate
9
10
11 ca0 = 50
12 cb0 = 0
13 cc0 = 40
14 c0 = [ca0, cb0, cc0]
15 dt = 0.5
16
17
18 def solve(t, c):
19 c1, c2, c3 = c
20 dcadt = -10 * c1 * c3 + c2
21 dcbdt = 10 * c1 * c3 - c2
22 dccdt = -10 * c1 * c3 + c2 - 2 * c3
23 return dcadt, dcbdt, dccdt
24
25
21
26 sol = scipy.integrate.solve_ivp(solve, (0, 3), c0, method="Radau", max_step=dt)
27
28 plt.plot(sol.t, sol.y[0], color="#E00650", label="Ca")
29 plt.plot(sol.t, sol.y[1], color="#2D2E7B", label="Cb")
30 plt.plot(sol.t, sol.y[2], color="#E8B038", label="Cc")
31 plt.xlim(0, 3)
32 plt.ylim(0, 50)
33 plt.grid()
34 plt.legend()
35 plt.xlabel('Tempo (s)')
36 plt.ylabel('Concentraç~ao (-)')
37
38 plt.show()
22
6 Problema 6
6.1 Enunciado do problema
A reação A → B ocorre em dois reatores em série. Os reatores estão bem misturados,
mas não cstão no cstado estacionário. O balanço de massa para cada reator de tanque
agitado é mostrado a seguir:
dCA1
dt
=
1
τ
(CA0 − CA1)− kCA1
dCB1
dt
= −1
τ
CB1 + kCA1
dCA2
dt
=
1
τ
(CA1 − CA2)− kCA2
dCB2
dt
=
1
τ
(CB1 − CB2) + kCA2
onde CA0 é a concentração de A na entrada do primeiro reator, CA1 é a concentração
de A na sáıda do primeiro reator (e na entrada do segundo), CA2 é a concentração de A
na sáıda do segundo reator, CB1 é a concentração de B na sáıda do primeiro reator (e
na entrada do segundo), CB2 é a concentração de B no segundo reator, τ é o tempo de
residência para cada reator e k é a taxa constante para a reação de A para produzir B.
Se CA0 for igual a 20, encontre as concentrações de A e B em ambos os reatores durante
os primeiros 10 minutos de operação. Use k = 0, 12/min e τ = 5 min e suponha que as
condições iniciais de todas as variáveis dependentes sejam zero.
6.2 Resolução
A solução numérica utilizando o método de Runge-Kutta de quarta ordem para o pro-
blema é apresentada na Figura 6.1.
0 2 4 6 8 10
0
2
4
6
8
10
12
Tempo (min)
C
on
ce
n
tr
aç
ão
(-
)
Ca1
Cb1
Ca2
Cb2
Figura 6.1: Solução do problema 6 utilizando o método de Runge-Kutta de quarta ordem.
23
6.3 Código associado
1 # @Author: eduardo
2 # @Date: 2020-11-07T20:49:22-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-19T20:53:08-02:00
5
6 import numpy as np
7 import matplotlib.pyplot as plt
8 import RK_4
9 import scipy.integrate
10
11 k = 0.12
12 tau = 5 # minutos
13 c0 = np.zeros(4)
14 ca0 = 20
15 dt = 0.01
16
17
18 def solve(t, c):
19 ca1, cb1, ca2, cb2 = c
20 dca1dt = 1 / tau * (ca0 - ca1) - k * ca1
21 dcb1dt = -1 / tau * cb1 + k * ca1
22 dca2dt = 1 / tau * (ca1 - ca2) - k * ca2
23 dcb2dt = 1 / tau * (cb1 - cb2) + k * ca2
24 return dca1dt, dcb1dt, dca2dt, dcb2dt
25
26
27 t, c = RK_4.RK_4_SE(0, 10, c0, dt, solve)
28
29 sol2 = scipy.integrate.solve_ivp(solve, (0, 10), c0, method="Radau", max_step=dt)
30
31
32 plt.plot(t, c[0], color="#E00650", label="Ca1")
33 plt.plot(t, c[1], color="#2D2E7B", label="Cb1")
34 plt.plot(t, c[2], color="#E8B038", label="Ca2")
35 plt.plot(t, c[3], label="Cb2")
36 # plt.plot(sol2.t, sol2.y[3], label="Solver")
37 plt.xlim(0, 10)
38 plt.ylim(0, 12.5)
39 plt.grid()
40 plt.legend()
41 plt.xlabel('Tempo (min)')
42 plt.ylabel('Concentraç~ao (-)')
43
44 plt.show()
24
7 Problema 7
7.1 Enunciado do problema
Um reator de batelada pode ser descrito pelas seguintes equações:
dC
dt
= −e(−10/(T+273))C
dT
dt
= 1000e(−10/(T+273))C − 10(T − 20)
onde C é a concentração do reagente e T a temperatura do reator. Inicialmente, o
reator está a 15 C e tem uma concentração do reagente C de 1, 0 mol/L. Encontre a
concentração e a temperatura do reator como uma função do tempo.
7.2 Resolução
A solução numérica utilizando o método de Radau para a concentração no problema é
apresentada na Figura 7.1.
0 0.5 1 1.5 2 2.5 3
0
0.2
0.4
0.6
0.8
1
t (-)
C
(m
ol
/L
)
C
Figura 7.1: Solução do problema 7 utilizando o método de Radau.
A solução numérica utilizando o método de Radau para a concentração no problema
é apresentada na Figura 7.1.
25
0 0.5 1 1.5 2 2.5 3
20
40
60
80
t (-)
T
(°
C
)
T
Figura 7.2: Solução do problema 7 utilizando o método de Radau.
7.3 Código associado
1 # @Author: eduardo
2 # @Date: 2020-11-07T23:45:47-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T02:30:55-02:00
5
6 import numpy as np
7 from numpy import exp
8 import matplotlib.pyplot as plt
9 import RK_4
10 import scipy.integrate
11
12 c0 = 1 # mol/L
13 T0 = 15 # ºC
14 x0 = [c0, T0]
15 dt = 0.5
16
17
18 def solve(t, y):
19 C, T = y
20 dCdt = -exp(-10 / (T + 273)) * C
21 dTdt = 1000 * exp(-10 / (T + 273)) * C - 10 * (T - 20)
22 return dCdt, dTdt
23
24
25 t, c = RK_4.RK_4_SE(0, 3, x0, dt, solve)
26
26
27 sol = scipy.integrate.solve_ivp(solve, (0, 10),
28 x0,
29 method="Radau",
30 max_step=dt)
31
32 fig, axs = plt.subplots(1, 2)
33 axs[0].plot(sol.t, sol.y[0], color="#E00650", label="C")
34 axs[1].plot(sol.t, sol.y[1], color="#2D2E7B", label="T")
35 axs[1].set_ylabel('Temperatura')
36 axs[0].set_xlabel('Tempo')
37 axs[1].set_xlabel('Tempo')
38 plt.show()
27
8 Problema 8
8.1 Enunciado do problema
Considere o reator de mistura perfeita encamisado, conduzindo reaçio quimica exotérmica,
representado ao lado. Pede-se:
(a) Obter o modelo matemático que representa este processo.
(b) Analisar a dinâmica do processo para o cenário em que a temperatura de entrada
é mantida fixa em 350 K e, em t = 0 a concentração no reator é de 0, 1 mol/L a
temperatura do CSTR é 600 K e a temperatura da camisa é 500 K.
(c) Em t = 50 s a temperatura na alimentação do CSTR é alterada para 298 K. Analise
a dinâmica do processo frente a esta modificaç̃ıo.
Realize sua análise utilizando os métodos de Euler e Runge-Kutta de quarta ordem
(RK4), bem como um solver adequado. Comente cada linha do algoritmo e apresente
uma discuss̃ıo sobre o processo em estudo.
Informações adicionais:
Alimentação do reator Camisa Outros Parâmetros
F = 25 L/s Fj = 5L/s CA,0 = 4 mol/L
V = 250 L Vj = 40 L k0 = 800 s
−1
ρ = 1000 kg/m3 ρ = 800 kg/m3 E/R = 4500 K
cp = 2500 J/Kg ·K cp = 5000 J/Kg ·K (−∆H) = 250 kJ/mol
T0 = 350 K Tj,0 = 25 C UA = 20 kW/K
8.2 Solução
8.2.1 Modelo
Considera-se para o problema a reação irreverśıvel de primeira ordem
A −−→ B.
O consumo da espécie A é dado pela Equação 8.1:
dCa
dt
=
Ca0 − Ca
τ
− kCa (8.1)
Sendo τ o tempo espacial do reator, dado pela razão entre V e F. A geração do produto
B, por outro lado, pode ser expressa pela Equação 8.2:
dCb
dt
=
Cb
τ
+ kCa (8.2)
Um balanço energético para o interior do reator permite a obtenção da Equação 8.3:
dT
dt
=
T0 − T
τ
+
∆HkCa
ρCp
− UA(T − Tj)
ρCpV
(8.3)
O balanço para a camisa térmica do reator fornece a Equação 8.4:
28
dTj
dt
=
T0j − Tj
τj
+
UA(T − Tj)
ρjCpjVj
(8.4)
Finalmente, a constante K para a reação é dada pela Equação 8.5:
K = K0 · exp
(
− E
RT
)
(8.5)
8.2.2 Resolução - Euler
A resolução do problema consiste na obtenção na solução para estas cinco equações aco-
pladas. As concentrações em função do tempo são apresentadas na Figura 8.1. As
temperaturas em função do tempo são apresentadas na Figura 8.2.
0 10 20 30 40 50
0
1,000
2,000
3,000
4,000
Tempo (s)
C
on
ce
n
tr
aç
ão
(m
ol
/m
3
)
Ca
Cb
Figura 8.1: Solução do problema 8 utilizando o método de Euler.
29
0 10 20 30 40 50
450
500
550
600
650
Tempo (s)
T
em
p
er
at
u
ra
(K
)
T
Tj
Figura 8.2: Solução do problema 8 utilizando o método de Euler.
8.2.3Resolução - Runge-Kutta
As concentrações em função do tempo são apresentadas na Figura 8.3. As temperaturas
em função do tempo são apresentadas na Figura 8.4.
0 10 20 30 40 50
0
1,000
2,000
3,000
4,000
Tempo (s)
C
on
ce
n
tr
aç
ão
(m
ol
/m
3
)
Ca
Cb
Figura 8.3: Solução do problema 8 utilizando o método de Runge-Kutta de quarta ordem.
30
0 10 20 30 40 50
450
500
550
600
650
Tempo (s)
T
em
p
er
at
u
ra
(K
)
T
Tj
Figura 8.4: Solução do problema 8 utilizando o método de Runge-Kutta de quarta ordem.
8.2.4 Resolução - Solver
As concentrações em função do tempo são apresentadas na Figura 8.5. As temperaturas
em função do tempo são apresentadas na Figura 8.6.
0 10 20 30 40 50
0
1,000
2,000
3,000
4,000
Tempo (s)
C
on
ce
n
tr
aç
ão
(m
ol
/m
3
)
Ca
Cb
Figura 8.5: Solução do problema 8 utilizando o solver com método de Radau.
31
0 10 20 30 40 50
450
500
550
600
650
Tempo (s)
T
em
p
er
at
u
ra
(K
)
T
Tj
Figura 8.6: Solução do problema 8 utilizando o solver com método de Radau.
8.3 Item c
Neste item, avaliamos uma perturbação na temperatura de alimentação do reator a partir
de 50 segundos.
8.3.1 Resolução - Euler
As concentrações em função do tempo são apresentadas na Figura 8.7. As temperaturas
em função do tempo são apresentadas na Figura 8.8.
0 20 40 60 80 100 120
0
1,000
2,000
3,000
4,000
Tempo (s)
C
on
ce
n
tr
aç
ão
(m
ol
/m
3
)
Ca
Cb
Figura 8.7: Solução do problema 8 (item c) utilizando o método de Euler.
32
0 20 40 60 80 100 120
300
400
500
600
Tempo (s)
C
on
ce
n
tr
aç
ão
(m
ol
/m
3
)
T
Tj
Figura 8.8: Solução do problema 8 (item c) utilizando o método de Euler.
8.3.2 Resolução - Runge-Kutta
As concentrações em função do tempo são apresentadas na Figura 8.9. As temperaturas
em função do tempo são apresentadas na Figura 8.10.
0 20 40 60 80 100 120
0
1,000
2,000
3,000
4,000
Tempo (s)
C
on
ce
n
tr
aç
ão
(m
ol
/m
3
)
Ca
Cb
Figura 8.9: Solução do problema 8 (item c) utilizando o método de Runge-Kutta de
quarta ordem.
33
0 20 40 60 80 100 120
300
400
500
600
Tempo (s)
C
on
ce
n
tr
aç
ão
(m
ol
/m
3
)
T
Tj
Figura 8.10: Solução do problema 8 (item c) utilizando o método de Runge-Kutta de
quarta ordem.
8.3.3 Resolução - Solver
As concentrações em função do tempo são apresentadas na Figura 8.11. As temperaturas
em função do tempo são apresentadas na Figura 8.12.
0 20 40 60 80 100 120
0
1,000
2,000
3,000
4,000
Tempo (s)
C
on
ce
n
tr
aç
ão
(m
ol
/m
3
)
Ca
Cb
Figura 8.11: Solução do problema 8 (item c) utilizando o solver com método de Radau.
34
0 20 40 60 80 100 120
300
400
500
600
Tempo (s)
T
em
p
er
at
u
ra
(K
)
T
Tj
Figura 8.12: Solução do problema 8 (item c) utilizando o solver com método de Radau.
Este caso pode ser considerado como um ótimo exemplo de como é importante simu-
lar processos e de uma análise de sensibilidade detalhada. A resolução deste problema
permitiu a visualização de como a variação de um único parâmetro - neste caso a tem-
peratura de entrada de uma corrente no reator - altera completamente sua dinâmica.
Em um caso prático, caso isto acontecesse, a concentração do produto de interesse seria
zerada, gerando sem dúvidas muitos problemas técnicos e econômicos na planta que este
reator está operando.
8.4 Código associado
8.4.1 Item b
1 # @Author: eduardo
2 # @Date: 2020-11-19T13:45:19-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T02:35:24-02:00
5
6 import matplotlib.pyplot as plt
7 import numpy as np
8 from numpy import exp
9 import scipy.integrate
10 import RK_4
11 import euler_explicito
12
13
14 # Parâmetros do modelo
15 # Alimentaç~ao do reator
16
17 F = 0.025 # m^3/s
35
18 V = 0.250 # m^3
19 rho = 1000 # kg/m^3
20 cp = 2500 # J/kg.k
21 T0 = 350 # K
22 tau = V / F
23
24 # Camisa
25
26 F_j = 0.005 # m^3/s
27 V_j = 0.04 # m^3
28 rho_j = 800 # kg/m^3
29 cp_j = 5000 # J/kg.K
30 T0_j = 25 + 273.15 # K
31 tau_j = V_j / F_j
32
33 # Demais parâmetros
34
35 Ca0 = 4000 # mol/m^3
36 k0 = 800 # s^-1
37 ER = 4500 # K
38 dH = 250000 # J/mol
39 UA = 20000 # W/K
40
41 dt = 0.1
42 x0 = [100, 0, 600, 500]
43
44
45 def solve(t, x):
46 Ca, Cb, T, Tj = x
47 K = k0 * np.exp(-ER / T)
48 dCadt = (Ca0 - Ca) / tau - K * Ca
49 dCbdt = -Cb / tau + K * Ca
50 dTdt = (T0 - T) / tau + dH * K * Ca / (rho * cp) - UA * (T - Tj) / (rho *
51 cp * V)
52 dTjdt = (T0_j - Tj) / tau_j + UA * (T - Tj) / (rho_j * cp_j * V_j)
53 return dCadt, dCbdt, dTdt, dTjdt
54
55
56 t, c = euler_explicito.Euler_SE(0, 50, x0, dt, solve)
57
58 fig, axs = plt.subplots(1, 2)
59 axs[0].plot(t, c[0], color="#E00650", label="Ca")
60 axs[0].plot(t, c[1], color="#E8B038", label="Cb")
61
62 axs[0].set_xlabel('Tempo (s)')
63 axs[0].set_ylabel('Concentraç~ao $(mol/m^3)$')
64 axs[0].legend()
65 axs[0].grid(True)
36
66
67 axs[1].plot(t, c[2], color="#2D2E7B", label="T")
68 axs[1].plot(t, c[3], color="#E8B038", label="Tj")
69
70
71 axs[1].set_ylabel('Temperatura (K)')
72 axs[1].set_xlabel('Tempo (s)')
73 axs[1].legend()
74 axs[1].grid(True)
75 plt.title('Euler')
76 plt.show()
77
78 t, c = RK_4.RK_4_SE(0, 50, x0, dt, solve)
79
80 fig, axs = plt.subplots(1, 2)
81 axs[0].plot(t, c[0], color="#E00650", label="Ca")
82 axs[0].plot(t, c[1], color="#E8B038", label="Cb")
83
84 axs[0].set_xlabel('Tempo (s)')
85 axs[0].set_ylabel('Concentraç~ao $(mol/m^3)$')
86 axs[0].legend()
87 axs[0].grid(True)
88
89 axs[1].plot(t, c[2], color="#2D2E7B", label="T")
90 axs[1].plot(t, c[3], color="#E8B038", label="Tj")
91
92
93 axs[1].set_ylabel('Temperatura (K)')
94 axs[1].set_xlabel('Tempo (s)')
95 axs[1].legend()
96 axs[1].grid(True)
97 plt.title('Runge-Kutta')
98 plt.show()
99
100 sol = scipy.integrate.solve_ivp(solve, (0, 50), x0, method="Radau", max_step=dt)
101
102 fig, axs = plt.subplots(1, 2)
103 axs[0].plot(sol.t, sol.y[0], color="#E00650", label="Ca")
104 axs[0].plot(sol.t, sol.y[1], color="#E8B038", label="Cb")
105
106 axs[0].set_xlabel('Tempo (s)')
107 axs[0].set_ylabel('Concentraç~ao $(mol/m^3)$')
108 axs[0].legend()
109 axs[0].grid(True)
110
111 axs[1].plot(sol.t, sol.y[2], color="#2D2E7B", label="T")
112 axs[1].plot(sol.t, sol.y[3], color="#E8B038", label="Tj")
113
37
114
115 axs[1].set_ylabel('Temperatura (K)')
116 axs[1].set_xlabel('Tempo (s)')
117 axs[1].legend()
118 axs[1].grid(True)
119 plt.title('Solver')
120 plt.show()
8.4.2 Item c
1 # @Author: eduardo
2 # @Date: 2020-11-19T20:29:26-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T02:36:51-02:00
5
6 import matplotlib.pyplot as plt
7 import numpy as np
8 from numpy import exp
9 import scipy.integrate
10 import RK_4
11 import euler_explicito
12
13 # Parâmetros do modelo
14 # Alimentaç~ao do reator
15
16 F = 0.025 # m^3/s
17 V = 0.250 # m^3
18 rho = 1000 # kg/m^3
19 cp = 2500 # J/kg.k
20 tau = V / F
21
22 # Camisa
23
24 F_j = 0.005 # m^3/s
25 V_j = 0.04 # m^3
26 rho_j = 800 # kg/m^3
27 cp_j = 5000 # J/kg.K
28 T0_j = 25 + 273.15 # K
29 tau_j = V_j / F_j
30
31 # Demais parâmetros
32
33 Ca0 = 4000 # mol/m^3
34 k0 = 800 # s^-1
35 ER = 4500 # K
36 dH = 250000 # J/mol
37 UA = 20000 # W/K
38
38
39 dt = 0.1
40 x0 = [100, 0, 600, 500]
41
42
43 def solve(t, x):
44 if t < 50:
45 T0 = 350
46 else:
47 T0 = 298
48 Ca, Cb, T, Tj = x
49 K = k0 * np.exp(-ER / T)
50 dCadt = (Ca0 - Ca) / tau - K * Ca
51 dCbdt = -Cb / tau + K * Ca
52 dTdt = (T0 - T) / tau + dH * K * Ca / (rho * cp) - UA * (T - Tj) / (rho *
53 cp * V)
54 dTjdt = (T0_j - Tj) / tau_j + UA * (T - Tj) / (rho_j * cp_j * V_j)
55 return dCadt, dCbdt, dTdt, dTjdt
56
57 t, c = euler_explicito.Euler_SE(0, 125, x0, dt, solve)
58
59 fig, axs = plt.subplots(1, 2)
60 axs[0].plot(t, c[0], color="#E00650", label="Ca")
61 axs[0].plot(t, c[1], color="#E8B038", label="Cb")62
63 axs[0].set_xlabel('Tempo (s)')
64 axs[0].set_ylabel('Concentraç~ao $(mol/m^3)$')
65 axs[0].legend()
66 axs[0].grid(True)
67
68 axs[1].plot(t, c[2], color="#2D2E7B", label="T")
69 axs[1].plot(t, c[3], color="#E8B038", label="Tj")
70
71
72 axs[1].set_ylabel('Temperatura (K)')
73 axs[1].set_xlabel('Tempo (s)')
74 axs[1].legend()
75 axs[1].grid(True)
76 plt.title('Euler')
77 plt.show()
78
79 t, c = RK_4.RK_4_SE(0, 125, x0, dt, solve)
80
81 fig, axs = plt.subplots(1, 2)
82 axs[0].plot(t, c[0], color="#E00650", label="Ca")
83 axs[0].plot(t, c[1], color="#E8B038", label="Cb")
84
85 axs[0].set_xlabel('Tempo (s)')
39
86 axs[0].set_ylabel('Concentraç~ao $(mol/m^3)$')
87 axs[0].legend()
88 axs[0].grid(True)
89
90 axs[1].plot(t, c[2], color="#2D2E7B", label="T")
91 axs[1].plot(t, c[3], color="#E8B038", label="Tj")
92
93
94 axs[1].set_ylabel('Temperatura (K)')
95 axs[1].set_xlabel('Tempo (s)')
96 axs[1].legend()
97 axs[1].grid(True)
98 plt.title('Runge-Kutta')
99 plt.show()
100
101 sol = scipy.integrate.solve_ivp(solve, (0, 125), x0, method="Radau", max_step=dt)
102
103 fig, axs = plt.subplots(1, 2)
104 axs[0].plot(sol.t, sol.y[0], color="#E00650", label="Ca")
105 axs[0].plot(sol.t, sol.y[1], color="#E8B038", label="Cb")
106
107 axs[0].set_xlabel('Tempo (s)')
108 axs[0].set_ylabel('Concentraç~ao $(mol/m^3)$')
109 axs[0].legend()
110 axs[0].grid(True)
111
112 axs[1].plot(sol.t, sol.y[2], color="#2D2E7B", label="T")
113 axs[1].plot(sol.t, sol.y[3], color="#E8B038", label="Tj")
114
115
116 axs[1].set_ylabel('Temperatura (K)')
117 axs[1].set_xlabel('Tempo (s)')
118 axs[1].legend()
119 axs[1].grid(True)
120 plt.title('Solver')
121 plt.show()
40
9 Problema 9
9.1 Enunciado do problema
O seguinte sistema é um exemplo clássico de EDOs rigidas que podem ocorrer na cinética
de reações quimicas:
dc1
dt
= −0, 013c1 − 1000c1c3
dc2
dt
= −2500c2c3
dc3
dt
= −0, 013c1 − 1000c1c3 − 2500c2c3
Resolva essas EDOs de t = 0 a 50 com condições iniciais c1(0) = c2(0) = 1 e c3(0) = 0
9.2 Solução
A solução numérica utilizando o método impĺıcito Radau para o problema é apresentada
na Figura 6.1.
0 10 20 30 40 50
0
0.2
0.4
0.6
0.8
1
1.2
1.4
Tempo (-)
C
on
ce
n
tr
aç
ão
c1
c2
c3
Figura 9.1: Solução do problema 9 utilizando o método de Radau com um solver.
9.3 Código associado
1 # @Author: eduardo
2 # @Date: 2020-11-08T00:02:53-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T02:38:42-02:00
5 import numpy as np
6 from numpy import exp
41
7 import matplotlib.pyplot as plt
8 import scipy.integrate
9
10 c10 = 1
11 c20 = 1
12 c30 = 0
13 c0 = [c10, c20, c30]
14 dt = 0.1
15
16
17 def solve(t, c):
18 c1, c2, c3 = c
19 dc1dt = -0.013 * c1 - 1000 * c1 * c3
20 dc2dt = -2500 * c2 * c3
21 dc3dt = -0.013 * c1 - 1000 * c1 * c3 - 2500 * c2 * c3
22 return dc1dt, dc2dt, dc3dt
23
24 sol = scipy.integrate.solve_ivp(solve, (0, 50),
25 c0,
26 method="Radau",
27 max_step=dt)
28
29 plt.plot(sol.t, sol.y[0], color="#E00650", label="c1")
30 plt.plot(sol.t, sol.y[1], color="#2D2E7B", label="c2")
31 plt.plot(sol.t, sol.y[2], color="#E8B038", label="c3")
32 plt.xlabel('Tempo (-)')
33 plt.ylabel('Concentraç~ao')
34 plt.xlim(0, 50)
35 plt.grid()
36 plt.legend()
37 plt.show()
42
10 Problema 10
10.1 Enunciado do problema
Um biofilme com espessura Lf (cm) cresce na superficie de um sólido. Depois de atra-
vessar uma camada de difusão de espessura L (cm) , um composto quimico A se difunde
no biofilme onde é sujeito a uma reação de primeira ordem irreversivel que o converte em
um produto B. O balanço de massa estacionário pode ser usado para deduzir as seguintes
cquações diferenciais ordinárias para o composto A :
D
d2ca
dx2
= 0, 0 ≤ x < L
Df
d2ca
dx2
− kca = 0, L ≤ x < L+ Lf
em que D é o coeficiente de difusão na camada de difusão (0, 8 cm2/dia), Df é o
coeficiente de difusão no biofilme (0, 64 cm2dia) e k é a taxa de primeira ordem para a
conversão de A em B (0, 1 /dia). As seguintes condições de contorno são válidas:
ca = ca,0, em x = 0
dca
dx
= 0, em x = L+ Lf
em que ca,0 é a concentração de água no volume do liquido (100 mol/L. Faça uma
representação esquemática do processo. Use o método das diferenças finitas para calcular
a distribuição estacionária de A de x = 0 a L+Lf , em que L = 0, 008 cm e Lf = 0, 004 cm.
Utilize diferenças finitas centradas com ∆x = 0, 001 cm.
10.2 Solução
Para 0 ≤ x < L, ou seja, na região do sólido,
D
dca
dx
= 0.
Como, D 6= 0,
dca
dx
= 0.
Uma discretização utilizando o método das diferenças finitas fornece a Equação 10.1:
ci+1a − 2cia + ci−1a
∆x2
= 0 (10.1)
Para o domı́nio do biofilme, L ≤ x < L+ Lf ,
Df
d2ca
d2x
− kca = 0.
A discretização para esta região é dada pela Equação 10.2:
ci+1a +
(
k∆x2
D
− 2
)
cia + c
i−1
a = 0 (10.2)
43
Note como para este problema, para calcular cia são necessários os valores de c
i
a, c
i−1
a e
ci+1a . Destes, para cada i, somente o valor passado é conhecido. Isto sugere a necessidade
do desenvolvimento de um sistema de equações para a solução do problema.
Além disso, é necessário incluir as condições de contorno no problema. Desta forma,
ao discretizar-se o domı́nio de x com n pontos, sabemos da condição de fluxo nulo em
x = L+ Lf que
cna − cn−1a = 0.
Da condição em x = 0,
c1a = c
0
a.
Estas duas condições definem, respectivamente, a primeira e a última linha da matriz
associada ao sistema linear. A matriz do sistema é grande e esparsa (tridiagonal), mesmo
para uma discretização com intervalos grandes, como sugerido no exerćıcio. Solucionando-
se o sistema linear, obtém-se um gráfico como o da Figura 10.1.
0 0.2 0.4 0.6 0.8 1 1.2
·10−2
99.9996
99.9997
99.9998
99.9999
100
x (cm)
C
on
ce
n
tr
aç
ão
(m
ol
/L
)
Figura 10.1: Solução para o problema 10 obtido através do método de diferenças finitas.
10.3 Código associado
1 # @Author: eduardo
2 # @Date: 2020-11-08T10:08:00-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T02:39:17-02:00
5
6
7 import numpy as np
8 import matplotlib.pyplot as plt
9
44
10 L = 0.008 # cm
11 Lf = 0.004 # cm
12 D = 0.8 # cm^2 / dia
13 Df = 0.64 # cm^2 / dia
14 k = 0.1 # dia^-1
15 dx = 0.001 # cm
16 n = int(L / dx)
17 ca0 = 100 # mol / L
18 m = int((L + Lf) / dx)
19
20 A = np.zeros((m + 1, m + 1))
21 b = np.zeros(m + 1)
22
23 A[0, 0] = 1
24 b[0] = ca0
25
26
27 for i in range(1, n + 1):
28 A[i, i] = -2
29 A[i, i - 1] = 1
30 A[i, i + 1] = 1
31
32 for i in range(n + 1, m):
33 A[i, i] = -k * dx ** 2 / Df - 2
34 A[i, i - 1] = 1
35 A[i, i + 1] = 1
36
37 A[m, m] = -1
38 A[m, m - 1] = 1
39 b[n] = 0
40
41
42 u = np.linalg.solve(A, b)
43
44 x = np.arange(0, (L + Lf) + dx, dx)
45
46 plt.plot(x, u, color="#E00650")
47 plt.xlabel("x (cm)")
48 plt.ylabel("Concentraç~ao (mol/L)")
49 plt.xlim(0, L + Lf)
50 plt.grid()
51 plt.show()
45
11 Problema 11
11.1 Enunciado do problema
A scguinte cquaçio diferencial descreve a concentração estacionária de uma substância
que reage com cinética de primeira ordem em um reator de fluxo em pistão axialmente
disperso:
D
d2c
dx2
− U dc
dx
− kc = 0
em que D é o coeficiente de dispersão (m2/h), c é a concentração (mol/L), x é a distância
(m), U é a velocidade (m/h) e k é a taxa de reação (m/h). As condições de contorno
podem ser formuladas como:
Ucin = Uc(x = 0)−D
dc
dx
(x = 0)
dc
dx
(x = L) = 0
em que cin é a concentração do fluxo de entrada (mol/L) e L é o comprimento do reator
(m). Essas são chamadas de condições de contorno de Danckwerts. Use a abordagem de
diferenças finitas para determinar a concentração como uma função da distância, dados
os scguintes parâmetros: D = 5000 m2/h, U = 100m/h, k = 2 /h , L = 100 m, e
cin = 100 mol/L. Utilize aproximaçõ por diferenças centradas com ∆x = 10 m para
obter sua solução.
11.2 SoluçãoA resolução deste problema exige uma abordagem similar a do problema 10. A discre-
tização na forma da Equação 11.1:(
D
∆x2
+
U
2∆x
)
ci+1 −
(
2D
∆x2
+ k
)
ci +
(
D
∆x2
− U
2∆x
)
ci−1 = 0 (11.1)
Em x = L, a condição de contorno discretizadas fica
cn − cn−1 = 0
Em x = 0, a condição de contorno de Danckwerts fornece(
U +
D
∆x
)
c1 − D
∆x
c2 = Ucin
A solução do problema é apresentada na Figura 11.1.
46
0 20 40 60 80 100
30
40
50
60
x (cm)
C
on
ce
n
tr
aç
ão
(m
ol
/L
)
Figura 11.1: Solução para o problema 11 obtido através do método de diferenças finitas.
11.3 Código associado
1 # @Author: eduardo
2 # @Date: 2020-11-08T12:19:15-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T01:53:03-02:00
5
6 import numpy as np
7 import matplotlib.pyplot as plt
8
9 L = 100 # m
10 D = 5000 # m^2 / h
11 U = 100 # mol/h
12 k = 2 # h^-1
13 dx = 10 # cm
14 n = int(L / dx)
15 cin = 100 # mol/L
16
17 A = np.zeros((n + 1, n + 1))
18 b = np.zeros(n + 1)
19
20 A[0, 0] = U + D / dx
21 A[0, 1] = -D / dx
22 b[0] = U * cin
23
24 A[n, n] = 1
25 A[n, n - 1] = -1
26 b[n] = 0
47
27
28 for i in range(1, n):
29 A[i, i] = -(2 * D / dx ** 2 + k)
30 A[i, i - 1] = D / dx ** 2 + U / (2 * dx)
31 A[i, i + 1] = D / dx ** 2 - U / (2 * dx)
32
33
34 u = np.linalg.solve(A, b)
35
36 x = np.arange(0, L + dx, dx)
37
38
39 plt.plot(x, u, color="#E00650")
40 plt.xlabel("x (cm)")
41 plt.ylabel("Concentraç~ao (mol/L)")
42 plt.xlim(0, L)
43 plt.grid()
44 plt.show()
48
12 Problema 12
12.1 Enunciado do problema
O crescimento de bactéria em um reator descont́ınuo utiliza um substrato solúvel. A
captação do substrato é representada por um modelo loǵıstico com limitação de Michaelis-
Menten. A morte de bactérias produz detritos que são subsequentemente convertidos a
substratos por hidrólise. Além disso, as bactérias também excretam alguns substratos
diretamente. Morte, hidrólise e excreção são todos simulados por reações de primeira
ordem.
Os balanços de massa podem ser escritos como:
dX
dt
= µmax
(
1− X
K
)(
S
Ks + S
)
X − kdX − keX
dC
dt
= kdX − khC
dS
dt
= keX + khC − µmax
(
1− X
K
)(
S
Ks + S
)
X
em que X, C e S são as concentrações (mg/L de bactéria, detritos e substrato,
respectivamente; µmax é a taxa de crescimento máxima (1/dia); K é a capacidade de
suporte loǵıstico (mg/L) ; Ks é a constante de meia saturação de Michaclis-Menten
(mg/L) ; kd é a taxa de mortalidade (1/dia); ke é a taxa de excreção (1/dia); e kh é a
taxa de hidrólise (1/d). Simule as concentrações de t = 0 a 100 dias, dadas as condições
iniciais X(0) = 1 mg/L, S(0) = 100 mg/L, e C(0) = 0 mg/L. Utilize os seguintes
parâmetros nos cálculos: µmax = 10 /dia, K = 10 mg/L, Ks = 10 mg/L kd = 0, 1/ dia,
ke = 0, 1 /dia e kh = 0, 1 /dia. Utilize os métodos numéricos de Euler explicito e Runge-
Kutta de quarta ordem, além de um solver de sua preferència.
49
12.2 Solução
12.2.1 Método de Euler
0 20 40 60 80 100
0
20
40
60
80
100
X
C
S
Figura 12.1: Resolução do problema 12 com o método de Euler.
12.2.2 Método de Runge-Kutta
0 20 40 60 80 100
0
20
40
60
80
100
X
C
S
Figura 12.2: Resolução do problema 12 com o método de Runge-Kutta de quarta ordem.
50
12.2.3 Solver
0 20 40 60 80 100
0
20
40
60
80
100
X
C
S
Figura 12.3: Resolução do problema 12 com método de Radau implementado por solver.
12.3 Código associado
1 # @Author: eduardo
2 # @Date: 2020-11-08T16:07:40-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T02:41:50-02:00
5
6 import numpy as np
7 from numpy import exp
8 import matplotlib.pyplot as plt
9 import RK_4
10 import euler_explicito
11 import scipy.integrate
12
13 cX0 = 1 # mg/L
14 cC0 = 0 # mg/L
15 cS0 = 100 # mg/L
16 c0 = [cX0, cC0, cS0]
17 dt = 0.1
18
19 umax = 10 # dia^-1
20 K = 10 # mg/L
21 ks = 10 # mg/L
22 kd = 0.1 # dia^-1
23 ke = 0.1 # dia^-1
24 kh = 0.1 # dia ^-1
25
51
26
27 def solve(t, c):
28 X, C, S = c
29 dXdt = umax * (1 - X / K) * (S / (ks + S)) * X - kd * X - ke * X
30 dCdt = kd * X - kh * C
31 dSdt = ke * X + kh * C - umax * (1 - X / K) * (S / (ks + S)) * X
32 return dXdt, dCdt, dSdt
33
34
35 t, y = euler_explicito.Euler_SE(0, 100, c0, dt, solve)
36 plt.plot(t, y[0], color="#E00650", label="X")
37 plt.plot(t, y[1], color="#2D2E7B", label="C")
38 plt.plot(t, y[2], color="#E8B038", label="S")
39 plt.legend()
40 plt.title('Euler')
41 plt.show()
42
43 t, y = RK_4.RK_4_SE(0, 100, c0, dt, solve)
44
45 plt.plot(t, y[0], color="#E00650", label="X")
46 plt.plot(t, y[1], color="#2D2E7B", label="C")
47 plt.plot(t, y[2], color="#E8B038", label="S")
48 plt.legend()
49 plt.title('Runge-Kutta')
50 plt.show()
51
52 sol = scipy.integrate.solve_ivp(solve, (0, 100),
53 c0,
54 method="Radau",
55 max_step=dt)
56
57 plt.plot(sol.t, sol.y[0], color="#E00650", label="X")
58 plt.plot(sol.t, sol.y[1], color="#2D2E7B", label="C")
59 plt.plot(sol.t, sol.y[2], color="#E8B038", label="S")
60 plt.legend()
61 plt.title('Solver')
62 plt.show()
52
13 Problema 13
13.1 Enunciado do problema
A equação de advecção-difusão é usada para calcular a distribuição de concentração ao
longo do comprimento de um biorreator retangular, conforme mostra a figura abaixo:
∂C
∂t
= D
∂2C
∂x2
− U ∂C
∂x
− kc
onde C é a concentração (mg/m3), t é o tempo (min), D é o coeficiente de difusão
m2/min, x é a distância ao longo do eixo longitudinal do tanque (m), em que x = 0
na entrada do tanque, U é a velocidade na direção x (m/min) e k é a taxa de reação
(min−1) pela qual o componente A alimentado ao biorreator é consumido.
Desenvolva um esquema para resolver essa cquação numericamente. Teste o seu es-
quema para k = 0, 15, D = 100 e U = 1 para um reator com comprimento de 10 m
operando em regime cont́ınuo. Use ∆x = 1 e um passo de ∆t = 0, 005 Suponha que a
concentração de entrada seja 100 e que a concentração inicial no bioreator seja zero. Faça
a simulação para o intervalo de t = 0 até 100 min, faça os gráficos necessários (ao longo
de x ) e avalie os resultados obtidos.
13.2 Solução
É importante destacar que ao implementar-se o problema com a discretização sugerida,
os erros ficaram muito maiores que os toleráveis. Desta forma, como é posśıvel reparar
no código associado, foi utilizada uma discretização com intervalos menores de modo a
refinar a solução. Infelizmente, não pode melhorar-se a discretização no espaço para que
não houvesse a violação das condições de estabilidade de Von-Neumann. A discretização
ficou na forma da Equação 13.1, sendo i o ı́ndice que diz respeito ao espaço e j o ı́ndice
que diz respeito ao tempo.
cj+1i − c
j
i
∆t
= D
(
cji+1 − 2c
j
i + c
j
i−1
∆x2
)
−
cj+1i+1 − c
j
i−1
∆x
− kcji (13.1)
A Figura 13.1 mostra a solução do problema após 100 minutos. Para tempos menores,
a solução é mostrada na Figura 13.2. Através desta figura, pode-se notar que a evolução
da concentração com o tempo ocorre de forma abrupta e após os minutos iniciais a solução
do problema pouco varia com o tempo.
53
0 2 4 6 8 10
94
95
96
97
98
99
100
x (m)
c
(k
g
/m
3
)
Após 100 min
Figura 13.1: Solução após 100 minutos para o problema 13.
x (cm)
0
2
4
6
8
10
Te
mp
o (
mi
n)
0
20
40
60
80
100
Co
nc
en
tra
çã
o 
(m
g/
m
3 )
0
20
40
60
80
100
Figura 13.2: Solução transiente para o problema 13.
54
13.2.1 Efeito de cada termo na equação
O pacote Numpy de Python calcula de forma rápida a transformada rápida de Fourier.
Isto é interessante pois permite de maneira fácil analisar o peso de cada parâmetro da
equação diferencial parcial. A Figura 13.3 mostra o efeito do termo difusivo, a Figura 13.4
o efeito do termo avectivo e a Figura 13.5 o efeito do termo reativo da equação. Os efeitos
compostos são mostrados na Figura 13.6. Estas figuras não representamo problema em
questão por terem condições inciais e contornos diferentes. Sua riqueza está, no entanto,
nos insights que elas fornecem acerca de cada parâmetro na equação.
0 200 400 600 800
0
20
40
60
80
Figura 13.3: D = 100. U = 0. k = 0.
0 200 400 600 800
0
20
40
60
80
Figura 13.4: D = 0. U = 1. k = 0.
55
0 200 400 600 800
0
20
40
60
80
Figura 13.5: D = 0. U = 0. k = 0,15.
0 200 400 600 800
0
20
40
60
80
Figura 13.6: D = 100. U = 1, k = 0,15.
13.3 Código associado
13.3.1 Problema principal
1 # @Author: eduardo
2 # @Date: 2020-11-18T00:38:26-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T02:42:37-02:00
5
56
6 import numpy as np
7 import matplotlib.pyplot as plt
8
9 # Entrar valores dos parâmetros e constantes
10 D = 100
11 U = 1
12 k = 0.15
13 dt = 0.0005 # Discretizaç~ao no tempo
14 dx = 0.5 # Discretizaç~ao no espaço
15 c0 = 100
16 tf = 100 # min
17 xf = 10 # m
18
19 x = np.arange(0, xf + dx, dx)
20
21 c = np.zeros_like(x)
22 c[0] = c0
23 c_novo = c.copy()
24
25 C = []
26 for j in range(int(tf / dt) + 1):
27 c_novo[0] = c0
28 # Iterar sobre os elementos no interior da malha
29 c_novo[1:-1] = dt * ((D / (dx**2) * (c[2:] - 2 * c[1:-1] + c[:-2]) - U /
30 (2 * dx) * (c[2:] - c[:-2]) - k * c[1:-1])) + c[1:-1]
31 # Impor condiç~oes de contorno dc/dt|c=100 = 0
32 c_novo[-1] = c_novo[-2]
33 c = c_novo.copy()
34 C.append(c)
35
36 C = np.array(C)
37
38 plt.plot(x, c, label="Após 100 min", color="#E00650")
39 plt.xlabel(r"$x\ (m)$")
40 plt.ylabel(r"$c\ (kg/m^3)$")
41 plt.legend()
42 plt.grid()
43 plt.xlim(0, 10)
44 plt.show()
45
46 dplot = 10000
47 u_plot = C[0:-1:dplot, :]
48
49 ysplot = []
50 for j in range(u_plot.shape[0]):
51 ys = dplot * np.ones(u_plot.shape[1]) * dt * j
52 ysplot.append(ys)
53
57
54 fig = plt.figure()
55 ax = fig.gca(projection='3d')
56 surf = ax.plot_wireframe(x, ysplot, u_plot, color='black')
57 ax.set_zlabel('Concentraç~ao ($mg/m^3$)')
58 ax.set_zlim(0, 100)
59 ax.set_xlabel('x (cm)')
60 ax.set_xlim(0, 10)
61 ax.set_ylabel('Tempo (min)')
62 ax.set_ylim(0, 100)
63 plt.show()
64
65
66 ax = plt.axes(projection='3d')
67 ax.plot_surface(x, ysplot, u_plot, rstride=1, cstride=1,
68 cmap='viridis', edgecolor='none')
69 plt.show()
13.3.2 Fast Fourier Transform (FFT)
1 # @Author: eduardo
2 # @Date: 2020-11-12T22:23:18-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T03:34:54-02:00
5
6 import numpy as np
7 import matplotlib.pyplot as plt
8 from scipy.integrate import odeint
9
10 L = 100 # Length of domain
11 dx = 0.1
12 N = int(L / dx) # Number of discrete points
13 x = np.arange(0, L, dx)
14
15 # Define discrete wavenumbers
16 kappa = 2 * np.pi * np.fft.fftfreq(N, d=dx)
17
18 # Initial condition
19 u0 = np.zeros_like(x)
20 u0[int((L / 2 - L / 5) / dx):int((L / 2 + L / 5) / dx)] = 1
21 print(u0)
22 dt = 0.05
23 t = np.arange(0, 5, dt)
24
25 D, U, k = 100, 1, 0.15
26
27
28 def rhsConvecAdvec(u, t, kappa):
58
29 uhat = np.fft.fft(u)
30 d_uhat = (1j) * kappa * uhat
31 dd_uhat = -np.power(kappa, 2) * uhat
32 d_u = np.fft.ifft(d_uhat)
33 dd_u = np.fft.ifft(dd_uhat)
34 du_dt = D * dd_u - U * d_u - k * u
35 return du_dt.real
36
37
38 u = odeint(rhsConvecAdvec, u0, t, args=(kappa, ))
39
40 plt.figure()
41 plt.imshow(np.flipud(u), aspect=8)
42 plt.set_cmap("magma")
43 plt.show()
59
14 Problema 14
Luss e Amundson (Stability of batch catalytic fluidized beds, AIChE J., 14 (2), 211,1968)
estudaram um modelo simplificado para a dinâmica de um reator cataĺıtico de leito flui-
dizado no qual uma reação irreverśıvel em fase gasosa A → B ocorre. As equações de
conversão obtidas a partir dos balanços de massa e energia, bem como a constante cinética
para esta reação, são apresentadas abaixo (chamaremos este sistema de equações como
conjunto 1)
dP
dτ
= Pe − P +Hg (Pp − P )
dT
dτ
= Te − T +HT (Tp − T ) +HW (TW − T )
dPp
dτ
=
Hg
A
[P − Pp(1 +K)]
dTp
dτ
=
HT
C
[(T − Tp) + FKPp]
K = 0, 0006 exp
(
20, 7− 15000
Tp
)
onde T é a temperatura na fase fluido (◦R), P é a pressão parcial do reagente na
fase fluido (atm), Tp é a temperatura na superf́ıcie do catalisador (
◦R), Pp é a pressão
parcial do reagente na superficie do catalisador (atm), K é a constante de velocidade
de reação (adimensional), τ é o tempo adimensional, e o subscrito e indica condições
na alimentação. As constantes adimensionais são dadas como Hg = 320, Te = 600,
HT = 266, 67, HW = 1, 6, TW = 720, F = 8000, A = 0, 17142, C = 205, 74 e Pe = 0, 1.
Aiken e Lapidus (An effective integration method for typical stiff systems, AIChE J.,
20 (2), 368,1974) susequentemente usaram o conjunto 1 como teste para um programa que
desenvolveram, mas reescreveram as equações introduzindo valores numéricos no sistema
e arredondando alguns coeficientes. Os autores obtiveram, então, o sistema de equações
abaixo, denominado aqui conjunto 2
dP
dτ
= 0, 1 + 320Pp − 321P
dT
dτ
= 1752− 269T + 267Tp
dPp
dτ
= 1, 88× 103 [P − Pp(1 +K)]
dTp
dτ
= 1, 3 (T − Tp) + 1, 04× 104KPp
K = 0, 0006 exp
(
20, 7− 15000
Tp
)
(a) Introduza os valores apresentados por Luss e Amundson no conjunto 1 e observe as
diferenças entre o conjunto 1 e o conjunto 2 .
(b) Encontre todas as soluções em regime permanente tanto para o conjunto 1 quanto
para o conjunto 2 no intervalo (500 ≤ T ≤ 1300)◦ R.
60
(c) Resolva tanto o conjunto 1 quanto o conjunto 2 utilizando como condições iniciais
P = 0, 1, T = 600, Pp = 0 e Tp = 761. Integre no intervalo 0 ≤ τ ≤ 1500.
(d) Explique as diferenças entre as soluções dinâmicas e em regime estacionário obtidas
para os conjuntos 1 e 2 .
14.1 Solução
14.2 Item a
As equações com os parâmetros de Luss e Amundson são:
dP
dτ
= 0, 1− P + 320 (Pp − P )
dT
dτ
= 600− T + 266, 67 (Tp − T ) + 1, 6 (720− T )
dPp
dτ
=
320
0, 17142
[P − Pp(1 +K)]
dTp
dτ
=
266, 67
205, 74
[(T − Tp) + 8000KPp]
K = 0, 0006 exp
(
20, 7− 15000
Tp
)
Nota-se que as diferenças são pontuais e, percentualmente, moderadas.
14.2.1 Solução estacionária
Para o sistema de equações I, encontrar a solução estacionária para o problema consiste
em encontrar todas as soluções estacionárias para
0 = Pe − P +Hg (Pp − P )
0 = Te − T +HT (Tp − T ) +HW (TW − T )
0 = P − Pp(1 +K)
0 = T − Tp + FKPp
K = 0, 0006 exp
(
20, 7− 15000
Tp
)
dentro do intervalo pedido. Observe que, ao utilizar-se a segunda equação, pode-se
obter o valor de Tp somente em função de T . Ao utilizar-se a quinta equação, pode-se
obter o valor de K somente em função de Tp, já conhecida. Com a quarta equação, é
posśıvel obter o valor de Pp somente em função de valores conhecidos e finalmente, com
a primeira equação, é posśıvel computar P . Para cada T , estes valores são solução para
o sistema não linear se a terceira equação resultar em zero.
Desta forma, um posśıvel algoŕıtmo para calcular os pontos estacionários do problema
seria:
61
1. Com o primeiro T do intervalo, calcular Tp com
Tp = −
Te − T −HtT +Hw ∗ (Tw − T )
Ht
;
2. Com T e TP , calcular K com
K = 0, 0006 exp
(
20, 7− 15000
Tp
)
;
3. Com T , TP e K, calcular PP com
PP =
T − Tp
FK
;
4. Com os valores já conhecidos, calcular P com
P = PP (1 +K);
5. Calcular o valor da função auxiliar:
f = Pe − P +Hg(PP − P );
6. Repetir para todos os Ts do intervalo.
Sabe-se que quando a função auxiliar for zero, passa-se por um ponto que satisfaz o
sistema de equações para o estado estacionário.
A Figura 14.1 mostra o valor da função auxiliar versus a temperatura.
700 750 800 850 900 950 1,000
−0.1
−5 · 10−2
0
5 · 10−2
0.1
Temperatura (ºR)
F
u
n
çã
o
A
u
x
il
ia
r
Figura 14.1: Valor da função auxiliar para o cálculo do estado estacionário na questão
14.
62
Valores menores que 675 e maiores de 1000 estão fora do gráfico pois a função não
muda de sinal neste intervalo. Assim, percebe-seque existem três estados estacionários.
Utilizando os pontos que fazem a função mudar de sinal para refinar a solução, obtém-se:
Estado estacionário I - Conjunto I
T (R) 690,45
TP (R) 690,61
k 0,0002164
P (atm) 0,09353
PP (atm) 0,09351
Tabela 14.1: Valores obtidos para o primeiro estado estacionário.
Estado estacionário II - Conjunto I
T (R) 758,34
TP (R) 759,17
P (atm) 0,06705
PP (atm) 0,06694
k 0,001538
Tabela 14.2: Valores obtidos para o segundo estado estacionário.
Estado estacionário III - Conjunto I
T (R) 912,77
TP (R) 915,10
P (atm) 0,006822
PP (atm) 0,0065304
k 0,004459
Tabela 14.3: Valores obtidos para o terceiro estado estacionário.
Para o conjunto II de equações, o procedimento é exatamente o mesmo. Todavia, para
este sistema de equações, encontrou-se somente uma solução estacionária, apresentada na
Tabela 14.4:
Estado estacionário - Conjunto II
T (R) 1208,28
TP (R) 1210,78
PP (atm) 0,0001268
P (atm) 0,0004386
k 2,442
Tabela 14.4: Valores obtidos para o estado estacionário do conjunto de equações.
14.2.2 Solução transiente
A Figura 14.2 apresenta as soluções transientes para a pressão do conjunto I. A Figura 14.3
apresenta a solução para as temperaturas.
63
0 200 400 600 800 1,000 1,200 1,400
0
2 · 10−2
4 · 10−2
6 · 10−2
8 · 10−2
0.1
τ (s)
P
re
ss
ão
(a
tm
)
P
Pp
Figura 14.2: Solução transiente para as pressões do conjunto I.
0 200 400 600 800 1,000 1,200 1,400
600
650
700
750
800
850
900
τ (s)
T
em
p
er
at
u
ra
(º
R
)
T
Tp
Figura 14.3: Solução transiente para as temperaturas do conjunto I.
Para o conjunto II, as soluções das pressões e temperaturas são apresentadas na Fi-
gura 14.4 e na Figura 14.5, respectivamente.
64
0 200 400 600 800 1,000 1,200 1,400
0
2 · 10−2
4 · 10−2
6 · 10−2
8 · 10−2
0.1
τ (s)
T
em
p
er
at
u
ra
(º
R
)
P
Pp
Figura 14.4: transiente para as pressões do conjunto II
0 200 400 600 800 1,000 1,200 1,400
600
700
800
900
1,000
1,100
1,200
τ (s)
T
em
p
er
at
u
ra
(º
R
)
T
Tp
Figura 14.5: Solução para as temperaturas do conjunto II.
14.2.3 Item d
A diferença entre os estados estacionários se deve às mudanças nos parâmetros das
equações. Isto evidencia que, mesmo com um modelo exatamente igual em termos de
estrutura das equações e partindo do mesmo ponto (condições iniciais iguais), pode-se
obter variações significativas nos resultados de um modelo matemático no fenômeno f́ısico,
caso este apresente sensibilidade aos parâmetros. Esta discussão será mais aprofundada
no problema 18.
65
14.3 Código associado
14.3.1 Solução transiente - Sistema I
1 # @Author: eduardo
2 # @Date: 2020-11-11T23:25:48-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T02:44:10-02:00
5
6 import numpy as np
7 from numpy import exp
8 import matplotlib.pyplot as plt
9 import RK_4
10 import euler_explicito
11 import scipy.integrate
12
13 Hg = 320
14 Te = 600
15 Ht = 266.67
16 Hw = 1.6
17 Tw = 720
18 F = 8000
19 A = 0.17142
20 C = 205.74
21 Pe = 0.1
22
23
24 def solve(tau, c):
25 P, T, Pp, Tp = c
26 K = 0.0006 * exp(20.7 - 15000 / Tp)
27 dPdtau = Pe - P + Hg * (Pp - P)
28 dTdtau = Te - T + Ht * (Tp - T) + Hw * (Tw - T)
29 dPpdtau = Hg / A * (P - Pp * (1 + K))
30 dTpdtau = Ht / C * ((T - Tp) + F * K * Pp)
31 return dPdtau, dTdtau, dPpdtau, dTpdtau
32
33
34 c0 = [0.1, 600, 0, 761]
35
36 # t, c = euler_explicito.Euler_SE(0, 100, c0, dt, solve)
37
38 dt = 1
39 sol = scipy.integrate.solve_ivp(solve, (0, 1500),
40 c0,
41 method="Radau",
42 max_step=dt)
43
44 plt.plot(sol.t, sol.y[1], color="#2D2E7B", label="T")
66
45 plt.plot(sol.t, sol.y[3], label="$T_p$")
46 plt.xlabel(r'$ \tau $')
47 plt.ylabel("Temperatura (ºR)")
48 plt.grid()
49 plt.legend()
50 plt.show()
51
52 plt.plot(sol.t, sol.y[0], color="#E00650", label="P")
53 plt.plot(sol.t, sol.y[2], color="#E8B038", label="$P_p$")
54 plt.xlabel(r'$ \tau $')
55 plt.ylabel('Press~ao (atm)')
56 plt.grid()
57 plt.legend()
58 plt.show()
14.3.2 Solução transiente - Sistema I
1 # @Author: eduardo
2 # @Date: 2020-11-12T11:45:43-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T02:44:24-02:00
5 import numpy as np
6 from numpy import exp
7 import matplotlib.pyplot as plt
8 import RK_4
9 import euler_explicito
10 import scipy.integrate
11
12
13 def solve(tau, c):
14 P, T, Pp, Tp = c
15 K = 0.0006 * exp(20.7 - 15000 / Tp)
16 dPdtau = 0.1 + 320 * Pp - 321 * P
17 dTdtau = 1752 - 269 * T + 267 * Tp
18 dPpdtau = 188e3 * (P - Pp * (1 + K))
19 dTpdtau = 1.3 * (T - Tp) + 1.04e4 * K * Pp
20 return dPdtau, dTdtau, dPpdtau, dTpdtau
21
22
23 c0 = [0.1, 600, 0, 761]
24
25 sol = scipy.integrate.solve_ivp(solve, (0, 1500), c0, method="Radau")
26
27
28 plt.plot(sol.t, sol.y[1], color="#2D2E7B", label="T")
29 plt.plot(sol.t, sol.y[3], label="$T_p$")
30 plt.xlabel(r'$ \tau $')
67
31 plt.ylabel("Temperatura (ºR)")
32 plt.grid()
33 plt.legend()
34 plt.show()
35
36 plt.plot(sol.t, sol.y[0], color="#E00650", label="P")
37 plt.plot(sol.t, sol.y[2], color="#E8B038", label="$P_p$")
38 plt.xlabel(r'$ \tau $')
39 plt.ylabel('Press~ao (atm)')
40 plt.grid()
41 plt.legend()
42 plt.show()
14.3.3 Solução estacionária - Sistema I
1 # @Author: eduardo
2 # @Date: 2020-11-20T16:41:42-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-20T20:28:26-02:00
5
6 import numpy as np
7 from numpy import exp
8 from scipy.optimize import fsolve
9 import matplotlib.pyplot as plt
10
11 Hg = 320
12 Te = 600
13 Ht = 266.67
14 Hw = 1.6
15 Tw = 720
16 F = 8000
17 A = 0.17142
18 C = 205.74
19 Pe = 0.1
20
21
22 def f1(T):
23 # Tp
24 return -(Te - T - Ht * T + Hw * (Tw - T)) / Ht
25
26
27 def f2(Tp):
28 # K
29 return 0.0006 * exp(20.7 - 15000 / Tp)
30
31
32 def f3(K, Tp, T):
68
33 # Pp
34 return -(T - Tp) / (F * K)
35
36
37 def f4(Pp, K):
38 # P
39 return Pp * (1 + K)
40
41
42 def f5(Pp, P):
43 return Pe - P + Hg * (Pp - P)
44
45
46 T_guess = np.arange(500, 1301, 0.01)
47
48 ee = []
49 sol = []
50 for guess in T_guess:
51 add = False
52 Tp = f1(guess)
53 K = f2(Tp)
54 Pp = f3(K, Tp, guess)
55 P = f4(Pp, K)
56 sol.append(f5(Pp, P))
57 if len(sol) > 2:
58 if sol[-1] < 0 and sol[-2] > 0:
59 ee.append([guess, Tp, Pp, P, K])
60 if sol[-1] > 0 and sol[-2] < 0:
61 ee.append([guess, Tp, Pp, P, K])
62
63 plt.plot(T_guess, sol)
64 plt.xlabel('Temperatura (ºR)')
65 plt.ylabel('Funç~ao Auxiliar')
66 plt.ylim(-0.1, .1)
67 plt.xlim(675, 1000)
68 plt.grid()
69 plt.show()
70
71
72 def solve(x):
73 T, Tp, Pp, P, K = x
74 f1 = K - 0.0006 * exp(20.7 - 15000 / Tp)
75 f2 = Pe - P + Hg * (Pp - P)
76 f3 = Te - T + Ht * (Tp - T) + Hw * (Tw - T)
77 f4 = Hg / A * (P - Pp * (1 + K))
78 f5 = Ht / C * ((T - Tp) + F * K * Pp)
79 return f1, f2, f3, f4, f5
80
69
81
82 print(fsolve(solve, ee[0], factor=0.1))
83 print(fsolve(solve, ee[1]))
84 print(fsolve(solve, ee[2]))
14.3.4 Solução estacionária - Sistema II
1 # @Author: eduardo
2 # @Date: 2020-11-20T20:13:03-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T02:15:41-02:00
5
6 import numpy as np
7 from numpy import exp
8 from scipy.optimize import fsolve
9 import matplotlib.pyplot as plt
10
11 Hg = 320
12 Te = 600
13 Ht = 266.67
14 Hw = 1.6
15 Tw = 720
16 F = 8000
17 A = 0.17142
18 C = 205.74
19 Pe = 0.1
20
21
22 def f1(T):
23 # Tp
24 return (1752 - 269 * T) / -267
25
26
27 def f2(Tp):
28 # K
29 return 0.0006 * exp(20.7 - 15000 / Tp)
30
31
32 def f3(K, Tp, T):
33 # Pp
34 return -1.3 * (T - Tp) / (1.04e4 * K)
35
36
37 def f4(Pp, K):
38 # P
39 return Pp * (1 + K)
40
70
41
42 def f5(Pp, P):
43 return 0.1 + 320 * Pp - 321 * P
44
45
46 T_guess = np.arange(500, 1301, 0.01)
47
48 ee = []
49 sol = []
50 for guess in T_guess:
51 add = False
52 Tp = f1(guess)
53 K = f2(Tp)
54 Pp = f3(K, Tp, guess)
55 P = f4(Pp, K)
56 sol.append(f5(Pp,P))
57 if len(sol) > 2:
58 if sol[-1] < 0 and sol[-2] > 0:
59 ee.append([guess, Tp, Pp, P, K])
60 if sol[-1] > 0 and sol[-2] < 0:
61 ee.append([guess, Tp, Pp, P, K])
62 print(ee)
63 plt.plot(T_guess, sol)
64 plt.xlabel('Temperatura (ºR)')
65 plt.ylabel('Funç~ao Auxiliar')
66 plt.ylim(-0.1, .1)
67 # plt.xlim(675, 1000)
68 plt.grid()
69 plt.show()
70
71
72 def solve(x):
73 T, Tp, Pp, P, K = x
74 f1 = K - 0.0006 * exp(20.7 - 15000 / Tp)
75 f2 = 0.1 + 320 * Pp - 321 * P
76 f3 = 1752 - 269 * T + 267 * Tp
77 f4 = P - Pp * (1 + K)
78 f5 = 1.3 * ((T - Tp) + 1.04e4 * K * Pp)
79 return f1, f2, f3, f4, f5
80
81
82 print(fsolve(solve, ee[0], factor=10))
71
15 Problema 15
15.1 Enunciado do problema
Beltrami (2002) e Gray (2006) postularam o seguinte problema para representar a dinâmica
de duas populações de bactérias competitivas. As variáveis são as densidades de po-
pulação de cada uma das espécies. O termo entre parênteses representa o crescimento
devido às limitações do ambiente e o último termo representa os efeitos negativos da
competição entre as espécies. O primeiro termo representa a densidade de população se
apenas uma das espécies estivesse presente. O segundo termo é proporcional ao número
de interações entre as espécies e representa o decĺınio da densidade de população devido
à competição:
dx1
dt
= 9x1
(
1− x1
9
)
− 2x1x2
dx2
dt
= 6x2
(
1− x2
12
)
− x1x2
Utilize o método de Euler expĺıcito para encontrar uma solução para esse sistema de
EDOs quando as seguintes densidades de população estão presentes inicialmente em um
certo meio: (x1, 0;x2, 0) = (3; 1), (7; 4), (5; 2), (5, 01; 2). Apresente os resultados na forma
de gráficos e faça comentários sobre o estado estacionário em cada caso.
15.2 Solução
Este problema apresenta uma grande quantidade de estados permanentes, que variam de
acordo com o input inicial.
15.2.1 Quantidade inicial: (3 ; 1)
0 1 2 3 4 5 6
0
2
4
6
8
x1
x2
Figura 15.1: Solução para quantidade inicial de (3 ; 1) para o problema 15.
Neste caso, o modelo convergiu rapidamente para o ponto estacionário. x2 apresentou
um leve aumento antes de descer.
72
15.2.2 Quantidade inicial: (7 ; 4)
0 1 2 3 4 5 6
0
2
4
6
8
10
12 x1
x2
Figura 15.2: Solução para quantidade inicial de (7 ; 4) para o problema 15.
O modelo convergiu para o ponto estacionário mais rápido do que no item anterior.
Todavia, antes da convergência, a concentração de bactérias apresentou uma dinâmica
bastante interessantes, com fortes variações no intervalo (0,1).
15.2.3 Quantidade inicial: (5 ; 2)
0 1 2 3 4 5 6
2
2.5
3
3.5
4
4.5
5
x1
x2
Figura 15.3: Solução para quantidade inicial de (5 ; 2) para o problema 15.
A estimativa inicial foi um estado estacionário.
73
15.2.4 Quantidade inicial: (5,01 ; 2)
0 1 2 3 4 5 6
0
2
4
6
8
x1
x2
Figura 15.4: Solução para quantidade inicial de (5,01 ; 2) para o problema 15.
A convergência ocorreu de forma sutil e monótona para o estado permanente.
15.3 Código associado
1 # @Author: eduardo
2 # @Date: 2020-11-08T21:39:02-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T01:54:23-02:00
5
6 import euler_explicito
7 import matplotlib.pyplot as plt
8
9
10 def solve(t, x):
11 x1, x2 = x
12 dx1dt = 9 * x1 * (1 - x1 / 9) - 2 * x1 * x2
13 dx2dt = 6 * x2 * (1 - x2 / 12) - x1 * x2
14 return dx1dt, dx2dt
15
16
17 ci = [[3, 1], [7, 4], [5, 2], [5.01, 2]]
18
19 dx = 0.1
20 for i, c0 in enumerate(ci):
21 ti, xi = euler_explicito.Euler_SE(0, 6, c0, dx, solve)
22 plt.plot(ti, xi[0], color="#E00650", label='x1')
23 plt.plot(ti, xi[1], color="#E8B038", label='x2')
74
24 plt.grid()
25 plt.legend()
26 plt.show()
75
16 Problema 16
16.1 Enunciado do problema
Dependendo dos valores das constantes de velocidade, os sistemas reativos podem ser
stiff. Um problema stiff bem conhecido é o exemplo de Robertson, que consiste em EDOs
não lineares caracterizadas por uma grande diferença entre os valores das constantes de
velocidade. As três reações que ocorrem nesse sistema são:
A
k1→ B
B +B
k2→ B + C
B + C
k3→ A+ C
onde as constantes de velocidade são kI = 0, 04, k2 = 3 · 107, k3 = 1 · 104e as
concentrações iniciais das três espécies são CA0 = 1, CB0 = 0 e CCO = 0
(a) Assuma que as reações são conduzidas em um reator batelada operado em condições
isotérmicas e derive o sistema de EDOs.
(b) Utilize um solver adequado para problemas stiff e plote a solução para t ∈ [0, 100].
(c) Avalie o desempenho de solvers não-stiff e stiff (MATLAB ode45 e ode15s, por
exemplo) analisando o número de passos necessários.
16.2 Solução
16.2.1 Item a
Considerando que todas as reações são elementares, o sistema de equações diferenciais
ordinárias fica:
dca
dt
= −k1ca + k3cbcc (16.1)
dcb
dt
= k1ca − k2c2b +
1
2
k2c
2
b − k3cbcc (16.2)
dcc
dt
=
1
2
k2c
2
b (16.3)
16.2.2 Items b e c
A Figura 16.1 apresenta a solução para o problema.
76
0 20 40 60 80 100
0
0.2
0.4
0.6
0.8
1
Tempo
C
on
ce
n
tr
aç
ão
Ca (stiff)
Cb (stiff)
Cc (stiff)
Ca (não-stiff)
Cb (não-stiff)
Cc (não-stiff)
Figura 16.1: Solução stiff e não-stiff para o problema 16.
Note como as soluções praticamente se sobrepõe. Todavia, para chegar a este resultado
foi necessário uma discretização muito menor para o método não-stiff. Para o método
de Radau, que consiste em um método de Runge-Kutta impĺıcito, foram necessários 21
pontos na discretização. Para o solver que implementa o método exṕıcito de Runge-
Kutta de 4ª ordem, foram necessários 100002 pontos na discretização para a solução não
divergir.
16.3 Código associado
1 # @Author: eduardo
2 # @Date: 2020-11-12T18:50:09-02:00
3 # @Last modified by: eduardo
4 # @Last modified time: 2020-11-21T02:46:26-02:00
5
6 import numpy as np
7 from numpy import exp
8 import matplotlib.pyplot as plt
9 import scipy.integrate
10
11 k1 = 0.04
12 k2 = 3e7
13 k3 = 1e4
14
15 Ca0 = 1
16 Cb0 = 0
17 Cc0 = 0
18 C0 = [Ca0, Cb0, Cc0]
19
77
20
21 def solve(t, c):
22 Ca, Cb, Cc = c
23 dCadt = -k1 * Ca + k3 * Cb * Cc
24 dCbdt = k1 * Ca - 0.5 * k2 * Cb**2 - k3 * Cb * Cc
25 dCcdt = 0.5 * k2 * Cb**2
26 return dCadt, dCbdt, dCcdt
27
28
29 solstiff = scipy.integrate.solve_ivp(solve, (0, 100), C0, method="Radau")
30 solnstiff = scipy.integrate.solve_ivp(solve, (0, 100),
31 C0,
32 method="RK45",
33 max_step=0.001)
34
35 plt.plot(solstiff.t, solstiff.y[0], color="#E00650", label="$C_a$ (stiff)")
36 plt.plot(solstiff.t, solstiff.y[1], color="#2D2E7B", label="$C_b$ (stiff)")
37 plt.plot(solstiff.t, solstiff.y[2], color="#E8B038", label="$C_c$ (stiff)")
38 plt.xlabel("Tempo")
39 plt.ylabel("Concentraç~ao")
40 plt.grid()
41 plt.legend()
42 plt.xlim(0, 100)
43 plt.ylim(0, 1)
44 plt.show()
45
46
47
48 plt.plot(solnstiff.t,
49 solnstiff.y[0],
50 linestyle='--',
51 label="$C_a$ (n~ao-stiff)")
52 plt.plot(solnstiff.t,
53 solnstiff.y[1],
54 linestyle='--',
55 label="$C_b$ (n~ao-stiff)")
56 plt.plot(solnstiff.t,
57 solnstiff.y[2],
58 linestyle='--',
59 label="$C_c$ (n~ao-stiff)")
60 plt.xlabel("Tempo")
61 plt.ylabel("Concentraç~ao")
62 plt.grid()
63 plt.legend()
64 plt.xlim(0, 100)
65 plt.ylim(0, 1)
66 plt.show()
78
17 Problema 17
17.1 Enunciado do problema
O seguinte sistema de equações representa um problema de reação com transferência de
calor em um pellet de catalisador poroso:
∂c
∂t
=
1
r2
∂
∂r
(
r2
∂c
∂r
)
− φ2 ·R(c, T ), ∂c
∂r
(0, t) = 0, c(1, t) = 1
Le
∂T
∂t
=
1
r2
∂
∂r
(
r2
∂T
∂r
)
+ β · φ2 ·R(c, T ), ∂T
∂r
(0, t) = 0, T (1, t) = 1
R(c, T ) = c · exp
[
γ
(
1− 1
T
)]
Resolva este problema utilizando o método das diferenças finitas considerando o se-
guinte conjunto de parâmetros: φ = 1, 1, γ = 30, β = 0, 15 e Le = 1050. Apresente o
resultado graficamente.
17.2 Solução
Para discretizar as equações é necessário, inicialmente, aplicar a regra da cadeia.

Continue navegando