Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 UNIVERSIDADE FEDERAL RURAL DO RIO DE JANEIRO INSTITUTO DE TECNOLOGIA DEPARTAMENTO DE ENGENHARIA QUÍMICA IT 383 – MÉTODOS COMPUTACIONAIS APLICADOS I PROFESSORA: MÁRCIA PEIXOTO VEGA DOMICIANO AULAS 1. Aula 1 – Programação aplicada à resolução de problemas da Engenharia Química Queridos alunos e alunas, Tudo bem? Vamos usar em nossas aulas o programa computacional livre Octave, que pode ser baixado através do site: https://www.gnu.org/software/octave/index. Conforme reportado em https://pt.wikipedia.org/wiki/GNU_Octave#cite_note-1, “GNU Octave é uma linguagem computacional, desenvolvida para computação matemática. Possui uma interface em linha de comando para a solução de problemas numéricos, lineares e não- lineares, também é usada em experimentos numéricos. Faz parte do projeto GNU, é um software livre sob os termos da licença GPL. Foi escrito por John W. Eaton. Possui compatibilidade com MATLAB, possuindo um grande número de funções semelhantes”. Por favor, para a primeira aula, todos com o programa instalado em seus dispositivos eletrônicos. Nesta primeira aula introdutória, vamos fazer uma revisão sobre matrizes. Revisão sobre matrizes Determinante: Vamos calcular o determinante de uma matriz A (operação definida somente para matrizes quadradas): 44434241 34333231 24232221 14131211 aaaa aaaa aaaa aaaa A O determinante da matriz resultante da eliminação da linha 2 (i) e da coluna 1(j) da matriz A é chamado 21M ou ijM : 3 444342 343332 141312 ij21 aaa aaa aaa MM Vamos definir o cofator ijA : ijjiij M1A Vamos efetuar a expansão de Laplace para o cálculo do determinante: n 1k ikikAaA ou n 1k kjkjAaA Exemplo de uma matriz 2 por 2: 2221 1211 aa aa A Vamos fazer a expansão da linha 1: 2 1k k1k1 AaA Vamos calcular os cofatores: 22221111 aa1A 21212112 aa1A Logo, 2112221112121111 aaaaAaAaA que é a velha fórmula de multiplicar em cruz. Regra de Cramer: Vamos relembrar a regra de Cramer: Para o sistema: bAx , a solução é: Adet Adet x j j , sendo: nn1j,nj,n n21j,2j,2 n11j,1j,1 1j,n2n1n 1j22221 1j,11211 aaa aaa aaa aaa aaa aaa A ; nn1j,nn n21j,22 n11j,11 1j,n421n 1j22221 1j,11211 j aab aab aab aaa aaa aaa A . 1.1. Comandos As linhas de programa começadas por % constituem comentários ou observações. Uma linha começando com ‘%‘ é utilizada para armazenar os comentários e as observações do programador, e tais comentários e observações não são executados. Se os comentários e observações necessitarem de mais de uma linha de programa, cada linha deve começar com %. O ponto-e-vírgula é utilizado para suprimir a impressão na tela do monitor. Se o último caractere de uma sentença for um ponto-e-vírgula, a impressão é suspensa; o comando, contudo, é executado, mas o resultado não é mostrado. Além disso, quando se entra com os elementos de uma matriz, utiliza-se um ponto-e-vírgula para indicar o fim de cada linha, exceto a última. / É o operador divisão direita. B/A é uma divisão escalar ou matricial (equivalente a B*inv(A)). + É o operador mais. X + Y efetua a adição das matrizes X e Y, que devem apresentar a mesma dimensão, a não ser que uma das variáveis seja um escalar. - É o operador menos. X - Y efetua a subtração das matrizes X e Y. X e Y devem apresentar a mesma dimensão, a não ser que uma das variáveis seja um escalar. 5 * É o operador multiplicação matricial. X*Y é o produto entre as matrizes X e Y. Um escalar (matriz de 1 por 1) pode ser multiplicado por outro escalar ou por uma matriz. Para o caso de multiplicação de matrizes, o número de colunas de X deve ser igual ao número de linhas de Y. ^ É o operador potência. Z = X^y calcula X elevado à potência de y. O comando det(A) fornece o determinante da matriz quadrada A. Uma característica conveniente do OCTAVE é que as variáveis não precisam ser dimensionadas antes do uso. Todos os cálculos no OCTAVE são executados em precisão dupla. Contudo, a visualização pode ser com vírgula fixa (ponto fixo) e quatro casas decimais - format short. Se pelo menos um dos elementos de uma matriz não for um inteiro exato, há quatro formatos de saída possíveis. A saída mostrada na tela pode ser controlada por meio dos seguintes comandos principais: format short (formato curto) format long (formato longo) format short e (formato curto com notação científica) format long e (formato longo com notação científica) Sempre que o OCTAVE for acionado sem nenhum comando específico de formato de visualização, o OCTAVE apresentará o formato short. No OCTAVE, as variáveis são geradas automaticamente ao serem utilizadas. (As dimensões das variáveis podem ser alteradas mais tarde, se necessário.) Tais variáveis permanecem na memória até que se entre com um dos comandos exit ou quit. Para se obter uma lista das variáveis na área de trabalho, digita-se simplesmente o comando who. Em seguida, todas as variáveis correntemente na área de trabalho aparecem na tela do monitor. O comando clear elimina da área de trabalho todas as variáveis não-permanentes. Para limpar somente uma variável particular, por exemplo ‘x’, o comando clear x deve ser empregado. Vamos escrever um programa em OCTAVE seguindo as etapas: Clicar duas vezes com o mouse no ícone de programa OCTAVE Clicar em FILE;NEW;M-FILE Aparece uma janela tipo notepad Vamos salvar o arquivo: Clicar em ARQUIVO; SALVAR COMO Onde aparece SALVAR EM vamos procurar o diretório que desejamos salvar o arquivo. Onde aparece NOME DO ARQUIVO vamos digitar rpeq1.m Onde aparece SALVAR COMO TIPO, vamos selecionar TODOS OS ARQUIVOS (*.*). Para rodar um programa OCTAVE, devemos digitar o nome do programa sem a extensão na janela de comando do OCTAVE e apertar o ENTER no teclado. 7 1.2. Exemplo de programas no OCTAVE 1.2.1. Programa rpeq1.m Um gás natural apresenta a seguinte composição em % molar: Componente i % molar ( ix ) Peso molecular ( iPM , kgmol/kg ) 4CH 75% 16 62HC 20% 30 2N 5% 28 Adotando-se uma base de 100 kgmol, a massa do componente i é: iii PMnm , sendo: in número de moles do componente i. Portanto, a composição ponderal será: i i i i m m 100ponderal% . Vamos calcular a composição ponderal e o peso molecular médio, sendo i ii xPMPM . Início do programa a ser digitado: % Um gás natural apresenta a seguinte composição em % molar: % Componente 1:CH4 - 75% (PM=16) % Componente 2:C2H6 - 20% (PM=30) % Componente 3:N2 - 5% (PM=28) % Calcular a composição ponderal e o peso molecular médio % Peso molecular dos componentes PM1=16; PM2=30; PM3=28; % Composição molar dos componentes X1=0.75; X2=0.20; X3=0.05; % Cálculo da composição ponderal adotando-se uma base de 100 kgmol % O número de moles dos componentes 1, 2 e 3 será: n1=100*0.75; n2=100*0.20; n3=100*0.05; % A massa de cada componente será: m1=n1*PM1; m2=n2*PM2; m3=n3*PM3; % A massa total será: MT=m1+m2+m3; % A composição ponderal será: pcentpond1=100*(m1/MT) pcentpond2=100*(m2/MT) pcentpond3=100*(m3/MT) % Cálculo do peso molecular médio PMMEDIO=PM1*X1+PM2*X2+PM3*X3 Fim do programa a ser digitado 1.2.2. Programa comando1.m Início do programa a ser digitado: %(formato curto - Scaled fixed point format with 5 digits.) format short X1=[0 1 2 3 4 5 6 7 8 9 10] Y1=rand(1,11) X2=[0 1 2 3 4 5] Y2=rand(1,6) pause %(formato longo - Scaled fixed point format with 15 digits.) format long X1=[0 1 2 3 4 5 6 7 8 9 10] Y1=rand(1,11) X2=[0 1 2 3 4 5] Y2=rand(1,6) pause %(formato curto comnotação científica - %Floating point format with 5 digits.) format short e X1=[0 1 2 3 4 5 6 7 8 9 10] Y1=rand(1,11) X2=[0 1 2 3 4 5] 9 Y2=rand(1,6) pause %(formato longo com notação científica - %Floating point format with 15 digits.) format long e X1=[0 1 2 3 4 5 6 7 8 9 10] Y1=rand(1,11) X2=[0 1 2 3 4 5] Y2=rand(1,6) format short pause who pause clear X1 pause who pause X1=[0 1 2 3 4 5 6 7 8 9 10]; Y1=rand(1,11); X2=[0 1 2 3 4 5]; Y2=rand(1,6); pause who pause Z=[1 2 3;4 5 6;7 8 9]; pause Z=[1 2 3;4 5 6;7 8 9] pause Z=[rand(10,7)] pause Z(1,:) pause Z(:,1) pause X= 1.234 + 2.345 + 3.456 + 4.567 + 5.678 + 6.789... + 7.890 + 8.901 - 9.012 X= 1.234 + 2.345 + 3.456 + 4.567 + 5.678 + 6.789..... + 7.890 + 8.901 - 9.012 1.3. Exercício proposto: Programa rpeq3.m Programa repq3.m Um gás natural apresenta a seguinte composição em % molar: Componente i % molar ( ix ) Peso molecular ( iPM , kgmol/kg ) 4CH 75% 16 62HC 20% 30 2N 2.5% 28 83HC 2.5% 44 Adotando-se uma base de 100 kgmol, a massa do componente i é: iii PMnm , sendo: in número de moles do componente i. Portanto, a composição ponderal será: i i i i m m 100ponderal% . Calcular a composição ponderal e o peso molecular médio, sendo i ii xPMPM . 11 2. Aula 2 – Programação aplicada à resolução de problemas da Engenharia Química Queridas alunas e alunos, Queridos alunos e alunas, Tudo bem? Vamos resolver um sistema de equações algébricas lineares usando a regra de Cramer e aprender a traçar gráficos 2D e 3D. 2.1. Comandos O operador dois-pontos pode ser utilizado para criar vetores, indexar matrizes e para especificar iterações for. Por exemplo, i:k é o mesmo que [i i + 1 ... k], A(:, j) é a j-ésima coluna da matriz A e A (i, :) é a i-ésima linha de A. Se a sentença a ser digitada for muito longa, com comprimento superior ao de uma linha, podem ser utilizadas reticências constituídas por três ou mais pontos(...), um exemplo é: x = 1.234 + 2.345 + 3.456 + 4.567 + 5.678 + 6.789... + 7.890 + 8.901 - 9.012; Os espaços em branco em torno dos sinais de =, +, *, ^, / e - são opcionais. Tais espaços são quase sempre usados para melhorar a legibilidade. Podem ser colocados diversos comandos na mesma linha desde que estejam separados por vírgulas ou ponto-e- vírgulas. São exemplos: plot (x,y, ‘o’), text(1 ,20,’Sistema 1’), text(1 ,1 5,’Sistema 2’) plot(x,y, ‘o’); text(1 ,20, ‘Sistema 1’); text(1 ,1 5, ‘Sistema 2’) ./ É o operador divisão elemento por elemento. B./A denota a divisão elemento por elemento, sendo requerido que A e B tenham a mesma dimensão. .* É o operador multiplicação elemento por elemento. X.*Y denota a multiplicação elemento por elemento, sendo requerido que A e B tenham a mesma dimensão. .^ É a potenciação elemento por elemento. Z = X.^Y denota a potenciação elemento por elemento, sendo requerido que X e Y tenham a mesma dimensão. O comando cd muda o diretório de trabalho corrente. Por exemplo, cd aula transforma o diretório corrente no especificado (aula). Por exemplo, cd .. acarreta a movimentação para o diretório acima do diretório corrente. O comando cd ele próprio informa o diretório corrente. O comando dir lista os diretórios. Por exemplo, dir aula lista os arquivos do diretório especificado (aula). O comando clc limpa a janela de comando e coloca o cursor no topo da tela. O comando help apresenta a documentação em linha do programa OCTAVE. O uso do comando help lista todos os tópicos primários, sendo que cada tópico primário corresponde a um nome de diretório do OCTAVE. O comando help tópico fornece auxílio no tópico especificado. O tópico pode ser um nome de comando ou um nome de diretório. Caso seja um comando, o help apresenta informações sobre o comando. Caso seja um diretório, o help apresenta a tabela de conteúdos do diretório. Não é necessário informar o caminho completo do diretório; sendo que o último componente, ou os últimos componentes são suficientes. Por exemplo, help general e help octave/general ambos listam a tabela de conteúdos do diretório toolbox/octave/general. O comando pause interrompe a execução de um programa até que o usuário digite alguma tecla, quando então o programa é executado a partir da primeira linha abaixo do comando pause. Par interromper definitivamente a execução de um programa devemos digitar ctrl c. 13 O OCTAVE possui um conjunto extenso de rotinas para obtenção de saídas gráficas. Se x e y forem vetores de mesmo comprimento, o comando plot(x,y) traça os valores de y contra os valores de x. Para traçar múltiplas curvas num único gráfico, utiliza-se o comando plot com argumentos múltiplos: plot(X1 ,Y1 ,X2,Y2,. . .,Xn,Yn) As variáveis X1 ,Y1 ,X2,Y2, e assim por diante, são pares de vetores. Cada par x-y é colocado no gráfico, resultando múltiplas curvas. Os argumentos múltiplos apresentam a vantagem de permitir que pares de vetores de diferentes comprimentos possam ser visualizados no mesmo gráfico. Cada par utiliza um tipo diferente de linha. O traçado de mais de uma curva num único gráfico também pode ser realizado utilizando-se o comando hold. O comando hold congela o gráfico atual. Portanto, as curvas subseqüentes serão sobrepostas à curva original. Digitando-se novamente o comando hold libera-se o gráfico presente. Uma vez que se tenha uma visualização gráfica na tela do monitor, é possível desenhar linhas de grade, colocar titulo no gráfico e colocar rótulos nos eixos x e y. Os comandos OCTAVE para grade, título, legenda do eixo dos x e legenda do eixo dos y são: grid title (‘título’) xlabel (‘legenda do eixo dos x’) ylabel (‘legenda do eixo dos y’) Para se escrever um texto começando no ponto (X, Y) da tela gráfica, se utiliza o comando: text(X, Y, ‘texto’) Por exemplo, o comando: text(3,0.45,’sen t’) escreverá horizontalmente a expressão sen t começando no ponto de coordenadas (3,0,45). Além disso, os comandos: plot(xl ,yl ,x2,y2), text(xl ,yl ,‘1‘), text(x2,y2,’2’) marcam as duas curvas de modo que elas possam ser facilmente distinguidas. plot(X,Y,’x’) traça um gráfico de pontos utilizando símbolos X, enquanto plot(X1 ,Y1 ,‘:‘,X2,Y2,’ +‘) utiliza uma linha de pontos (:) para a primeira curva e uma linha de símbolos (+) para a segunda curva. São os seguintes os tipos de linhas e de símbolos para as linhas de pontos disponíveis: Tipos de linha Tipos de ponto Cheia - Ponto . Tracejada -- Sinal mais + De pontos : Asterisco * Traço-ponto -. Circulo O plot(X,Y,’r’) plot(X,Y,’+g’) indicam o uso de uma linha vermelha no primeiro gráfico e de uma curva de marcas + em verde. As cores disponíveis são: vermelho r verde g azul b branco w invisível i 15 amarelo y roxo m azul-claro c No OCTAVE os gráficos são postos em escala automaticamente. Este gráfico permanece como gráfico corrente até que um outro seja traçado, situação em que o gráfico antigo é apagado e os eixos são automaticamente postos em nova escala. Em determinadas situações, pode ser desejável ignorar a característica de colocação automática dos eixos em escala, disponível no comando plot, e selecionar os pontos-limites manualmente. Para traçar uma curva numa região especificada por: v = [x-mín x-máx y-mín y-máx] deve ser digitado o comando axis(v). O comando axis(v), onde v é um vetor de quatro elementos, ajusta os eixos dentro dos limites especificados. Nos gráficos logarítmicos, os elementos de v são os 1og10 dos valores mínimo e máximo. A execução de axis(v) congela o corrente ajuste de escala dos eixos para os gráficos subseqüentes. Digitando-se axis novamente, retoma-se a colocação em escala automática. O comando axis(‘square’) faz com que o gráfico resultante fique numa tela em forma de quadrado. Com uma relação abscissa/ordenada de aspecto quadrado, uma retacom tangente igual a 1 é mostrada com inclinação verdadeira de 45°, e não distorcida pela forma irregular da tela do monitor. O comando axis(’normal’) faz a relação abscissa/ordenada original retornar. O comando subplot cria eixos em quadrantes específicos da janela de gráficos. subplot(m,n,p), ou subplot(mnp), quebra a janela gráfica, gerando matrizes m por n de eixos menores. Os eixos são contados (p) a partir da linha de topo da janela gráfica, e assim sucessivamente (segunda linha , etc). Por exemplo, subplot(2,1,1), plot(conv1) subplot(2,1,2), plot(conv2) Há 2 linhas e uma única coluna dividindo a janela gráfica, isto é, o gráfico da variável conv1 está na metade superior da janela gráfica e o gráfico da variável conv2 na metade inferior. Gráficos logarítmicos e polares são criados substituindo-se a expressão plot por loglog, semilogx, semilogy ou polar. Tais comandos são utilizados da mesma forma, modificando apenas como os eixos são postos em escala e como os dados são apresentados. O comando surf constrói uma superfície gráfica tridimensional. Por exemplo, surf(X,Y,Z,C) constrói o gráfico de uma superfície colorida cuja escala de cores é determinada pela faixa do argumento C. surf(X,Y,Z) emprega C = Z de modo que a cor é proporcional a altura da superfície. O comando whitebg transforma a cor de fundo da janela gráfica para branco. Os gráficos subseqüentes apresentarão também fundo branco. O comando bar constrói um gráfico de barras para os elementos do vetor Y: (bar(Y)). bar(X,Y) constrói um gráfico de barras dos elementos do vetor Y em localizações especificadas pelo vetor X. Os valores de X devem estar em ordem crescente. Caso os valores de X não estejam igualmente espaçados, o intervalo entre cada dado não é simétrico. As barras são colocadas no ponto médio entre dois valores adjacentes de X. O comando meshgrid gera arranjos X e Y para gráficos 3D. [X,Y] = meshgrid(x,y) transforma o domínio especificado pelos vetores x e y em arranjos X e Y que podem ser usados na avaliação de funções de duas variáveis e na construção de superfícies 3D. As linhas do arranjo X são cópias do vetor x e as colunas do arranjo Y são cópias do vetor y. 17 O comando plot3 traça linhas e pontos no espaço tridimensional. plot3() é o análogo tridimensional do plot(). plot3(x,y,z), onde x, y e z são três vetores de mesmo comprimento, traça uma linha no espaço 3-D através de pontos cujas coordenadas são os elementos de x, y e z. plot3(X,Y,Z), onde X, Y e Z são três matrizes de mesma dimensão, traça as diversas linhas das colunas de X, Y e Z. Vários tipos de linhas, de símbolos e de cores podem ser obtidos empregando plot3(X,Y,Z,s) onde s é análogo aos caracteres (cadeia alfanumérica) apresentados no comando plot. O comando mesh traça uma superfície reticulada tridimensional. mesh(X,Y,Z,C) traça uma rede 3-D (X,Y,Z) parametrizada por coloração (C). mesh(X,Y,Z) emprega C = Z, de forma que a coloração seja proporcional à altura da rede tridimensional. O comando colormap define as estruturas de cores, por exemplo: colormap(gray) - mapa de cores em escala linear de cinza. colormap(hot) - mapa de cores preto-vermelho-amarelo-branco. colormap(copper) - mapa de cores com tons lineares de cobre. colormap(prism) - mapa de cores do prisma. O OCTAVE possui um conjunto extenso de funções predefinidas e rotinas para a obtenção de saídas gráficas que podem ser chamadas pelo usuário para resolver diferentes tipos de problemas. 2.2. Exemplos de programas no OCTAVE 2.2.1. Programa comando2.m % Modelo para secagem de soja % Ys=umidade do sólido em um tempo t qualquer % Yse=umidade do sólido em tempo t -> infinito % Ys0=umidade do sólido em tempo t -> 0 % Psat=pressão de saturação % Pv=pressão parcial de vapor no ar % t= tempo de secagem % m,n,q=parâmetros % Sistema: M=(Ys-Yse)/(Ys0-Yse)=exp[-m*((Psat-Pv)^n)*t^q] % Dados experimentais: % (Psat-Pv), (kgf/dm^2) 15 40 67 88 % t, (h) 0,7 1,5 2,5 2,9 % Sendo: M=(Ys-Yse)/(Ys0-Yse) m=0.1314; n=0.4601; q=0.0638; Psat_Pv=[15 40 67 88]; t=[0.7 1.5 2.5 2.9]; M=exp(-m*((Psat_Pv).^n).*t.^q) 2.2.2. Programa comando3.m X1=[0 1 2 3 4 5 6 7 8 9 10] Y1=rand(1,11) X2=[0 1 2 3 4 5] Y2=rand(1,6) plot (X1,Y1, 'or'), text(4 ,0.8,'Sistema 1'), text(4 ,0.4,'Sistema 2') pause plot(X2,Y2, 'ob'); text(1 ,0.8, 'Sistema 1'); text(4 ,0.9, 'Sistema 2') pause subplot (2,2,1) plot(X1,'r'); subplot(2,2,2) plot(X2,'b'); subplot(2,2,3) plot(Y1,'g'); subplot(2,2,4) plot(Y2,'m'); pause clf plot(X1,Y1,X2,Y2), text(X1 ,Y1 ,'1'), text(X2,Y2,'2') pause grid title ('título') xlabel ('legenda do eixo dos x') ylabel ('legenda do eixo dos y') pause axis([0 5 0 1]); 19 2.2.3. Programa comando4.m whitebg X3=ones(1,3) Y3=[1 10 100] loglog(X3,Y3,'g') pause xx = [-5:0.25:5]; yy = [-5:0.25:5]; [x,y]=meshgrid(xx,yy) ; z = exp(-0.3*((x-2).^2.+(y-2).^2))+2*exp(-0.3*((x+1).^2.+(y-2).^2))'; surf(x,y,z) hold on xlabel('legenda do eixo dos x'); ylabel('legenda do eixo dos y'); zlabel('legenda do eixo dos z'); title('título'); pause clf X1=[0 1 2 3 4 5 6 7 8 9 10]; bar(X1) title ('título') xlabel ('legenda do eixo dos x') ylabel ('legenda do eixo dos y') pause figure plot(X1) title ('título') xlabel ('legenda do eixo dos x') ylabel ('legenda do eixo dos y') pause clf Vamos copiar a janela gráfica do OCTAVE para um documento do WORD. Vamos clicar em EDIT, depois COPY TO METAFILE, e em seguida, colamos no documento WORD, usando ctrl v. 2.2.4. Programa comando5.m % Modelo para secagem de soja % Ys=umidade do sólido em um tempo t qualquer % Yse=umidade do sólido em tempo t -> infinito % Ys0=umidade do sólido em tempo t -> 0 % Psat=pressão de saturação % Pv=pressão parcial de vapor no ar % t= tempo de secagem % m,n,q=parâmetros % Sistema: M=(Ys-Yse)/(Ys0-Yse)=exp[-m*((Psat-Pv)^n)*t^q] % Novos dados experimentais: % (Psat-Pv), (kgf/dm^2) 15 40 67 88 % t, (h) 0,7 1,5 2,5 2,9 % M .6398 0.4788 0.3811 0.3316 % Sendo: M=(Ys-Yse)/(Ys0-Yse) Psat_Pv=[15 40 67 88]; t=[0.7 1.5 2.5 2.9]; M=[0.6398 0.4788 0.3811 0.3316]; plot3(t,Psat_Pv,M,'-.r') xlabel('Tempo [h]'); ylabel('Psat-Pv [kgf/dm^2]'); zlabel('(Ys-Yse)/(Ys0-Yse)'); title( [ 'Secagem de soja ' ] ); grid pause Psat_Pv=[15+15*rand(100,100) 40+40*rand(100,100) 67+67*rand(100,100) 88+88*rand(100,100)]; t=[0.7+0.7*rand(100,100) 1.5+1.5*rand(100,100) 2.5+2.5*rand(100,100) 2.9+2.9*rand(100,100)]; m=0.1314; n=0.4601; q=0.0638; M=exp(-m*((Psat_Pv).^n).*t.^q); colormap(prism); mesh(t,M,Psat_Pv) grid xlabel('Tempo [h]'); ylabel('(Ys-Yse)/(Ys0-Yse)'); zlabel('Psat-Pv [kgf/dm^2]'); title( [ 'Secagem de soja ' ] ); 2.3. Exercício proposto 1 21 Olhar o help dos comandos e funções da Tabela 1: Na Tabela 1 são listados alguns destes comandos e funções. Tabela 1 Comandos e Funções Matriciais Comumente Usados na Solução de Problemas Explicações sobre o que o Comando Faz, o que a Função Matricial Significa, ou o que a Declaração Significa ans atan axis clear clg conj cos cosh det diag exit exp eye format Iong format short format short e grid hold i imag inf inv Ienght linspace Iog Ioglog Iogspace log10 max min NaN ones pi plot prod quit rand quit rand rank real rem sin sinh size sqrt sum tan tanh text title trace who xlabel ylabel zlabel zeros 23 2.4. Exercício proposto: Programa rpeq2.m Três correntes gasosas são alimentadas em um misturador. Sendo conhecidas as composições dessas três correntes e da corrente de saída, determinar as vazões molares de todas as correntes evolvidas no processo. Gás % molar corrente A % molar corrente B % molar corrente C % molar corrente D 4CH 25% 35% 55% 40% 62HC 35% 20% 40% 35%83HC 40% 45% 5% 25% misturador A=100lbmol/h B C D Balanço global: DCBA . Balanço por componente: D25,0C05,0B45,0A40,0 D35,0C40,0B20,0A35,0 D40,0C55,0B35,0A25,0 Análise: número de variáveis=3; número de equações=3 (o balanço global é a soma dos balanços por componente). 3. Aula 3 – Introdução à programação em linguagem estruturada Queridos alunos e alunas, Tudo bem? 3.1. Comandos No OCTAVE há seis operadores relacionais: <, <=, >, >=, ==, e ~=. A<B efetua comparações entre A e B, elemento por elemento, e retorna uma matriz de elementos unitários, caso a relação seja verdadeira, e elementos nulos, caso a relação seja falsa. A e B devem apresentar a mesma dimensão. & indica o e lógico. A & B é uma matriz cujos elementos são unitários, quando ambas as matrizes A e B apresentarem elementos não nulos; ou é uma matriz com elemento zero, quando tanto A quanto B apresentarem um elemento nulo. A e B devem possuir a mesma dimensão. | indica o ou lógico. A | B é uma matriz cujos elementos são unitários, quando A ou B apresentar um elemento não nulo, e nulos, quando ambas as matrizes A e B apresentarem elementos nulos. A e B devem apresentar a mesma dimensão a menos que sejam escalares. ~ indica o complemento lógico não. ~A é uma matriz cujos elementos são unitários, quando A possuir elementos nulos, ou uma matriz cujos elementos são nulos, quando A possuir elementos não nulos. xor indica ou exclusivo. xor(A,B) é unitário quando A ou B, porém não simultaneamente, apresentarem elementos não nulos. 25 O comando while repete sentenças um número indefinido de vezes. A forma geral do comando while é: while variável Sentenças end As sentenças são executadas enquanto a variável apresentar todos os elementos não nulos. A variável é o resultado de: expressão ==, <, >, <=, >=, ~= expressão. Por exemplo: A=5; B= 1; while A > B, A=A-1; end O comando if executa sentenças condicionalmente. A forma genérica é: if variável Sentenças end As sentenças são executadas caso a parte real das variáveis apresente elementos não nulos. A variável é usualmente o resultado de: expressão ==, <, >, <=, >=, ~= expressão. Por exemplo: I=4; J=3; if I < J A(I,J) = 2; elseif abs(I-J) = = 1 A(I,J) = -1; else A(I,J) = 0; End 3.2. Exemplo de programas 3.2.1. Programa operrel1.m m=10; w=20; m>w %errado (0) m<w %certo (1) a=11; while a > m & a < w a=a+1 end m|w %certo (1) a=30 while a > m | a > w a=a-1 end ~m %elemento diferente de zero (0) ~ w %elemento diferente de zero (0) a=1; while a ~= m a=a+1 end xor(m,w) %ambos são diferentes de zero (0) a=1; while xor(a>m,a<w) %a > m xor a < w a=a+1 end 3.2.2. Programa operrel2.m A=15; B=10; while A>B A=A-1 end 27 pause while A>5 A=A-1 end pause while B>A B=B-1 end clear all pause I=4 J=3 if I < J A(I,J)=2 elseif abs(I-J) == 1 A(I,J)=-1 else A(I,J)=0 end clear A pause I=3 J=4 if I < J A(I,J)=2 elseif abs(I-J) == 1 A(I,J)=-1 else A(I,J)=0 end 3.3. Exercício proposto (aula): Programa operrel3.m Para as matrizes x e y escrever na tela do computador: as matrizes x e y têm diagonais idênticas (x11=y11 e x22=y22); as matrizes x e y têm diagonais distintas, porém, com um elemento idêntico; as matrizes x e y têm diagonais distintas a) 41 41 x , 42 31 y b) 41 41 x , 42 31 y c) 41 41 x , 42 31 y 29 4. Aula 4 – Desenvolvimento de programas aplicados Queridos alunos e alunas, Tudo bem? Revisão sobre matrizes Inversa: A inversa de uma matriz A , definida apenas para matrizes quadradas, recebe a denominação 1A . A A 1 A 1 , sendo A a transposta da matriz cujos elementos ija de A são substituídos pelos respectivos cofatores ijA . A inversa de A somente existe se 0A . A matriz quadrada A é singular se 0A e não singular se 0A . Exemplo: 2221 1211 aa aa A ; 21122211 aaaaA ; Vamos relembrar a definição de cofator, ijA : ijjiij M1A , sendo ijM o determinante da matriz resultante da eliminação da linha i e da coluna j da matriz A. 22221111 aa1A 21212112 aa1A 12121221 aa1A 11112222 aa1A 1121 1222 aa aa A 1121 1222 1 aa aa A 1 A Vamos analisar um exemplo numérico: 32 01 A ; 12 03 A ; 3 1 3 2 01 A 1 Posto: O posto ou rank de uma matriz é definido tanto para matrizes quadradas quanto para matrizes não quadradas. A maior sub-matriz quadrada com determinante não nulo fornece o posto da matriz. O posto é o número de linhas que é igual ao número de colunas desta submatriz. O posto de uma matriz tem muita utilidade na análise de sistemas de equações algébricas lineares: bAx Vamos definir a matriz aumentada do sistema como: bAA, Ánálise: 1) se r(A) diferente r(A'): o sistema linear não tem solução. 2) se r(A) igual r(A'), então 2a) se r(A)=r(A')<número de equações: o sistema linear tem infinitas soluções. 2b) se r(A)=r(A')=número de equações: o sistema linear tem uma única solução. 31 4.1. Comandos do OCTAVE No OCTAVE, as funções: ones(n) ones(m,n) ones(A) geram matrizes especiais. Isto é, ones(n) produz uma matriz n X n de elementos iguais a um. ones(m,n) produz uma matriz m X n de elementos iguais a um. De modo semelhante, a função zeros(n) produz uma matriz n X n de zeros, enquanto zeros(m,n) produz uma matriz m X n de zeros. A função zeros(A) produz uma matriz de zeros com as mesmas dimensões de A. Se x é um vetor, a sentença diag(x) produz uma matriz diagonal com os elementos de x na diagonal principal. Por exemplo, para o vetor x=[ones(1,n)], diag([ones(1 ,n)]) fornece uma matriz identidade n X n. Se A for uma matriz quadrada, então diag(A) é um vetor formado pelos elementos da diagonal principal de A e diag(diag(A)) é uma matriz diagonal com elementos de diag(A) aparecendo na diagonal. O comando SUM indica a soma de elementos. Para vetores, SUM(X) é a soma de elementos de X. Para matrizes, SUM(X) é um vetor linha cujos elementos são a soma de cada coluna de X. O comando SUM(DIAG(X)) é o traço de X. O comando TRACE(A) é a soma dos elementos diagonais de A ou a soma dos autovalores de A. INV(A) é a inversa da matriz quadrada A. Uma mensagem de erro é impressa na tela se A for singular. RANK(A) é o número de linhas ou colunas linearmente independentes. DET(A) é o determinante da matriz quadrada A. Em programas OCTAVE é necessário freqüentemente entrar com a matriz identidade I. Uma sentença eye(n) fornece uma matriz identidade n X n. O formato STRINGS atribui a uma variável caracteres escritos dentro das aspas, por exemplo: X = 'Any Characters'. O comando INPUT fornece ao usuário o prompt e aguarda a entrada da variável digitada através do uso do teclado. No OCTAVE o comando global X Y Z define X, Y, Z em escala global. Tradicionalmente, cada função do OCTAVE, definida por um arquivo com extensão m apresenta suas próprias variáveis locais que são separadas das variáveis de outras funções ou do espaço de trabalho ou demais sub-rotinas. Entretanto, caso várias funções, e possivelmente o espaço de trabalho, declarem uma variável particular como global, então, todas compartilham uma cópia da variável. Qualquer atribuição a esta variável em qualquer função estará disponível para todas as demais funções que declararam a variável como global. O comando isglobal é verdadeiro para variáveis globais. ISGLOBAL(A) é unitário caso A seja uma variável global ou zero no casocontrário. Caso F seja uma linha contendo o nome de uma função, usualmente um arquivo.m, então FEVAL(F,x1,...,xn) calcula a função com os argumentos fornecidos entre parênteses. Por exemplo, F = 'foo', FEVAL(F,9.64) é o mesmo que foo(9.64). O comando NUM2STR efetua a transformação de um número em série de caracteres alfanuméricos. T = NUM2STR(X) converte o número escalar X em uma representação alfanumérica T com 4 dígitos e um expoente caso seja necessário. Este comando é útil na rotulagem de gráficos com os comandos TITLE, XLABEL, YLABEL, TEXT. 33 O comando FOR repete sentenças um número específico de vezes. A forma geral do FOR É: FOR variável = expressão, sentença, ..., sentença END. A expressão é freqüentemente da forma X:Y. Por exemplo, admitindo que N seja conhecido previamente: FOR I = 1:N, FOR J = 1:N, A(I,J) = 1/(I+J-1); END END FOR S = 1.0: -0.1: 0.0, END indica passos de S com incremento de -0.1. O comando SAVE salva as variáveis da área de trabalho no disco. O comando SAVE fname salva todas as variáveis da área de trabalho no arquivo binário "MAT-file" nomeado fname.mat. Os dados podem ser carregados com o comando LOAD. Caso haja omissão do nome do arquivo o comando SAVE utiliza o nome de arquivo padrão denominado "octave.mat". Por exemplo, SAVE fname X (salva apenas X). SAVE fname X Y Z (salva X, Y e Z). SAVE fname X Y Z -ascii (usa forma ASCII com 8-dígitos em vez de forma binária). SAVE fname X Y Z -ascii -double (usa forma ASCII com 16-dígitos). O comando LOAD restaura variáveis gravadas no disco. LOAD fname restaura as variáveis do arquivo MAT 'fname.mat'. O uso do comando LOAD carrega variável do arquivo 'octave.mat'. LOAD xxx.yyy lê o arquivo ASCII xxx.yyy, que contém um arranjo retangular de dados numéricos, organizados em m linhas e n valores em cada linha, sendo o resultado uma matriz m por n denominada xxx. 4.2. Exemplo de programas 4.2.1. Programa comand61.m n=3; y=[zeros(1,n)] x=[ones(1,n)] diag([ones(1 ,n)]) pause a=[10 2 3;4 59 6;57 86 29] diag(a) diag(diag(a)) trace(a) sum(diag(a)) rank(a) det(a) inv(a) 4.2.2. Programa Comand62.m Avaliar a existência e unicidade dos sistemas: a) 7y2x2 3yx ; b) 6y2x2 3yx ; c) 4yx2 3yx ; d) 0yx2 0yx ; e) 0y2x2 0yx Programa: 'informar o número de equações' n=input('O número de equações é ====>'); 'informar a matriz de coeficientes' mat = input ('A matriz de coeficientes é ====> '); r1=rank(mat); 'informar o vetor de constantes' x = input ('O vetor de constantes é ====> '); mata=[mat x] r2=rank(mata); if r1 ~= r2 'O sistema linear não tem solução' 'O rank da matriz de coeficiente é diferente' 'do rank da matriz aumentada' end % para o caso de r1 == r2 if r1 == r2 if r2 < n 'Há infinitas soluções' 'O rank da matriz de coeficiente ou o rank da matriz aumentada' 35 'é menor que o número de equações' end if r2 == n 'Há uma única solução' 'O rank da matriz de coeficiente ou o rank da matriz aumentada' 'é igual ao número de equações' x=mat\x end end 4.3. Exercício proposto: comand63.m A matriz atômica (A) indica no elemento ija o número de átomos do elemento químico i presente na molécula de um composto j. Dado um conjunto de NC compostos, o número de reações químicas independentes (NR) que podem ser geradas é igual a: )A(postoNCNR a) Determinar o número de reações independentes para o seguinte conjunto de compostos: OH;ClHC;ClHC;O;HCl;Cl;HC 2322422242 Os coeficientes estequiométricos das reações químicas independentes podem ser calculados pela seguinte equação matricial: 47 37 27 17 46 36 26 16 45 35 25 15 43 33 23 13 42 32 22 12 41 31 21 11 44434241 34333231 24232221 14131211 a a a a a a a a a a a a v v v v v v v v v v v v aaaa aaaa aaaa aaaa onde ija denotam os elementos da matriz atômica A e ijv representam os coeficientes estequiométricos do composto i na reação k. Os coeficientes estequiométricos dos demais compostos são dados por: 100 010 001 vvv vvv vvv 737271 636261 535251 b) Apresentar um conjunto de reações químicas independentes com os seus respectivos coeficientes estequiométricos. 37 5. Aula 5 - Métodos computacionais aplicados à resolução de sistemas lineares de equações algébricas Queridos alunos e alunas, Tudo bem? 5.1. Comandos O comando GTEXT posiciona um texto em um gráfico 2-D usando o mouse do computador. Por exemplo, GTEXT ('caractere') requer o acionamento de uma letra do teclado ou do botão do mouse. 5.2. Método Gauss-Seidel Resolução de sistemas lineares de equações algébricas - Método Gauss-Seidel. O método Gauss-Seidel é empregado em sistemas predominantemente diagonais. Cada equação é usada para calcular a variável da diagonal. É um método iterativo que parte de uma estimativa inicial. Sempre devemos usar os valores mais recentes de cada variável. Exemplo1: Reatores CSTR em série V1 V2 V3 V4 CA1 CA2 CA3 CA4 CA0=1 mol/l 1000 l/h 1000 l/h 1100 l/h 100 l/h 1100 l/h 100 l/h 1100 l/h 1000 l/h 100 l/h Hipóteses: Estado estacionário. As densidades de todas as correntes são iguais, então ao invés de balanço de massa fazer balanço de vazão. Todas as correntes são líquidas. Reação: A=>B (reação de primeira ordem) A dependência entre a taxa e a concentração é linear Taxa de consumo de A, sendo i o reator i: Ri=Ki*CAi*Vi Sistema linear de equações resultante é: 01250C-1100C 0100C1240C-1100C 0100C1400C-1000C 1000C1001000C A4A3 A4A3A2 A32A1A 1A1A Dados cinéticos: Reator Vi(L) Ki(h-1) 1 1000 0,1 2 1500 0,2 3 100 0,4 4 500 0,3 O sistema é predominantemente diagonal porque os reciclos são pequenos quando comparados com o fluxo principal: 39 1100> 0 -1400>1000+100 -1240>1100+100 -1250>1100 5.3. Exemplo de programa 5.3.1. Programa gseidelq.m % Exemplo: i Reatores CSTR em série % Hipótes: % Estado estacionário. % As densidades de todas as correntes são iguais, então % ao invés de balanço de massa fazer balanço de vazão. % Todas as correntes são líquidas. % Reação: A=>B (reação de primeira ordem) % A dependência entre a taxa e a concentração é linear % Taxa de consumo de A, sendo i o reator i: % Ri=Ki*CAi*Vi % Sistema linear de equações resultante é: % 1100*CA1=1000 % 1000*CA1-1400*CA2+100*CA3=0 % 1100*CA2-1240*CA3+100*CA4=0 % 1100*CA3-1250*CA4=0 % O sistema é predominantemente diagonal porque os reciclos são pequenos quando comparados com o fluxo principal: % 1100> 0 % -1400>1000+100 % -1240>1100+100 % -1250>1100 %****************************************************************** % Como CA1=1000/1100, então, CA2, CA3, CA4 devem ser menor que CA1 % CA2, CA3, CA4 devem estar no intervalo (0,CA1) % Estimativa inicial primitiva: CA2=CA3=CA4=0,6 % Chute inicial CA_2=0.6; CA_3=0.6; CA_4=0.6; CA2old=CA_2; CA3old=CA_3; CA4old=CA_4; CA2=0.6; CA3=0.6; CA4=0.6; CA1=1000/1100; CA2=(1000*CA1+100*CA3)/1400; CA3=(1100*CA2+100*CA4)/1240; CA4=1100*CA3/1250; % Dado inicial CA_1=1000/1100; k=1; while abs((CA2-CA2old)/CA2) > 1e-7 | abs((CA3-CA3old)/CA3) > 1e-7 | abs((CA4- CA4old)/CA4) > 1e-7 k % Cada equação é usada para calcular a variável da diagonal: CA1=1000/1100; CA2=(1000*CA1+100*CA3)/1400; CA3=(1100*CA2+100*CA4)/1240; CA4=1100*CA3/1250; CA_1=[CA_1,CA1]; CA_2=[CA_2,CA2]; CA_3=[CA_3,CA3]; CA_4=[CA_4,CA4]; l=length(CA_1)-1; CA2old=CA_2(l); CA3old=CA_3(l); CA4old=CA_4(l); k=k+1; end CA=[CA_1' CA_2' CA_3' CA_4']; % saídas gráficas subplot (2,2,1) plot(CA(:,1),'r');xlabel('Iteração'); ylabel('CA1'); subplot(2,2,2) plot(CA(:,2),'b'); xlabel('Iteração'); ylabel('CA2'); subplot(2,2,3) plot(CA(:,3),'g'); xlabel('Iteração'); ylabel('CA3'); subplot(2,2,4) plot(CA(:,4),'m'); 41 xlabel('Iteração'); ylabel('CA4'); gtext('CSTR - Método de Gauss-Seidel'); % salvar dados save gseidel.dat CA -ascii 5.4. Exercício proposto: Programa gseidelt.m A determinação do perfil de temperatura de um sólido no estado estacionário pode ser expressa por um sistema de equações algébricas lineares. Para calcular o perfil de temperatura do corpo bidimensional devem ser resolvidas as seguintes equações algébricas lineares, sendo T1, T2, ... Tn as temperaturas pontuais a serem determinadas: -4*T1+T2+T4=-600 T1-4*T2+T3+T5=-500 2*T2-4.67*T3+T6=-567 T1-4*T4+T5+T7=-100 T2+T4-5*T5+T6+T8=0 T3+2*T5-4.67*T6+T9=-67 T4-4.67*T7+T8=-167 2*T5+T7-4.67*T8+T9=-67 T8-2.67*T9=-67 6. Aula 6 – Métodos computacionais aplicados à resolução de sistemas lineares de equações algébricas Queridos alunos e alunas, Tudo bem? Vamos estudar o Método de Eliminação Gaussiana 6.1. Método de Eliminação Gaussiana A técnica de Eliminação Gaussiana consiste em realizar operações elementares partindo de bAx : n 2 1 n 2 1 nn2n1n n22221 n11211 b b b x x x aaa aaa aaa até chegar à forma: , n , 2 , 1 n 1n 2 1 nn n,1n1n,1n n222 n11211 bb bb bb x x x x aa000 aaaa aaaa0 aaaaaa . Na forma triangular é fácil resolver o sistema por retrossubstituição: na última linha, determinamos nx ; conhecendo nx , na penúltima linha, calculamos 1nx ; conhecendo nx , 1nx , calculamos 2nx na linha anterior; etc..., até determinar 1x na primeira linha. 6.2. Comandos \ É o operador divisão esquerda. A\B equivale a fazer INV(A)*B. Caso A seja uma matriz N por N e B um vetor coluna com N componentes, então, X = A\B é a solução da equação A*X = B calculada por Eliminação Gaussiana. A\EYE(SIZE(A)) produz a inversa de A. 43 6.3. Exercício proposto: eg.m Cinco correntes gasosas são alimentadas em um misturador. Sendo conhecidas as composições dessas cinco correntes e da corrente de saída, determinar as vazões molares de todas as correntes evolvidas no processo. Resolver implementando \ e o método da Eliminação Gaussiana. misturador A=100lbmol/h B C D E F Gás % molar corrente A % molar corrente B % molar corrente C % molar corrente D % molar corrente E % molar corrente F 4CH 39% 30% 40% 32% 28% 35% 62HC 28% 25% 30% 23% 25% 20% 83HC 23% 15% 10% 20% 20% 23% 2H 9% 10% 11% 14% 16% 15% 2N 1% 20% 9% 11% 11% 7% 7. Aula 7 – Métodos computacionais aplicados à resolução de sistemas lineares de equações algébricas Queridos alunos e alunas, Tudo bem? Vamos estudar o Método Gauss-Jordan 7.1. Método Gauss-Jordan Para o sistema bAx , após uma série de operações elementares: cIx . 1selementareoperações AsoluçãoIIbA Este método permite calcular a matriz inversa. Mas a matriz inversa não é sempre necessária. Se 1A não é necessária, é melhor não usar o método de Gauss-Jordan porque é possível resolver o sistema linear por outros métodos (por exemplo, Eliminação Gaussiana) com menos operações algébricas 7.2. Exercício proposto (aula): gj1.m Uma bateria de três extratores opera em contra-corrente a fim de recuperar o produto P que está dissolvido no solvente A. Um solvente B é utilizado para a extração. Devido a um problema operacional no extrator 2, ele opera com capacidade reduzida, de modo que foi montado um bypass parcial que desvia 20% da vazão de saída do extrator 1. Admite-se que os solventes A e B sejam completamente imiscíveis e que o processo opere em estado estacionário. Calcular as concentrações de P em todas as etapas do processo, sabendo que as vazões dos dois solventes Vb,Va são iguais, que as concentrações de P na entrada da bateria são de: BsolventedekgPdekg01,04y 45 AsolventedekgPdekg2,00x A equação de equilíbrio que relaciona as concentrações de saída de cada extrator é: x5,1y Extrator 1 Extrator 2 Extrator 3 Vb, y1 Va, x0 y2 x1 x1 20% Va, x1 x2 y3 y4, Vb x3, Va 7.3. Exercício proposto (aula): gj2.m A relação entre a pressão de vapor satP de um fluido e sua temperatura pode ser modelada pela equação: TlnC T B AexpP sat , na qual T é expressa em Rankine e satP em psia. Na tabela abaixo são fornecidos dados experimentais de T versus satP para a amônia. T(°R) 459,67 479,67 499,67 satP (psia) 30,42 48,21 73,32 Calcular a pressão de vapor da amônia a 474,67 °R. 8. Aula 8 – Ajuste e interpolação de curvas oriundas de resultados experimentais Queridos alunos e alunas, Tudo bem? Ajuste Qual o conjunto de parâmetros que fornece a melhor representação dos dados experimentais segundo um modelo previamente escolhido? Ajuste por regressão linear O objetivo é minimizar: NP 1j 2 jj yYf , sendo NP =número de pontos experimentais; jY =valor experimental da variável dependente no ponto j; jy =valor calculado da variável dependente no ponto j; Vamos propor um modelo linear nos parâmetros n10 b,,b,b : jnnj11j00j xgbxgbxgby , sendo: jx =valor da variável independente no ponto experimental j Vamos substituir na função f o valor de jy : NP 1j 2n 0i jiij NP 1j 2 jnnj11j00j NP 1j 2 jj xgbYxgbxgbxgbYyYf Vamos derivar f em relação aos parâmetros n10 b,,b,b e igualar as derivadas a zero. Dessas operações resulta um sistema de equações algébricas lineares nos parâmetros n10 b,,b,b com o formato: YGbGG TT , sendo 47 NP 2 1 NPnNP1 2n21 1n11 Y Y Y Y xgxg1 xgxg1 xgxg1 G Este sistema pode ser resolvido por eliminação Gaussiana. 8.1. Comandos O comando POLYFIT(x,y,n) encontra os coeficientes do polinômio p(x) de grau n que se ajusta aos dados, p(x(i)) ~= y(i), por mínimos quadrados. [p] = POLYFIT(x,y,n) fornece os coeficientes polinomiais p. O comando LENGTH indica o número de componentes de um vetor. Por exemplo, LENGTH(X) retorna o comprimento do vetor X. Este comando é equivalente a MAX(SIZE(X)). 8.2. Exemplo de programa 8.2.1. Programa ajuste1.m Os seguintes dados experimentais estão disponíveis para a condutividade térmica da água à pressão de 50 bar: T (°C) 0 50 100 150 200 k (mwatt/m°C) 573 647 684 690 668 Ajustar um polinômio cúbico por regressão linear a partir de todas as informações disponíveis. % Aplicação da técnica de regressão linear ao ajuste de um %modelo linear nos parâmetros % Ajuste por regressão linear: % min f=somatório(Yj-yj)^2 % Propondo-se um modelo linear: % yj=b0g0(xj)+b1g1(xj)+...+bngn(xj) % O conjunto de parâmetros é solução do sistema linear: % (G'G)b=G'Y - Eliminação Gaussiana % Sistema: Ajuste da condutividade térmica da água à pressão de 50 bar % k=b0+b1*T+b2*T^2+b3*T^3, sendo % k=condutividade térmica % T=temperatura % Dados experimentais: % T(°C) 0 50 100 150 200 % k(mwatt/m°C) 573 647 684 690 668 T=[0 50 100 150 200]'; k=[573 647 684 690 668]'; [b]=polyfit(T,k,3) % Alternativamente % Modelo linear:k=b0+b1*T+b2*T^2+b3*T^3 ou % Y=b0*g0+b1*g1+b2*g2+b3*g3 % Sendo: Y=k; % g0=ones(1,size(k)); % g1=T; % g2=T.^2; % g3=T.^3; Y=k g0=ones(1,length(k))' g1=T g2=T.^2 g3=T.^3 G=[g0 g1 g2 g3] % (G'G)b=G'Y - Eliminação Gaussiana % Sendo: GTG=(G'G) e GTY=G'Y GTG=G'*GGTY=G'*Y % Conjunto de parâmetros que fornece a melhor representação % dos dados experimentais segundo um modelo previamente escolhido b=GTG\GTY flipud(b)' 49 8.3. Exercício proposto (aula): Programa ajuste2.m Sistema: Ajuste do custo de mão-de-obra na produção de trocadores de calor: C=b0+b1*A+b2*N, sendo C=custo da mão-de-obra A=área do trocador N=número de tubos Dados experimentais: C 310 300 275 250 220 200 190 150 140 100 A 120 130 108 110 84 90 80 55 64 50 N 550 600 520 420 400 300 230 120 190 100 8.3.1. Programa ajuste3.m Ajuste de um modelo não linear nos parâmetros - Secagem de soja Modelo para secagem de soja Ys=umidade do sólido em um tempo t qualquer Yse=umidade do sólido em tempo t -> infinito Ys0=umidade do sólido em tempo t -> 0 Psat=pressão de saturação Pv=pressão parcial de vapor no ar t= tempo de secagem m,n,q=parâmetros a ajustar Sistema: M=(Ys-Yse)/(Ys0-Yse)=exp[-m*((Psat-Pv)^n)*t^q] Dados experimentais: M, (adimensional) 0,674 0,561 0,405 0,327 (Psat-Pv), (kgf/dm^2) 12 25 60 90 t, (h) 0,5 1 2 3 51 9. Aula 9 – Ajuste e interpolação de curvas oriundas de resultados experimentais Queridos alunos e alunas, Tudo bem? Interpolação Na interpolação, a curva contínua obtida passa por todos os pontos experimentas. A interpolação é empregada quando não se tem um modelo para um dado fenômeno ou quando o modelo é complicado demais para as necessidades. Além disso, a interpolação polinomial tem importância na interpolação de dados tabelados. Um polinômio interpolador de grau n passa por n+1 pontos distintos. Este polinômio interpolador é único, embora haja maneiras diferentes de obtê-lo (resolução do sistema linear, forma de Lagrange, forma de Newton para pontos regularmente espaçados). Na prática raramente se usam polinômios interpoladores de grau muito elevado (>7 ou 8), pois o comportamento destes polinômios pode ser errático. Seja o polinômio interpolador de grau n: nn2210n xaxaxaaP . Supõe-se que há n+1 pontos experimentais disponíveis: ;xf,x;;xf,x;xf,x nn1100 e n+1 coeficientes a determinar: n10 a;;a;a . Vamos impor que o polinômio passe exatamente pelos pontos tabelados: n n nn 2 n2n10 1 n 1n 2 12110 0 n 0n 2 02010 xfxaxaxaa xfxaxaxaa xfxaxaxaa n10 x;x;x são conhecidos. Portanto, o problema é resolver um sistema de equações lineares em n10 a;;a;a de forma matricial: n 1 0 n 1 0 n n n 1 n 0 2 nn 2 11 2 00 xf xf xf a a a x x x xx1 xx1 xx1 A matriz de coeficientes é denominada matriz de Vandermonde. Para n10 x;x;x todos mutuamente distintos, o posto da matriz é n+1, o que garante a unicidade da solução (o polinômio interpolador é único). Forma de Lagrange do Polinômio Interpolador xLxfxLxfxLxfxp nn1100n Sendo: nj1jj1jj1j0j n1j1j10 j xxxxxxxxxx xxxxxxxxxx xL Para 1xLxx jjj ; Para 0Lx,,x,x,,x,xx jn1j1j10 . Compactando a notação: n ji 0i ij i j xx xx xL e o polinômio é: xLxfxp j n 0j jn . 9.1. Exemplo de programa 9.1.1. Programa intp1.m Interpolação de dados em uma tabela de vapor. De acordo com os dados da tabela teremos um polinômio interpolador de grau 3 passando por 4 pontos distintos: 3322103 tatataatP . 53 373 T t 462 1406 1939 2257 a a a a 1228,59717,27239,11 6252,33599,25362,11 0392,26081,12681,11 1111 3 2 1 0 T(K) t (T adimensional) t2(T adimensional)2 t3(T adimensional)3 vapH 373 1 1 1 2257 473 1,2681 1,6081 2,0392 1939 573 1,5362 2,3599 3,6252 1406 643 1,7239 2,9717 5,1228 462 % Interpolação de dados em uma tabela de vapor % Dados global a0 a1 a2 a3 temp=[373 473 573 643]; DH_VAP=[2257 1939 1406 462]; % Polinômio interpolador de grau 3 a partir de 4 dados % P3_t=a0+a1*t+a2*t^2+a3*t^3 A=[ones(4,1) temp/373 (temp/373).^2 (temp/373).^3] B=DH_VAP; a=A\B a0=a(1); a1=a(2); a2=a(3); a3=a(4); % Para T=512 K T=512; DH_512calc=a(1)+a(2)*T/373+a(3)*(T/373)^2+a(4)*(T/373)^3 % Na tabela de vapor DH_512exp=1768 KJ/Kg DH_512exp=1768 Desvio_relativoH=(DH_512calc-DH_512exp)/DH_512exp % Vamos extrapolar DH_VAP para o ponto crítico da água, onde DH_VAP=0, isto é, fase vapor e % líquida são identicas. Vale ressaltar que na extrapolação não há garantia do comportamento da função. DH_VAP_TC=0; TC_calc=fzero('intp11',650) % Dado experimental: TC_exp=647 K TC_exp=647; 55 Desvio_relativoTC=(TC_calc-TC_exp)/TC_exp % Erro na extrapolação maior que na interpolação plot(temp,DH_VAP,'ro'); hold plot(T,DH_512calc,'w+'); axis([300 900 0 2500]); text(550,DH_512calc,'Ponto interpolado'); hold hold plot(TC_calc,DH_VAP_TC,'w*'); v = [350 900 0 2500]; axis(v) text(TC_calc,150,'Ponto extrapolado'); title ('Interpolação/extrapolação de dados em tabela de vapor'); xlabel ('Temperatura (K)'); ylabel ('DH, KJ/Kg'); %************************************************************************** **************************************** função intp11.m function [f]=intp11(x); global a0 a1 a2 a3 f=a0+a1*x/373+a2*(x/373)^2+a3*(x/373)^3; 9.1.2. Programa intp2.m % Interpolação de dados em uma tabela de vapor % Dados temp=[373 473 573 643]; DH_VAP=[2257 1939 1406 462]; % Polinômio interpolador de grau 3 a partir de 4 dados % P3_t=a0+a1*t+a2*t^2+a3*t^3 % Para T=512 K T=512; DH_512calc=interp1(temp,DH_VAP,T,'spline') % Na tabela de vapor DH_512exp=1768 KJ/Kg DH_512exp=1768 Desvio_relativoH=(DH_512calc-DH_512exp)/DH_512exp plot(temp,DH_VAP,'ro'); hold plot(T,DH_512calc,'w+'); axis([300 900 0 2500]); text(550,DH_512calc,'Ponto interpolado'); 57 title ('Interpolação/extrapolação de dados em tabela de vapor'); xlabel ('Temperatura (K)'); ylabel ('DH, KJ/Kg'); 9.1.3. Exercício proposto: Programa lagrange.m (Dica: usar conv2) Interpolação de dados em uma tabela de vapor. De acordo com os dados da tabela teremos um polinômio interpolador de grau 3 passando por 4 pontos distintos: 3322103 tatataatP . 373 T t T(K) 373 T t vapH 373 1 2257 473 1,2681 1939 573 1,5362 1406 643 1,7239 462 tLtHtLtHtLtHtLtH tLtHtLtftp 33 vap 22 vap 11 vap 00 vap j 3 0j j vap j 3 0j j3 302010 321 0 tttttt tttttt tL ; 312101 320 1 tttttt tttttt tL ; 321202 310 2 tttttt tttttt tL ; 231303 210 3 tttttt tttttt tL Programa: Determinar os coeficientes do polinômio e calcular 512H vap e comparar com o valor obtido da tabela de vapor: kgkJ1768512H vap . 10. Aula 10 – Resolução de equação algébrica não linear Queridos alunos e alunas, Tudo bem? Método de Newton-Raphson O método se baseia em realizar linearizações sucessivas de xf . Usando série de Taylor truncada no termo linear: 0x 00 dx df xxxfxf . Vamos impor que 0xf , logo: 0xfxxxf 0,00 . Portanto, 0, 0 0 xf xf xx . Generalizando, i, i i1i xf xf xx . f(x) xx0x1x2 tangente à curva em (x0, f(x0)) tangente à curva em (x1, f(x1)) tangente à curva em (x2, f(x2)) Críticado método de Newton-Raphson: muito rápido desde que se tenha uma boa estimativa inicial a convergência não é garantida exige derivadas analíticas 59 10.1. Comandos O comando global X Y Z define X, Y, Z em escala global. Tradicionalmente, cada função, definida por um arquivo com extensão m apresenta suas próprias variáveis locais que são separadas das variáveis de outras funções ou do espaço de trabalho ou demais sub- rotinas. Entretanto, caso várias funções, e possivelmente o espaço de trabalho, declarem uma variável particular como global, então, todas compartilham uma cópia da variável. Qualquer atribuição a esta variável em qualquer função estará disponível para todas as demais funções que declararam a variável como global. O comando isglobal é verdadeiro para variáveis globais. ISGLOBAL(A) é unitário caso A seja uma variável global ou zero no caso contrário. Caso F seja uma linha contendo o nome de uma função, usualmente um arquivo.m, então FEVAL(F,x1,...,xn) calcula a função com os argumentos fornecidos entre parênteses. Por exemplo, F = 'foo', FEVAL(F,9.64) é o mesmo que foo(9.64). O comando NUM2STR efetua a transformação de um número em série de caracteres alfanuméricos. T = NUM2STR(X) converte o número escalar X em uma representação alfanumérica T com 4 dígitos e um expoente caso seja necessário. Este comando é útil na rotulagem de gráficos com os comandos TITLE, XLABEL, YLABEL, TEXT. O comando FOR repete sentenças um número específico de vezes. A forma geral do FOR É: FOR variável = expressão, sentença, ..., sentença END. A expressão é freqüentemente da forma X:Y. Por exemplo, admitindo que N seja conhecido previamente: FOR I = 1:N, FOR J = 1:N, A(I,J) = 1/(I+J-1); END END FOR S = 1.0: -0.1: 0.0, END indica passos de S com incremento de 0.1. O comando SAVE salva as variáveis da área de trabalho no disco. O comando SAVE fname salva todas as variáveis da área de trabalho no arquivo binário "MAT-file" nomeado fname.mat. Os dados podem ser carregados com o comando LOAD. Caso haja omissão do nome do arquivo o comando SAVE utiliza o nome de arquivo padrão denominado "*.mat". Por exemplo, SAVE fname X (salva apenas X). SAVE fname X Y Z (salva X, Y e Z). SAVE fname X Y Z -ascii (usa forma ASCII com 8-digitos em vez de forma binária). SAVE fname X Y Z -ascii -double (usa forma ASCII com 16-digitos). O comando LOAD restaura variáveis gravadas no disco. LOAD fname restaura as variáveis do arquivo MAT 'fname.mat'. O uso do comando LOAD carrega variável do arquivo '*.mat'. LOAD xxx.yyy lê o arquivo ASCII xxx.yyy, que contém um arranjo retangular de dados numéricos, organizados em m linhas e n valores em cada linha, sendo o resultado uma matriz m por n denominada xxx. 10.2. Métodos matemáticos para resolução de equações algébricas não lineares T, P F, z V, y L, x 61 Flash isotérmico ( psia1600P e F120T o ) Balanço por componente: iii VyLxFz Balanço global: VLF Restrições: 1z i i , 1x i i , 1y i i Relação de equilíbrio: iii xky , P,Tkk ii Vamos dividir o balanço por componente por F : iii yF V x F L z Sendo VLF , F V 1 F L Vamos definir como a fração vaporizada da carga (alimentação), então: iii yx1z Vamos usar a relação de equilíbrio, então: iii xk1z i i i k1 z x e i ii iii k1 zk xky Vamos usar 1x i i e 1y i i da seguinte forma: 01k1 z1k k1 zzk 0xy i i ii i i iii i i i i Portanto a equação de Flash é: 01k1 z1k f i i ii No do componente Componente iz ik 1 metano 0,7 3,09 2 propano 0,1 0,39 3 n-pentano 0,1 0,093 4 n-hexano 0,1 0,065 10.3. Exemplo: Resolução de equações algébricas não lineares 10.3.1. Programa new.m % Método de Newton-Raphson % Flash isotérmico; p=1600 psia; T=120°F % N Componentes: metano (zM=0,70); propano (zP=0,10); n-pentano (znP=0,10); n- hexano (znH=0,10) % Constante de equilíbrio: metano (kM=3,09); propano (kP=0,39); n-pentano (knP=0,093); n-hexano (knH=0,065) % Equação de Flash: fb(i)=somatório[(ki-1)zi/(1+b(ki-1))]=0 % Recursão do método: b(i+1)=b(i)-fb(i)/f'b(i) % f'b(i)=somatório[-(zi*(ki-1)^2)/(1+b*(ki-1))^2; % Estimativas iniciais: b=0,50 global N N=4; z(1)=0.70; z(2)=0.10; z(3)=0.10; z(4)=0.10; k(1)=3.09; k(2)=0.39; k(3)=0.093; k(4)=0.065; b=0.50; b0=b; f=feval('new1',b,z,k); f0=f; df=feval('new2',b,z,k); b=b-(f/df); while abs(f) > 1e-15 b0=[b0,b]; f=feval('new1',b,z,k); df=feval('new2',b,z,k); b=b-(f/df); f0=[f0,f]; end % saídas gráficas subplot (1,2,1) plot(f0,'m'); xlabel('Iteração'); ylabel('f(b)'); title( ['Flash - Método Newton-Raphson' ] ); subplot(1,2,2) plot(b0,'m'); xlabel('Iteração'); 63 ylabel('b(% vaporizada da carga)'); title( [ 'Flash - Método Newton-Raphson' ] ); % salvar dados save fbnew.dat f0 -ascii save bnew.dat b0 -ascii %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [f]=new1(b,z,k); global N for i=1:N f(i)=(k(i)-1)*z(i)/(1+b*(k(i)-1)); end f=sum(f); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [df]=new2(b,z,k); global N for i=1:N df(i)=-(z(i)*(k(i)-1)^2)/(1+b*(k(i)-1))^2; end df=sum(df); 11. Aula 11 – Resolução de equação algébrica não linear Queridos alunos e alunas, Tudo bem? Método da Bisseção Sistematicamente reduz à metade o intervalo de busca, dado um intervalo inicial de x,x que contém a raiz. Recursão do método para resolução de 0xf 2 xx x dem Se 0xfxf dm Então, me xx Caso contrário, md xx Crítica do método: fácil de aplicar lento, comparado a outros métodos que veremos a seguir 65 11.1. Métodos matemáticos para resolução de equações algébricas não lineares T, P F, z V, y L, x Flash isotérmico ( psia1600P e F120T o ) Balanço por componente: iii VyLxFz Balanço global: VLF Restrições: 1z i i , 1x i i , 1y i i Relação de equilíbrio: iii xky , P,Tkk ii Vamos dividir o balanço por componente por F : iii yF V x F L z Sendo VLF , F V 1 F L Vamos definir como a fração vaporizada da carga (alimentação), então: iii yx1z Vamos usar a relação de equilíbrio, então: iii xk1z i i i k1 z x e i ii iii k1 zk xky Vamos usar 1x i i e 1y i i da seguinte forma: 01k1 z1k k1 zzk 0xy i i ii i i iii i i i i Portanto a equação de Flash é: 01k1 z1k f i i ii No do componente Componente i z ik 1 metano 0,7 3,09 2 propano 0,1 0,39 3 n-pentano 0,1 0,093 4 n-hexano 0,1 0,065 11.2. Exemplo: Resolução de equações algébricas não lineares 11.2.1. Exercício proposto (aula): Programa bis.m e bis1.m Implementar o Método da bisseção para o Flash isotérmico; p=1600 psia; T=120°F nas condições: N Componentes: metano (zM=0,70); propano (zP=0,10); n-pentano (znP=0,10); n-hexano (znH=0,10) Constante de equilíbrio: metano (kM=3,09); propano (kP=0,39); n-pentano (knP=0,093); n- hexano (knH=0,065) Estimativas iniciais: be=0,20; bd=0,80 67 12. Aula 12 – Resolução de equação algébrica não linear Queridos alunos e alunas, Tudo bem? Método da Secante Evita o uso de derivadas analíticas, sendo que os pontos empregados para obtenção da aproximação numérica da derivada da função sempre cercam a raiz do problema. 1ii 1ii, numéricai xx xfxf xf . Da fórmula de Newton-Raphson ( i, i i1i xf xf xx ), substituindo i, xf pela aproximação numérica obtemos: 1ii 1ii i i, numéricai i i1i xx xfxf xf x xf xf xx . f(x) x x0 x1Crítica do método da Secante: mais lento que o método de Newton-Raphson porém, evita o uso de derivadas analíticas não há garantia de convergência 12.1.1. Exemplo de uma função já implementada no OCTAVE 12.1.1.1. Programa flash1.m nodo componente Componente iz ik 1 metano 0,7 3,09 2 propano 0,1 0,39 3 n-pentano 0,2 0,093 % Flash isotérmico; p=1600 psia; T=120°F % N Componentes: metano (zM=0,70); propano (zP=0,10); n-pentano (znP=0,20) % Constante de equilíbrio: metano (kM=3,09); propano (kP=0,39); n-pentano (knP=0,093) % Equação de Flash: f(b)=somatório[(ki-1)zi/(1+b(ki-1))]=0 % Estimativa inicial: b=0,20 global N z k f0 f0=0; N=3; z(1)=0.70; z(2)=0.10; z(3)=0.20; k(1)=3.09; k(2)=0.39; k(3)=0.093; 69 b=0.2; bfinal=fzero('flash11',b,1e-4,1); f0=f0(2:1:length(f0)) feval('flash11',bfinal) % saídas gráficas plot(f0,'r'); xlabel('Iteração'); ylabel('f(b)'); title(['% vaporizada da carga é ',num2str(bfinal)]), % salvar dados save fflash.dat f0 -ascii save bflash.dat bfinal -ascii save fflash f0 save bflash bfinal clear f0 load fflash.dat fflash load fflash f0 %************************************************************************** function [f]=flash11(b); global N z k f0 for i=1:N f(i)=(k(i)-1)*z(i)/(1+b*(k(i)-1)); end f=sum(f); f0=[f0 f]; 12.1.2. Exercício proposto: Programa scnt.m Implementar o Método da Secante para o Flash isotérmico; p=1600 psia; T=120°F, nas condições: N Componentes: metano (zM=0,70); propano (zP=0,10); n-pentano (znP=0,10); n-hexano (znH=0,10) Constante de equilíbrio: metano (kM=3,09); propano (kP=0,39); n-pentano (knP=0,093); n- hexano (knH=0,065) 71 13. Aula 13 – Resolução de equação algébrica não linear Queridos alunos e alunas, Tudo bem? Método da Regula-Falsi Evita o uso de derivadas analíticas, sendo que os pontos empregados para obtenção da aproximação numérica da derivada da função sempre cercam a raiz do problema. ed ed, numéricai xx xfxf xf Da fórmula de Newton-Raphson ( i, i i1i xf xf xx ), substituindo i, xf pela aproximação numérica obtemos: ed ed i i, numéricai i i1i xx xfxf xf x xf xf xx . f(x) x xe xd região descartada região retida O critério de descarte de regiões é igual ao critério empregado na Bisseção: Se 0xfxf e1i Então, 1id xx Caso contrário, 1ie xx Crítica do método da Regula-Falsi: mais lento que o método da secante porém, evita o uso de derivadas analíticas pode-se garantir a convergência 13.1.1. Exercício proposto: Programa Regula-Falsi Implementar o Método da Regula-Falsi para o Flash isotérmico; p=1600 psia; T=120°F, nas condições: N Componentes: metano (zM=0,70); propano (zP=0,10); n-pentano (znP=0,10); n-hexano (znH=0,10) Constante de equilíbrio: metano (kM=3,09); propano (kP=0,39); n-pentano (knP=0,093); n- hexano (knH=0,065).
Compartilhar