You are on page 1of 16

Introdução ao Matlab

2a Parte

Carlos André Vaz Junior


cavj@bol.com.br
2003
2a Parte: Objetivos

1) Revisão da 1a Parte
2) Introdução ao Controle do Fluxo de Execução
3) Simulação de Processos com Perturbações Simples
4) Simulação em Batelada
5) Comparação Gráfica (visualização simultânea)
1) Revisão da 1 a Parte - Exercício:

Vamos revisar a parte anterior através de mais um exemplo: modelar um reator com
aquecimento.

Deduzindo o modelo do reator chegamos as equações diferenciais (5) e (6) do


arquivo de apresentação. O programa Matlab para simular esse modelo é idêntico ao
utilizado antes para duas variáveis dependentes:

% Definição das constantes do modelo


K =2; % m2/h
hr =5; %m
A =2; %m2
Fe =10; % m3/h
Cp = 0.75; % kJ/(kg . K)
Ro = 1000; % kg/m3
Te = 530; %K
Th =540; %K
U = 150; % kJ/(m2 . s . K)

% Tempo de simulação
t = 0.0 : 0.01 : 10.0; %h

% Simulação do modelo
[t,y]=ode45('dydt2',t,[(5/A) Th],[],[K hr A Fe Cp Ro U Te Th]);

% Visualização da simulação
figure(1); plot(t,y(:,1));
title('Tanque de aquecimento');
xlabel('Tempo (h)'); ylabel('Altura (m)');
figure(2); plot(t,y(:,2));
title('Tanque de aquecimento');
xlabel('Tempo (h)'); ylabel('Temperatura (K)');
O arquivo .m com as novas equações é apresentado abaixo:

function dy = dydt2(t,y,flag,par);

K = par(1);
hr = par(2);
A = par(3);
Fe = par(4);
Cp = par(5);
Ro = par(6);
U = par(7);
Te = par(8);
Th = par(9);

dy(1) = (Fe-K*(y(1)-hr))/A;
dy(2) = (1/y(1))*((Fe*Te/A)+(U*Th/(Ro*Cp)) - ((Fe/A)+(U/(Ro*Cp)))*y(2));
dy = dy(:);
2) Revisão da 1a Parte – Estruturas Lógicas:

Já vimos antes mas é importante relembrar a função e a sintaxe das estruturas


lógicas (ou controle de fluxo de execução) usadas no Matlab. São estruturas comuns as
principais linguagens de programação, e fundamentais para criar programas mais
sofisticados.

DICA: entenda a funcionalidade de cada função. Entender é muito mais importante do


que decorar a sintaxe. Use o Help para saber a sintaxe!

a) If:

if I == J
A(I,J) = 2;
elseif abs(I-J) == 1
A(I,J) = -1;
else
A(I,J) = 0;
end

b) Case:

SWITCH switch_expr
CASE case_expr,
statement, ..., statement
CASE {case_expr1, case_expr2, case_expr3,...}
statement, ..., statement
...
OTHERWISE,
statement, ..., statement
END

c) While:

while norm(E+F-E,1) > 0,


E = E + F;
F = A*F/N;
N = N + 1;
end
d) For:

for J = 1:N,
A(I,J) = 1/(I+J-1);
end
3) Exemplo 1 - CSTR com reação exotérmica:

O modelo matemático para esse problema foi deduzido na aula teórica, assim vamos
passar diretor para a simulação.

Observação:
Cre: concentração na corrente de entrada
Cr: concentração no reator
Cr0: concentração inicial dentro do reator

As equações diferenciais que descrevem o reator são as equações (7) e (8). Novamente
temos duas variáveis dependentes do tempo: concentração do reator e temperatura.

O programa principal é apresentado abaixo. Observe que não existe nenhuma mudança
significativa em relação ao que já foi usado na aula passada.

% Definição das constantes do modelo


U =50; % BTU/(h.ft2.R)
A = 120; % ft2
DH = -30000; % BTU/lbm
Ro = 50; % lb/ft3
Cp = 0.75; % BTU/(lbm.R)
E = 30000; % BTU/lbm
R = 1.99; % BTU/(lbm.R)
k0 = 7.08e10; % 1/h
V =48; % ft3
Te = 580; %R
Th = 550; %R
Fe = 18; % ft3/h
Cre = 0.48; % lbm/ft3

% Tempo de simulação
t = 0.0 : 0.01 : 10.0; %h

% Condições iniciais
Cr0 = 0.16; % lbm/ft3
T0 = 603; %R

% Simulação do modelo
[t,y] = ode45('dcstr',t,[Cr0 T0],[],[U A DH Ro Cp E R k0 V Te Th Fe Cre]);

% Visualização da simulação
figure(1);
plot(t,y(:,1));
title('CSTR com Reação Exotérmica');
xlabel('Tempo (h)');
ylabel('Concentração de Reagente (lbm/ft3)');
figure(2);
plot(t,y(:,2));
title('CSTR com Reação Exotérmica');
xlabel('Tempo (h)');
ylabel('Temperatura (R)');

A codificação do arquivo .m é apresentada a seguir:

function dy = dcstr(t,y,flag,par);

U = par(1);
A = par(2);
DH = par(3);
Ro = par(4);
Cp = par(5);
E = par(6);
R = par(7);
k0 = par(8);
V = par(9);
Te = par(10);
Th = par(11);
Fe = par(12);
Cre = par(13);

dy(1) = (Fe/V)*(Cre-y(1)) - k0*exp(-E/(R*y(2)))*y(1);


dy(2) = (Fe/V)*(Te-y(2)) + ((DH*k0*exp(-E/(R*y(2)))*y(1))/(Ro*Cp)) - ...
(U*A*(y(2)-Th)/(V*Ro*Cp));

dy = dy(:);

DICA: caso lhe pareça confusa a nomenclatura y(1) , y(2), dy(1), dy(2), faça a tabela
recomendada na aula passada!

DICA: quando uma equação é muito grande e precisa ser dividida em duas ou mais
linhas, use “...” para continuar na linha seguinte.
4) Exemplo 2 - Aplicando perturbações no CSTR:

Analisando os gráficos do exemplo anterior vemos que o reator tende ao estado


estacionário. Seria interessante introduzir perturbações e observar como o reator se
comporta.

A maneira mais simples de introduzir uma perturbação simples em um modelo


simulado em Matlab é computando uma perturbação degrau. Uma perturbação degrau em
uma entrada u do sistema é tal que:

u = u0 , t < tdegrau
u = u0 + du, t > tdegrau

Ou seja: antes do degrau a entrada u vale u0. Após o tempo determinado para que o
degrau ocorra (tdegrau) temos que u passa a valer u0 + du.

O degrau será aplicado no parâmetro “Fe” (vazão de entrada). A idéia é que após um
tempo “td” o valor de “Fe” seja dobrado. A única alteração necessária no programa
principal é passar “td” (tempo em que o degrau ocorre) e a amplitude do degrau para a
função chamada pela ODE45. O programa principal fica assim:

% Definição das constantes do modelo


U =50; % BTU/(h.ft2.R)
A = 120; % ft2
DH = -30000; % BTU/lbm
Ro = 50; % lb/ft3
Cp = 0.75; % BTU/(lbm.R)
E = 30000; % BTU/lbm
R = 1.99; % BTU/(lbm.R)
k0 = 7.08e10; % 1/h
V =48; % ft3
Te = 580; %R
Th = 550; %R
Fe = 18; % ft3/h
Cre = 0.48; % lbm/ft3

% Tempo de simulação
t = 0.0 : 0.01 : 10.0; %h

% Perturbação na vazão de entrada


td = 5.0; %Tempo onde ocorre o degrau
fd = 2*Fe; %Valor assumido após o degrau

% Condições iniciais
Cr0 = 0.16; % lbm/ft3
T0 = 603; %R

% Simulação do modelo
[t,y] = ode45('dcstrdeg',t,[Cr0 T0],[],[U A DH Ro Cp E R k0 V Te Th Fe Cre],[td fd]);

% Visualização da simulação
figure(1);
plot(t,y(:,1));
title('CSTR com Reação Exotérmica');
xlabel('Tempo (h)');
ylabel('Concentração de Reagente (lbm/ft3)');
figure(2);
plot(t,y(:,2));
title('CSTR com Reação Exotérmica');
xlabel('Tempo (h)');
ylabel('Temperatura (R)');

Observe que além do vetor: ([U A DH Ro Cp E R k0 V Te Th Fe Cre]) estamos


mandando também o vetor: ([td fd]). Poderíamos passar esses dois novos parâmetros no
primeiro vetor também. Optamos por passar em dois vetores separados para mostrar como
o arquivo .m deve ser programado para essa situação:

function dy = dcstrdeg(t,y,flag,par,deg);

U = par(1); A = par(2);
DH = par(3); Ro = par(4);
Cp = par(5); E = par(6);
R = par(7); k0 = par(8);
V = par(9); Te = par(10);
Th = par(11);

%Verifica a ocorrência de degrau:


if t >= deg(1)
Fe = deg(2);
else
Fe = par(12);
end;

Cre = par(13);

dy(1) = (Fe/V)*(Cre-y(1)) - k0*exp(-E/(R*y(2)))*y(1);


dy(2) = (Fe/V)*(Te-y(2)) + ...
((DH*k0*exp(-E/(R*y(2)))*y(1))/(Ro*Cp)) - ...
(U*A*(y(2)-Th)/(V*Ro*Cp));
dy = dy(:);

Explicando:

function dy = dcstrdeg(t,y,flag,par,deg);

onde “par” pega o vetor “[U A DH Ro Cp E R k0 V Te Th Fe Cre] e onde “deg” pega


o vetor “[td fd]”.

Caso t > td, faça Fe igual a deg(2). Caso contrário faça Fe igual a par(12):

if t >= deg(1)
Fe = deg(2);
else
Fe = par(12);
end;

essa é toda codificação necessária para o degrau desejado.

Analise os gráficos, experimente modificar o tempo do degrau e a sua amplitude. Veja


como o reator converge em cada caso!
5) Exemplo 3 - Simulação em batelada:

Uma das grandes vantagens no uso de ferramentas computacionais é reduzir o nosso


esforço repetitivo, tarefa para a qual o computador é muito eficiente. Supomos que temos
um processo no qual gostaríamos de testar uma serie de condições iniciais. Para cada nova
condição inicial teríamos de refazer todas as contas. Um esforço enorme! As linguagens de
programação, e o Matlab em particular, resolvem esse problema facilmente usando o já
apresentado comando “for”. Mostraremos essa técnica de resolução a seguir:

Usando o mesmo reator do exemplo 1 dessa aula (CSTR com reação exotérmica), a
codificação do programa principal é exibida abaixo:

% Definição das constantes do modelo


U =50; % BTU/(h.ft2.R)
A = 120; % ft2
DH = -30000; % BTU/lbm
Ro = 50; % lb/ft3
Cp = 0.75; % BTU/(lbm.R)
E = 30000; % BTU/lbm
R = 1.99; % BTU/(lbm.R)
k0 = 7.08e10; % 1/h
V =48; % ft3
Te = 580; %R
Th = 550; %R
Fe = 18; % ft3/h
Cre = 0.48; % lbm/ft3

% Tempo de simulação
t = 0.0 : 0.01 : 10.0; %h

% Condições iniciais
Cr0 = [0.16 0.32 0.48 0.64]; % lbm/ft3
T0 = 603; %R

% Simulação e visualização do modelo em batelada


cor = 'brmk ';
leg = ['Cr0=0.16'; 'Cr0=0.32'; 'Cr0=0.48'; 'Cr0=0.64'];
for aux = 1 : length(Cr0)
[t,y] = ode45('dcstr',t,[Cr0(aux) T0],[], [U A DH Ro Cp E R k0 V Te Th Fe Cre]);

% Visualização da simulação
figure(1); hold on;
plot(t,y(:,1),cor(aux)); title('CSTR com Reação Exotérmica');
xlabel('Tempo (h)');
ylabel('Concentração de Reagente (lbm/ft3)');
figure(2); hold on;
plot(t,y(:,2),cor(aux)); title('CSTR com Reação Exotérmica');
xlabel('Tempo (h)');
ylabel('Temperatura (R)');
end;

figure(1); legend(leg);
figure(2); legend(leg);
hold off;

Observação: a função .m será a mesma usada no exemplo 1 dessa aula (CSTR com reação
exotérmica).

Vamos agora entender cada passo do programa principal:

Queremos simular em quatro condições iniciais diferentes. Os valores de Cr0 a serem


usados são mostrados abaixo:

% Condições iniciais
Cr0 = [0.16 0.32 0.48 0.64]; % lbm/ft3

Quando formos visualizar os resultados queremos que cada condição inicial gere um
gráfico de cor diferente. Queremos também uma legenda que identifique cada curva.
Preparamos essas duas características usando os dois vetores: vetor “cor” para cores e
vetor “leg” para legenda:

cor = 'brmk ';


leg = ['Cr0=0.16'; 'Cr0=0.32'; 'Cr0=0.48'; 'Cr0=0.64'];
A estrutura “for” será repetida uma vez para cada valor do vetor “Cr0”. Por tanto, queremos
repetir tantas vezes quanto o numero de elementos do vetor “Cr0”. O número de
elementos do vetor “Cr0” é dado pelo comando “length(Cr0)”. Assim:

for aux = 1 : length(Cr0)

onde “aux” é uma flag auxiliar indo de zero até o tamanho do vetor Cr0

A estrutura de comandos a ser repetida encontra-se entre o comando “for” e o respectivo


“end”:

for aux = 1 : length(Cr0)

(...)

end;

Para chamar o arquivo .m uso a mesma sintaxe anterior. O parâmetro que varia a cada loop
do for será o parâmetro Cr0. Cada giro assume um valor de “aux” diferente, de modo que a
cada giro enviamos um valor de Cr0 diferente.

[t,y] = ode45('dcstr',t,[Cr0(aux) T0],[],[U A DH Ro Cp E R k0 V Te Th Fe Cre]);

Um exemplo:

Cr0 = 25 32 45 85 96

Começando o loop:

Aux = 1
Cr0 = 25

Aux = 2
Cr0 = 32

Aux = 3
Cr0 = 45
Aux = 4
Cr0 = 85

Aux = 5
Cr0 = 96

Final do loop for.

A visualização dos resultados tem que ser construída a medida que os dados vão
sendo calculados. Isso porque o Matlab não vai salvar os valores calculados (t,y) a cada
loop (os valores gerados no 2o giro serão gravados sobre os do 1o giro ). Mandamos plotar
os valores obtidos no primeiro giro na figura 1 e na figura 2. A figura 1 será Tempo vs.
Conc. de reagente. Já a figura 2 será Tempo vs. Temperatura:

% Visualização da simulação
figure(1); hold on;
plot(t,y(:,1),cor(aux)); title('CSTR com Reação Exotérmica');
xlabel('Tempo (h)');
ylabel('Concentração de Reagente (lbm/ft3)');
figure(2); hold on;
plot(t,y(:,2),cor(aux)); title('CSTR com Reação Exotérmica');
xlabel('Tempo (h)');
ylabel('Temperatura (R)');

DICA: para manter os pontos plotados no primeiro giro quando executar o segundo giro
use o comando “hold on”.

DICA: a sequencia de cores usadas é dada pelo vetor “cor”, “letra a letra” através da
flag. Consulte o comando “plot” para detalhes.
Exercício sugerido:

O programa anterior as curvas de todas as condições iniciais em um único gráfico.


Muitas vezes esse sistema torna o gráfico difícil de ser entendido. Uma alternativa é criar
“subplots” (comando subplot), onde uma mesma figura apresenta n gráficos, cada um
representando uma condição inicial. Consultando o help, codifique o programa anterior
para gerar saídas na forma de subplots.

You might also like