Programação para as Ciências Experimentais 2008/9 Teórica 10 Ludwig Krippahl, 2009 Ficha 7 Não é para entregar Aula de compensação? • Mas é para fazer... • Turnos P3-6 Ludwig Krippahl, 2009 2 Na aula de hoje... Resolução do trabalho 1 Integração de funções de uma variável. Integração de equações diferenciais. Osciladores químicos. Ludwig Krippahl, 2009 3 Trabalho 1 Discussões do trabalho • Não entregaram intermédia, ou muito • • • incompleta Não tivemos oportunidade de acompanhar Muito diferente do que foi dado ... Lista a afixar, depois contactem o docente das práticas. • Se possível, será na aula prática Ludwig Krippahl, 2009 4 Objectivo Acertar reacções químicas ?H2 + ?O2 ?H2O Ludwig Krippahl, 2009 5 Objectivo Acertar reacções químicas ?H2 + ?O2 ?H2O Reacções simples (não redox, etc) Nenhum termo com parêntesis • Ca(NO3)2 Ludwig Krippahl, 2009 fica CaN2O6. 6 Objectivo Acertar reacções químicas ?H2 + ?O2 ?H2O 2H2 + O2 2H2O Ludwig Krippahl, 2009 7 Partir o problema Ler o ficheiro Estruturar cada reacção Procurar coeficientes Gravar resultados • Testar se acertou Ludwig Krippahl, 2009 8 Tirar os espaços function t=semespacos(s) t=""; for f=1:length(s) if s(f)>" " t=[t,s(f)]; endif endfor endfunction Ludwig Krippahl, 2009 9 Tirar os espaços Menos intuitivo, mas mais sucinto: function t=semespacos(s) t=s(s>" "); endfunction Ludwig Krippahl, 2009 10 Testar coeficientes ?H2 + ?O2 ?H2O Vector de coeficientes: Codificar em vectores tb • [1 1 1] • H: [2 0 -2] • O: [0 2 -1] (produtos a negativo) Testar se sum(co.*el)==0 Ludwig Krippahl, 2009 11 Testar coeficientes Estrutura com .esteq .el A estequiometria para o teste O elemento para podermos organizar a estequiometria Ludwig Krippahl, 2009 12 Testar coeficientes function r=testa(esteq,lista) r=true; for f=1:length(lista) if sum(esteq.*lista(f).esteq)!=0 r=false; break endif endfor endfunction Ludwig Krippahl, 2009 13 Procurar coeficientes • 0: [1 1 1] • 1: [2 1 1] [1 2 1] [1 1 2] • 2: [3 1 1] [2 2 1] [2 1 2] [2 2 1] [1 3 1] [1 2 2] [2 1 2] [1 2 2] [1 1 3] • 3: ... Ludwig Krippahl, 2009 14 Procurar coeficientes testatodos.m Ludwig Krippahl, 2009 15 Criar os coficientes Lista de termos Cada termo, decompor Cada elemento, acrescentar a lista de elementos • .termo • .produto • .el • .esteq Ludwig Krippahl, 2009 16 Criar os coficientes acrescentar.m crialista.m • Acrescentar cada elemento à lista • Percorre lista de termos • Decompõe e acrescenta Ludwig Krippahl, 2009 17 Processar cada reacção Partir em termos Tirar os coeficientes Gerar o vector com • .termo • .produto Ludwig Krippahl, 2009 18 Processar cada reacção tiranumero.m separatermos.m • Devolve o número (ou 1) e o resto do termo • Recebe a reacção e devolve o vector com • .termo • .produto • Devolve também a estequiometria inicial Ludwig Krippahl, 2009 19 Processar cada reacção Com uma reacção • Separar os termos • [ltermos,esteq]=separatermos(reac); • Criar o vector com as estequiometrias • lelems=crialista(ltermos); • Testar o inicial e depois todos • [encontra,esteq]=testatodos ... • acerta.m Ludwig Krippahl, 2009 20 Juntar tudo Percorre ficheiro de entrada Cada reacção • acerta(r,maximo); • Se vazio, não conseguiu, • Caso contrário, escreve reacção acertada • acertada.m acertatudo.m Ludwig Krippahl, 2009 21 Trabalhos práticos Começar com tempo Aproveitar as aulas • práticas e teóricas Ludwig Krippahl, 2009 22 Integração numérica. y = exp(-x3) Ludwig Krippahl, 2009 23 Integração numérica Aproximar a função considerando cada rectângulo dx*y Ludwig Krippahl, 2009 24 Integração numérica Quanto menor dx mais aproximado dx*y Ludwig Krippahl, 2009 25 Integração numérica function int=intexpxcubo(dx,x0,x1); int=0; for x=x0:dx:x1-dx int=int+dx*exp(-x^3); endfor endfunction Ludwig Krippahl, 2009 26 Integração numérica octave:114> intexpxcubo(0.2,0,2) ans = 0.99296 octave:115> intexpxcubo(0.02,0,2) ans = 0.90296 octave:116> intexpxcubo(0.002,0,2) ans = 0.89395 octave:117> intexpxcubo(0.0002,0,2) ans = 0.89305 Ludwig Krippahl, 2009 27 Integração numérica Aproximar melhor pela regra do trapézio Ludwig Krippahl, 2009 28 Integração numérica Àrea: base*(a+b)/2 a b base Ludwig Krippahl, 2009 29 Integração numérica Implementação: • Método ingénuo: calcular os dois y em cada • iteração. Método mais eficiente: calcular o y2 e guardálo no y1 para a próxima y1 Ludwig Krippahl, 2009 y2 30 Integração numérica function int=intexcubot(dx,x0,x1) int=0; y1=exp(-x0^3); for x=x0+dx:dx:x1 y2=exp(-x^3); int=int+dx*(y1+y2)/2; y1=y2; endfor endfunction Ludwig Krippahl, 2009 31 Integração numérica octave:180> intexcubot(0.2,0,2) ans = 0.89293 octave:181> intexpxcubo(0.2,0,2) ans = 0.99296 octave:182> intexcubot(0.002,0,2) ans = 0.89295 octave:183> intexpxcubo(0.002,0,2) ans = 0.89395 Ludwig Krippahl, 2009 32 Integração numérica Implementação mais genérica: • Separar a função que calcula o y da função que integra. Ludwig Krippahl, 2009 33 Integração numérica Implementação mais genérica: • Cálculo y em função de x • function y = nome(x) function y=expxcubo(x) y=exp(-x.^3); endfunction Ludwig Krippahl, 2009 34 Integração numérica Implementação mais genérica: • Integração, chamando a função com feval function int=trapezio(funcao,dx,x0,x1) int=0; y1=feval(funcao,x0); for x=x0+dx:dx:x1 y2=feval(funcao,x); int=int+dx*(y1+y2)/2; y1=y2; endfor endfunction Ludwig Krippahl, 2009 35 Integração numérica Implementação mais genérica: octave:185> trapezio("expxcubo",0.2,0,2) ans = 0.89293 Nota: “expxcubo” em vez de expxcubo! Ludwig Krippahl, 2009 36 E se não podemos traçar a função? Exemplo: Não podemos calcular a área geometricamente pelo gráfico da função. • A+BC • d[C]/dt = K [A] [B] • d[A]/dt = -K [A] [B] • d[B]/dt = -K [A] [B] Ludwig Krippahl, 2009 37 E se não podemos traçar a função? Exemplo: Mas podemos usar um método semelhante: método de Euler • A+BC • d[C]/dt = K [A] [B] • d[A]/dt = -K [A] [B] • d[B]/dt = -K [A] [B] Ludwig Krippahl, 2009 38 Integrar um sistema de equações diferenciais. Inicio, t0 Passo 1 • [A]0 [B]0 [C]0 • Usar valores em t0 para calcular derivada em • t0 Usar derivada para extrapolar t1: • [A]1 = [A]0 + d[A]/dt * passo Ludwig Krippahl, 2009 39 Integrar um sistema de equações diferenciais. Inicio, t0 Passo 1 • [A]0 [B]0 [C]0 • Usar valores em t0 para calcular derivada em • t0 Usar derivada para extrapolar t1: • [A]1 = [A]0 + d[A]/dt * passo Próximo valor Ludwig Krippahl, 2009 40 Integrar um sistema de equações diferenciais. Inicio, t0 Passo 1 • [A]0 [B]0 [C]0 • Usar valores em t0 para calcular derivada em • t0 Usar derivada para extrapolar t1: • [A]1 = [A]0 + d[A]/dt * passo Valor anterior Ludwig Krippahl, 2009 41 Integrar um sistema de equações diferenciais. Inicio, t0 Passo 1 • [A]0 [B]0 [C]0 • Usar valores em t0 para calcular derivada em • t0 Usar derivada para extrapolar t1: • [A]1 = [A]0 + d[A]/dt * passo Derivada vezes passo. Ludwig Krippahl, 2009 42 Integrar um sistema de equações diferenciais. function tcs=reacabc(cis,dt,tmax,k) tcs=[0,cis]; %valores em t0 for t=dt:dt:tmax abk=cis(1)*cis(2)*k*dt; calcular a derivada %AeB cis(1)=cis(1)-abk; cis(2)=cis(2)-abk; %C cis(3)=cis(3)+abk; actualizar concentrações % guarda o novo ponto tcs=[tcs;t,cis]; endfor endfunction Ludwig Krippahl, 2009 43 Integrar um sistema de equações diferenciais. function tcs=reacabc(cis,dt,tmax,k) tcs=[0,cis]; %valores em t0 for t=dt:dt:tmax abk=cis(1)*cis(2)*k*dt; calcular a derivada %AeB cis(1)=cis(1)-abk; cis(2)=cis(2)-abk; %C cis(3)=cis(3)+abk; actualizar concentrações % guarda o novo ponto tcs=[tcs;t,cis]; endfor endfunction Ludwig Krippahl, 2009 44 Integrar um sistema de equações diferenciais. cis=[1,1.5,0] k=1; pontos=reacabc(cis,0.1,10,k); hold off axis plot(pontos(:,1),pontos(:,2:columns(pontos))) Plot: primeira coluna é o tempo, as restantes colunas são as concentrações Ludwig Krippahl, 2009 45 Integrar um sistema de equações diferenciais. Ludwig Krippahl, 2009 46 Generalizando: cinética com método de Euler Exemplo • A+BC • Reacção reversível: kd e ki • Velocidade = [C]ki - [A][B]kd Ludwig Krippahl, 2009 47 Generalizando: cinética com método de Euler Recebe Caso geral • Estequiometria, • Concentrações iniciais • Kd, Ki, dt e tmax. • Veloc. = kd*reagentesesteq - ki*produtosesteq • Alterar as concentrações • d[A]/dt= velocidade*esteq(A) • cs=cs+derivada*dt Ludwig Krippahl, 2009 48 Generalizando: cinética com método de Euler Devolve • Matriz com tempo (1ª coluna) e concentração por iteração (para fazer o gráfico). Estequiometria, • 2 vectores, reagentes e produtos • Exemplo: • A + B 2C • er=[1, 1, 0] • ep=[0, 0, 2] Ludwig Krippahl, 2009 49 Generalizando: cinética com método de Euler Exemplo: A1*B1*kd C2*ki • A + B 2C • er=[1, 1, 0] • ep=[0, 0, 2] Ludwig Krippahl, 2009 v directa v inversa 50 Cinética com método de Euler Função function tconcs=cinetica(er,ep,cis,kd,ki,dt,tmax) Ludwig Krippahl, 2009 51 Cinética com método de Euler Integração: tconcs=[0,cis]; for t=dt:dt:tmax v=prod(cis.^er)*kd-prod(cis.^ep)*ki; deriv=v*ep-v*er; Velocidade da reacção cis=cis+deriv*dt; tconcs=[tconcs;t,cis]; Produto concentrações elevadas à estequiometria endfor Ludwig Krippahl, 2009 52 Cinética com método de Euler Integração: tconcs=[0,cis]; for t=dt:dt:tmax v=prod(cis.^er)*kd-prod(cis.^ep)*ki; deriv=v*ep-v*er; Calcula derivadas e cis=cis+deriv*dt; tconcs=[tconcs;t,cis]; actualiza concentrações endfor Ludwig Krippahl, 2009 53 Cinética com método de Euler Integração: tconcs=[0,cis]; for t=dt:dt:tmax v=prod(cis.^er)*kd-prod(cis.^ep)*ki; deriv=v*ep-v*er; Guarda valores na cis=cis+deriv*dt; tconcs=[tconcs;t,cis]; matriz endfor Ludwig Krippahl, 2009 54 Cinética com método de Euler Reacção do tipo • A+BC kd=1; constante directa ki=0.5; constante inversa cis=[1,2,0]; concentrações t0 er=[1,1,0] esteq. reagentes ep=[0,0,1] esteq. produtos pontos=cinetica(er,ep,cis,kd,ki,0.1,5); Ludwig Krippahl, 2009 55 Cinética com método de Euler Reacção do tipo • A+BC hold off axis eixo automático plot(pontos(:,1),pontos(:,2:columns(pontos))) Ludwig Krippahl, 2009 56 Cinética com método de Euler Ludwig Krippahl, 2009 57 Sistema de reacções. Mesma abordagem, mas a estequiometria é uma matriz (uma linha por reacção) e cada constante cinética um vector (um valor por reacção) Ludwig Krippahl, 2009 58 Sistema de reacções. Alterações: • Na iteração é preciso calcular primeiro todas • as derivadas tendo em conta todas as reacções (um ciclo pelas linhas das matrizes). Só depois de ter todas as derivadas é que se actualiza todas as concentrações. Ludwig Krippahl, 2009 59 Sistema de reacções. Função function tconcs=cineticas(ers,eps,cis,kds,kis,dt,tmax) (para fazer na aula) Ludwig Krippahl, 2009 60 Sistema de reacções. Exemplo: • Oscilador químico (Lotka) • Não se conhece nenhuma assim, mas esta é simples de modelar. A + X 2X X + Y 2Y YQ Ludwig Krippahl, 2009 61 Sistema de reacções. ers=[1 1 0 0;0 1 1 0;0 0 1 0]; A + X 2X eps=[0 2 0 0;0 0 2 0;0 0 0 1]; X + Y 2Y YQ kds=[0.05,1,1]; kis=[0,0,0]; cis=[50,1,1,0]; t=cineticas(ers,eps,cis,kds,kis,0.01,50); plot(t(:,1),t(:,2:columns(t))); Ludwig Krippahl, 2009 62 Sistema de reacções. Ludwig Krippahl, 2009 63 Sistema de reacções. Ludwig Krippahl, 2009 64 Resumo Integração numérica • • • Se podemos calcular o y • • Calcular pontos, y, multiplicar pelo dx Melhor ainda, trapézio Equações diferenciais • Método de Euler, calcular derivada em t, usar valores em t e extrapolar para t+dt. Cinética • Ludwig Krippahl, 2009 Estequiometria e constantes. 65 Dúvidas Ludwig Krippahl, 2009 66