17. MATLABBásico
Use A=0:0.5:10 para gerar matrizes com dados em seqüência.
Use “;” para evitar que o resultado apareça na tela.
Dicas
!
Use “clear A” para apagar a variável A.
Use “size(A) ” para identificar as dimensões da matriz. A maior
dimensão é dada pelo comando “length(A) ”
Use “clear all” para apagar todas as variáveis armazenadas.
18. MATLABBásico
i) Soma e subtração: soma (ou subtrai) elemento por elemento da
matriz.
A+B
A-B
ii) Multiplicação e Divisão de matrizes: atenção às regras da álgebra,
pois as dimensões das matrizes têm que ser coerentes!
A * B
A / B
iii) Multiplicação e divisão elemento por elemento:
A .* B
A ./ B
19. MATLABBásico
iv) Matriz Transposta:
A’
v) Cria Matriz Identidade:
eye(número de linhas, número de colunas)
vi) Cria Matriz Zeros:
zeros(número de linhas, número de colunas)
vii) Cria Matriz Uns:
ones(número de linhas, número de colunas)
viii) Cria Matriz Randômica (composta de números aleatórios):
rand(número de linhas, número de colunas)
24. MATLABBásico
x=[1 2 3 4 5 6;
2 1 3 3 2 1];
%Forma linear:
xmin=min(x);
xmin=min(xmin);
[i,j]=find(x==xmin);
Achando a posição do menor valor de uma matriz:
%Forma condensada:
[i,j]=find(x==(min(min(x))));
33. MATLABBásico
Use “close all” para fechar todas as figuras
Dica!
Use “clf” para apagar a figura atual
Use “[x,y]=ginput(2)” para capturar dois pontos no gráfico
41. MATLABBásico
%Malha triangular da base
%malha da base
xx=0:0.01:1;
yy=0:0.01:1;
[X,Y]=meshgrid(xx,yy);
Z=1-X-Y;
%aplica a restrição para usar só a base do triangulo
%onde existe consistência física (o que nao tem vira "Not a Number")
iz=find(Z<0);Z(iz)=nan;
42. MATLABBásico
%Malha triangular da base
%malha da base
xx=0:0.01:1;
yy=0:0.01:1;
[X,Y]=meshgrid(xx,yy);
Z=1-X-Y;
%aplica a restrição para usar só a base do triangulo
%onde existe consistência física (o que não tem vira "Not a Number")
iz=find(Z<0);Z(iz)=nan;
Composição
(3 componentes)
43. MATLABBásico
%Malha triangular da base
%malha da base
xx=0:0.01:1;
yy=0:0.01:1;
[X,Y]=meshgrid(xx,yy);
Z=1-X-Y;
%aplica a restrição para usar só a base do triangulo
%onde existe consistência física (o que não tem vira "Not a Number")
iz=find(Z<0);Z(iz)=nan;
Alguns Z são
negativos! Não pode!
48. MATLABBásico
Modelagem & Dinâmica de Processos
Exemplo 1:
Modelos simples - o tanque de nível
1
h
FE
F
A
h
FE
F
A
h
FE
F
A
Considerando constantes a vazão de alimentação FE, a
densidade ρ e a temperatura T, e que o sistema está sujeito à
condição inicial:
( ) 00 hth == (1)
49. MATLABBásico
Modelagem & Dinâmica de Processos
Modelos simples - o tanque de nível
pode-se escrever o balanço de massa do sistema
1
( ) ( )FF
dt
tdm
E −=ρ
( ) ( )
dt
tdh
A
dt
tdm
ρ=
( ) ( )FF
Adt
tdh
E −=
1
Ainda,
e, portanto,
(2)
(3)
(4)
50. MATLABBásico
Modelagem & Dinâmica de Processos
Modelos simples - o tanque de nível
Freqüentemente, considera-se a vazão de saída do tanque
proporcional à altura da coluna de líquido é inversamente
proporcional a uma resistência ao escoamento (R):
1
R
h
F =
( )
−=
R
h
F
Adt
tdh
E
1
Logo,
(5)
(6)
51. MATLABBásico
Modelagem & Dinâmica de Processos
Modelos simples - o tanque de nível
Este modelo simples de um tanque de nível, sem balanço de
energia, possui uma solução analítica:
1
( )
−=
−
RA
t
E eRFth 1
Para simular este modelo, basta escolher os valores das
constantes R, A e FE, das condições iniciais h0 e t0.
A simulação da solução analítica do modelo do tanque de
nível é mostrada a seguir.
(7)
52. MATLABBásico
% Definição das constantes do modelo
R = 1; % h/m2
A = 2; % m2
Fe = 10; % m3/h
% Tempo de simulação
t = 0.0 : 0.01 : 10.0; % h
% Simulação da altura de líquido
h = R*Fe*(1 - exp(-t/(R*A))); % m
% Visualização da simulação
plot(t,h);
title('Simulação do tanque de nível');
xlabel('Tempo (h)');
ylabel('Altura (m)');
53. MATLABBásico
Verifique a consistência do calculo: a
matriz “h” gerada também deve ser 1x1000, já que
cada instante “t” gerou um valor “h”. É sempre útil
conferir a dimensão das variáveis, principalmente
a medida que as rotinas forem tornando-se
complexas.
Dica!
55. MATLABBásico
Muitas vezes é muito trabalhoso, ou mesmo impossível,
encontrar a solução analítica para o conjunto de
equações diferenciais. Nesse caso temos que simular
usando solução numérica das equações diferenciais.
Vamos assumir que o modelo do exemplo 1 não tivesse
solução analítica, e então usar o Matlab para estudar o
comportamento da altura do nível com o tempo. A
equação diferencial será:
Modelagem & Dinâmica de Processos
Modelos simples - o tanque de nível
Freqüentemente, considera-se a vazão de saída do tanque
proporcional à altura da coluna de líquido é inversamente
proporcional a uma resistência ao escoamento (R):
1
R
h
F =
( )
−=
R
h
F
Adt
tdh
E
1
Logo,
(5)
(6)
56. MATLABBásico
% Definição das constantes do modelo
R = 1; % h/m2
A = 2; % m2
Fe = 10; % m3/h
% Tempo de simulação
t = 0.0 : 0.01 : 10.0; % h
% Simulação da altura de líquido
[t,h] = ode45('dhdt',t, 0,[],[R A Fe]);
% Visualização da simulação
plot(t,h);
title('Simulação do tanque de nível');
xlabel('Tempo (h)');
ylabel('Altura (m)');
function dh = dhdt(t,h,flag,par)
R = par(1);
A = par(2);
Fe = par(3);
dh = (Fe-(h/R))/A;
57. MATLABBásico
Nesse caso temos uma equação diferencial, então deveremos
usar uma função Matlab específica para a resolução de eq.
diferenciais. No caso temos a ODE45. A função ODE45
implementa um esquema de solução de sistemas de EDO’s por
método de Runge-Kutta de ordem média (consulte o help sobre
ODE45 para maiores detalhes).
[t,h] = ode45('dhdt',t, 0,[],[R A Fe]);
58. MATLABBásico
Os parâmetros enviados entre parênteses são aqueles que
devemos passar para a ODE45:
-1º argumento de ode45 é uma string contendo o nome do arquivo .m
com as equações diferenciais. Neste caso, o arquivo chama-se dhdt.m.
-2º argumento é um vetor que pode conter (i) dois elementos: os
tempos inicial e final da integração, ou (ii) todos os valores de tempo para
os quais deseja-se conhecer o valor da variável integrada.
-3º argumento é o vetor contendo as condições iniciais das variáveis
dependentes das EDO’s. Os valores dos elementos do vetor de condições
iniciais precisam estar na mesma ordem em que as variáveis
correspondentes são calculadas na função passada como 1º argumento
para ode45 (neste caso, dhdt.m). Nesse caso em particular só temos uma
variável dependente, assim temos uma única condição inicial.
59. MATLABBásico
-4º argumento é o vetor de opções de ode45. Há várias opções do
método que podem ser ajustadas. Entretanto, não deseja-se alterar
os valores-padrão. Neste caso, é passado um vetor vazio, apenas
para marcar o lugar das opções.
-5º argumento é um vetor contendo parâmetros de entrada para a
função dhdt.m. Observe que a função .m deve ler esses parâmetros
na ordem correta (recebe como variável local “par”).
Os resultados da simulação são obtidos nos dois
parâmetros entre colchetes (t , h).
60. MATLABBásico
A codificação do arquivo .m segue o mesmo formato já explicado para
funções porém com algumas particularidades.
No caso específico de um arquivo .m que deve ser chamado por uma
função de solução EDO’s (todas as ODExx), a declaração deste arquivo
deve seguir a sintaxe:
function dy = nomefun(t, y, flag, arg1, ..., argN)
onde
•dy é o valor da(s) derivada(s) retornadas
•t e y são as variáveis independente e dependente, respectivamente.
•Opcional: caso deseje-se receber outros parâmetros, a função
deve receber um argumento marcador de lugar chamado flag. Após
este, ela recebe quaisquer outros parâmetros.
62. MATLABBásico
Modelagem & Dinâmica de Processos
Exemplo 3
Tanque de aquecimento
1
h
FE ,TE
F , T
A
Th
Th
h
FE ,TE
F , T
A
Th
Th
Considerando constantes a vazão de alimentação FE, a
temperatura Th, o coeficiente global de transferência de calor U e
as propriedades do fluido ρ e Cp e que o sistema está sujeito às
condições iniciais:
( ) 00 hth == ( ) 00 TtT ==
63. MATLABBásico
Modelagem & Dinâmica de Processos
Modelos simples - tanque de aquecimento
Como no caso anterior, o balanço de massa pode ser escrito
como :
1
( )
−=
R
h
F
Adt
tdh
E
1
(6)
O balanço de energia é escrito como:
( ) ( ) QFHHF
dt
VTd
C EEp +−=ρρ (8)
Modelagem & Dinâmica de Processos
Modelos simples - tanque de aquecimento
1
( )
+=+=
dt
dh
T
dt
dT
hA
dt
dV
T
dt
dT
V
dt
VTd
(9)
( ) QFHHF
R
h
F
A
T
dt
dT
hAC EEEp +−=
−+ ρρ (10)
+−
+=
p
E
p
hEE
C
U
A
F
T
C
UT
A
TF
hdt
dT
ρρ
1
(11)
65. MATLABBásico
% Definição das constantes do modelo
R = 1; % h/m2
A = 2; % m2
Fe = 10; % m3/h
Cp = 0.75; % kJ/(kg . K)
Ro = 1000; % kg/m3
U = 150; % kJ/(m2 . s . K)
Te = 530; % K
Th = 540; % K
% Tempo de simulação
t = 0.0 : 0.01 : 10.0; % h
% Simulação do modelo
[t,y]=ode45('dydt',t,[(5/A) Th],[],[U A Ro Cp Fe R Te Th]);
66. MATLABBásico
% 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)');
67. MATLABBásico
A única modificação em relação ao exemplo anterior é que
estamos passando duas condições iniciais (pois existem duas
variáveis dependentes):
[t,y]=ode45('dydt',t,[(5/A) Th],[],[U A Ro Cp Fe R Te Th]);
68. MATLABBásico
A função .m tem o código apresentado a seguir:
function dy = dydt(t,y,flag,par);
U = par(1);
A = par(2);
Ro = par(3);
Cp = par(4);
Fe = par(5);
R = par(6);
Te = par(7);
Th = par(8);
dy(1) = (Fe-(y(1)/R))/A;
dy(2) = (1/y(1))* ( ((Fe*Te/A)+(U*Th/(Ro*Cp)))...
- ( y(2)*((Fe/A)+(U/(Ro*Cp)))) );
dy = dy(:);
69. MATLABBásico
O vetor dy é criado como vetor linha (dy(1)) e
(dy(2)). Porém temos que retornar como vetor coluna.
Use o comando:
matriz coluna = matriz linha (:)
Dica!
72. MATLABBásico
Na compra de uma calculadora gráfica, a loja ofereceu duas propostas de
financiamento – proposta A e B. A proposta A é composta por 7 parcelas mensais
iguais de 114 reais cada. Já a proposta B prevê 10 parcelas mensais iguais de 98 reais
cada. Qual é a melhor opção de compra considerando a taxa de juros oferecida em
investimentos denominados “renda fixa”?
A princípio poderia resolver o problema simplesmente multiplicado 114 x 7 e 10 x
98, achando o valor final pago. Os valores encontrados seriam 798 e 980. Logo, a
Proposta A parece mais favorável para o comprador.
É importante lembrar, porém, que essa forma de resolução não considera que o
dinheiro desvaloriza-se ao longo dos meses. Ou seja, o poder de compra de 100 reais
hoje, é superior ao poder de compra de 100 reais daqui a 10 meses. Outra forma de
pensar é considerar o “custo de oportunidade” – a taxa de retorno livre de que
conseguiria para o meu dinheiro caso, ao invés de pagar agora, investisse. De uma
forma ou de outra o que precisamos é do VALOR PRESENTE (VP) de cada série de
pagamentos, sendo os pagamentos descontados a dada taxa de juros. Para trazer
VALOR FUTURO (VF) para valor presente usa-se a fórmula:
VP = VF / ( 1 + i )n
Onde “i” é a taxa de juros mensal e “n” o número de meses entre o VF e o VP.
74. MATLABBásico
clc
close all
clear all
ivetor=0:0.01:0.50;
VPvetor114=[];
VPvetor98=[];
prompt{1}='Número de meses do pagamento da serie A:';
prompt{2}='Número de meses do pagamento da serie B:';
prompt{3}='Valor de cada parcela da serie A:';
prompt{4}='Valor de cada parcela da serie B:';
resposta=inputdlg(prompt,'Calculo da taxa de equilibrio');
nummeses114=str2num(char(resposta(1)));
nummeses98=str2num(char(resposta(2)));
v114=str2num(char(resposta(3)));
v98=str2num(char(resposta(4)));
75. MATLABBásico
for J = 1:length(ivetor),
i=ivetor(J);
VP=[];
for K = 1:nummeses114,
VP(K)=v114/(1+i)^K;
end
VPfinal=sum(VP);
VPvetor114=[VPvetor114, VPfinal];
VP=[];
for K = 1:nummeses98,
VP(K)=v98/(1+i)^K;
end
VPfinal=sum(VP);
VPvetor98=[VPvetor98, VPfinal];
end
76. MATLABBásico
plot(ivetor*100,VPvetor114,'-b')
hold on
plot(ivetor*100,VPvetor98,'-r')
title('Valor presente das parcelas a serem pagas')
legend( [ num2str(nummeses114), ' parc de ', num2str(v114) ,' reais cada'] , ...
[ num2str(nummeses98), ' parc de ', num2str(v98) ,' reais cada' ] )
xlabel('Taxa de juros mensal')
ylabel('Valor presente em Reais')
if (VPvetor114(1)<VPvetor98(1)),
posicoes=VPvetor114<VPvetor98;
achaZero=find(posicoes==0);
achaPrimeiroZero=min(achaZero);
plot(100*ivetor(achaPrimeiroZero),VPvetor114(achaPrimeiroZero),'ok')
else
posicoes=VPvetor98<VPvetor114;
achaZero=find(posicoes==0);
achaPrimeiroZero=min(achaZero);
plot(100*ivetor(achaPrimeiroZero),VPvetor114(achaPrimeiroZero),'ok')
end
text(100*ivetor(achaPrimeiroZero),50+VPvetor114(achaPrimeiroZero), ...
['Juros de equilibrio (a.m.) = ',num2str(100*ivetor(achaPrimeiroZero)),' %'] )
78. MATLABBásico
Determinado processo possui função custo definida pela equação:
Y=((x-3)2
)-6
É necessário encontrar x que minimize o valor de Y. Não é difícil de visualizar
que a solução do problema é fazer x=3, de modo a levar Y um mínimo (-6). Mesmo
sabendo previamente a solução, vamos resolver através do MATLAB. Utilizamos
então a função “fminsearch”.
79. MATLABBásico
%Calculo do valor de x que minimiza a funcao custo
xmin = fminsearch('((x-3).^2)-6', 4)
%Gráfico da funcao custo
x=0:0.01:5;
y=((x-3).^2)-6;
plot(x,y);
hold on
%Marca o ponto de minimo:
ymin=((xmin-3).^2)-6;
plot(xmin, ymin,'or')
81. MATLABBásico
%Calculo do valor de x que minimiza a funcao custo
%Gráfico da funcao custo
x=0:0.01:5;
y=((x-3).^2)-6;
plot(x,y);
hold on
drawnow
xmin = fminsearch('custo', 4)
%Marca o ponto de minimo:
ymin=((xmin-3).^2)-6;
plot(xmin, ymin,'or')
function [y] = custo(x)
y=((x-3).^2)-6;
plot(x, y,'ob')
hold on
pause(0.1)
83. MATLABBásico
Quando ajustamos uma curva a um conjunto de pontos experimentais, estamos minimizando a
distância entre a curva e os dados. Definindo essa distância como “erro”, estamos manipulando os
parâmetros que definem a curva de modo a minimizar o erro. Nesse caso “erro” é a minha “função
objetivo” a ser minimizada. É através dessa ótica que se torna possível usar “fminsearch” para
encontrar o valor ótimo dos parâmetros de ajuste de uma curva aos dados experimentais.
global yexp xexp
%pontos experimentais
yexp=[1.1 2.12 2.85 4.4 5.0 6.5];
xexp=[1 2 3 4 5 6];
Parametros = fminsearch('custo',[1,2]);
84. MATLABBásico
function [saida] = custo(x)
global yexp xexp
a=x(1);
b=x(2);
yteo=a.*xexp + b; %calcula o valor teorico
%para cada pto experimental
yerro=abs(yexp-yteo); %calculo do erro
saida=sum(yerro);
plot(xexp,yexp,'r*',xexp,yteo,'b-')
drawnow
pause(0.3)
87. MATLABBásico
As equações diferenciais que descrevem
o processo são:
O modelo matemático do nosso reator CSTR tende ao estado
estacionário. Ou seja, seus parâmetros tendem a ficar constantes no
tempo infinito. Seria interessante introduzir perturbações em algumas
variáveis e observar como o reator se comporta.
88. MATLABBásico
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.
89. MATLABBásico
% 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
Programa principal:
continua...
90. MATLABBásico
% 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)');
Programa principal (continuação):
91. MATLABBásico
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);
Função “dcstrdeg”:
continua...
92. MATLABBásico
%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(:);
Função “dcstrdeg” (continuação):
94. MATLABBásico
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 série 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”.
Usaremos o mesmo reator CSTR do exemplo anterior.
95. MATLABBásico
% 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
Programa principal:
continua...
96. MATLABBásico
% 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;
Programa principal (continuação):
continua...