A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 10.

Apresentações semelhantes


Apresentação em tema: "Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 10."— Transcrição da apresentação:

1 Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 10

2 Ludwig Krippahl, Ficha 7 Não é para entregar Mas é para fazer... Aula de compensação? Turnos P3-6

3 Ludwig Krippahl, 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.

4 Ludwig Krippahl, 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

5 Ludwig Krippahl, Objectivo Acertar reacções químicas ?H 2 + ?O 2 ?H 2 O

6 Ludwig Krippahl, Objectivo Acertar reacções químicas ?H 2 + ?O 2 ?H 2 O Reacções simples (não redox, etc) Nenhum termo com parêntesis Ca(NO 3 ) 2 fica CaN 2 O 6.

7 Ludwig Krippahl, Objectivo Acertar reacções químicas ?H 2 + ?O 2 ?H 2 O 2H 2 + O 2 2H 2 O

8 Ludwig Krippahl, Partir o problema Ler o ficheiro Estruturar cada reacção Procurar coeficientes Testar se acertou Gravar resultados

9 Ludwig Krippahl, Tirar os espaços function t=semespacos(s) t=""; for f=1:length(s) if s(f)>" " t=[t,s(f)]; endif endfor endfunction

10 Ludwig Krippahl, Tirar os espaços Menos intuitivo, mas mais sucinto: function t=semespacos(s) t=s(s> " " ); endfunction

11 Ludwig Krippahl, Testar coeficientes ?H 2 + ?O 2 ?H 2 O Vector de coeficientes: [1 1 1] Codificar em vectores tb H: [2 0 -2] O: [0 2 -1] (produtos a negativo) Testar se sum(co.*el)==0

12 Ludwig Krippahl, Testar coeficientes Estrutura com.esteq.el A estequiometria para o teste O elemento para podermos organizar a estequiometria

13 Ludwig Krippahl, 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

14 Ludwig Krippahl, 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:...

15 Ludwig Krippahl, Procurar coeficientes testatodos.m

16 Ludwig Krippahl, Criar os coficientes Lista de termos.termo.produto Cada termo, decompor Cada elemento, acrescentar a lista de elementos.el.esteq

17 Ludwig Krippahl, Criar os coficientes acrescentar.m Acrescentar cada elemento à lista crialista.m Percorre lista de termos Decompõe e acrescenta

18 Ludwig Krippahl, Processar cada reacção Partir em termos Tirar os coeficientes Gerar o vector com.termo.produto

19 Ludwig Krippahl, Processar cada reacção tiranumero.m Devolve o número (ou 1) e o resto do termo separatermos.m Recebe a reacção e devolve o vector com.termo.produto Devolve também a estequiometria inicial

20 Ludwig Krippahl, 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

21 Ludwig Krippahl, 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

22 Ludwig Krippahl, Trabalhos práticos Começar com tempo Aproveitar as aulas práticas e teóricas

23 Ludwig Krippahl, Integração numérica. y = exp(-x 3 )

24 Ludwig Krippahl, Integração numérica Aproximar a função considerando cada rectângulo dx*y

25 Ludwig Krippahl, Integração numérica Quanto menor dx mais aproximado dx*y

26 Ludwig Krippahl, 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

27 Ludwig Krippahl, Integração numérica octave:114> intexpxcubo(0.2,0,2) ans = octave:115> intexpxcubo(0.02,0,2) ans = octave:116> intexpxcubo(0.002,0,2) ans = octave:117> intexpxcubo(0.0002,0,2) ans =

28 Ludwig Krippahl, Integração numérica Aproximar melhor pela regra do trapézio

29 Ludwig Krippahl, Integração numérica Àrea: base*(a+b)/2 a b base

30 Ludwig Krippahl, 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 y2

31 Ludwig Krippahl, 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

32 Ludwig Krippahl, Integração numérica octave:180> intexcubot(0.2,0,2) ans = octave:181> intexpxcubo(0.2,0,2) ans = octave:182> intexcubot(0.002,0,2) ans = octave:183> intexpxcubo(0.002,0,2) ans =

33 Ludwig Krippahl, Integração numérica Implementação mais genérica: Separar a função que calcula o y da função que integra.

34 Ludwig Krippahl, 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

35 Ludwig Krippahl, 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

36 Ludwig Krippahl, Integração numérica Implementação mais genérica: octave:185> trapezio("expxcubo",0.2,0,2) ans = Nota: expxcubo em vez de expxcubo!

37 Ludwig Krippahl, E se não podemos traçar a função? Exemplo: A + B C d[C]/dt = K [A] [B] d[A]/dt = -K [A] [B] d[B]/dt = -K [A] [B] Não podemos calcular a área geometricamente pelo gráfico da função.

38 Ludwig Krippahl, E se não podemos traçar a função? Exemplo: A + B C d[C]/dt = K [A] [B] d[A]/dt = -K [A] [B] d[B]/dt = -K [A] [B] Mas podemos usar um método semelhante: método de Euler

39 Ludwig Krippahl, Integrar um sistema de equações diferenciais. Inicio, t 0 [A] 0 [B] 0 [C] 0 Passo 1 Usar valores em t 0 para calcular derivada em t 0 Usar derivada para extrapolar t 1 : [A] 1 = [A] 0 + d[A]/dt * passo

40 Ludwig Krippahl, Integrar um sistema de equações diferenciais. Inicio, t 0 [A] 0 [B] 0 [C] 0 Passo 1 Usar valores em t 0 para calcular derivada em t 0 Usar derivada para extrapolar t 1 : [A] 1 = [A] 0 + d[A]/dt * passo Próximo valor

41 Ludwig Krippahl, Integrar um sistema de equações diferenciais. Inicio, t 0 [A] 0 [B] 0 [C] 0 Passo 1 Usar valores em t 0 para calcular derivada em t 0 Usar derivada para extrapolar t 1 : [A] 1 = [A] 0 + d[A]/dt * passo Valor anterior

42 Ludwig Krippahl, Integrar um sistema de equações diferenciais. Inicio, t 0 [A] 0 [B] 0 [C] 0 Passo 1 Usar valores em t 0 para calcular derivada em t 0 Usar derivada para extrapolar t 1 : [A] 1 = [A] 0 + d[A]/dt * passo Derivada vezes passo.

43 Ludwig Krippahl, 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 % A e B 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

44 Ludwig Krippahl, 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 % A e B 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

45 Ludwig Krippahl, 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

46 Ludwig Krippahl, Integrar um sistema de equações diferenciais.

47 Ludwig Krippahl, Generalizando: cinética com método de Euler Exemplo A + B C Reacção reversível: kd e ki Velocidade = [C]ki - [A][B]kd

48 Ludwig Krippahl, Generalizando: cinética com método de Euler Recebe Estequiometria, Concentrações iniciais Kd, Ki, dt e tmax. Caso geral Veloc. = kd*reagentes esteq - ki*produtos esteq Alterar as concentrações d[A]/dt= velocidade*esteq(A) cs=cs+derivada*dt

49 Ludwig Krippahl, 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]

50 Ludwig Krippahl, Generalizando: cinética com método de Euler Exemplo: A + B 2C er=[1, 1, 0] ep=[0, 0, 2] A 1 *B 1 *kdv directa C 2 *kiv inversa

51 Ludwig Krippahl, Cinética com método de Euler Função function tconcs=cinetica(er,ep,cis,kd,ki,dt,tmax)

52 Ludwig Krippahl, 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; cis=cis+deriv*dt; tconcs=[tconcs;t,cis]; endfor Velocidade da reacção Produto concentrações elevadas à estequiometria

53 Ludwig Krippahl, 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; cis=cis+deriv*dt; tconcs=[tconcs;t,cis]; endfor Calcula derivadas e actualiza concentrações

54 Ludwig Krippahl, 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; cis=cis+deriv*dt; tconcs=[tconcs;t,cis]; endfor Guarda valores na matriz

55 Ludwig Krippahl, Cinética com método de Euler Reacção do tipo A + B C kd=1;constante directa ki=0.5;constante inversa cis=[1,2,0];concentrações t 0 er=[1,1,0]esteq. reagentes ep=[0,0,1]esteq. produtos pontos=cinetica(er,ep,cis,kd,ki,0.1,5);

56 Ludwig Krippahl, Cinética com método de Euler Reacção do tipo A + B C hold off axiseixo automático plot(pontos(:,1),pontos(:,2:columns(pontos)))

57 Ludwig Krippahl, Cinética com método de Euler

58 Ludwig Krippahl, 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)

59 Ludwig Krippahl, 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.

60 Ludwig Krippahl, Sistema de reacções. Função function tconcs=cineticas(ers,eps,cis,kds,kis,dt,tmax) (para fazer na aula)

61 Ludwig Krippahl, 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 Y Q

62 Ludwig Krippahl, Sistema de reacções. ers=[ ; ; ]; eps=[ ; ; ]; 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))); A + X 2X X + Y 2Y Y Q

63 Ludwig Krippahl, Sistema de reacções.

64 Ludwig Krippahl, Sistema de reacções.

65 Ludwig Krippahl, 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 Estequiometria e constantes.

66 Ludwig Krippahl, Dúvidas


Carregar ppt "Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 10."

Apresentações semelhantes


Anúncios Google