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

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

Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 7.

Apresentações semelhantes


Apresentação em tema: "Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 7."— Transcrição da apresentação:

1 Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 7

2 Ludwig Krippahl, 2007 2 Aviso: P1 e P5 Aula prática extra na sexta, dia 4-5, das 8:00 às 11:00.

3 Ludwig Krippahl, 2007 3 Na aula de hoje... Integração de funções de uma variável. Integração de equações diferenciais. Interpolação linear Ajuste de modelos a dados experimentais

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

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

6 Ludwig Krippahl, 2007 6 Integração numérica Quanto menor dx mais preciso dx*y

7 Ludwig Krippahl, 2007 7 Integração numérica function int=intexpxcubo(dx,x0,x1); int=0; for x=x0:dx:x1 int=int+dx*exp(-x^3); endfor endfunction

8 Ludwig Krippahl, 2007 8 Integração numérica octave:113> intexpxcubo(0.2,0,2) ans = 0.99296 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

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

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

11 Ludwig Krippahl, 2007 11 Integração numérica Implementação: Método ingénuo: calcular os dois y em cada iteração. Método mais inteligente: calcular o y2 e guardá-lo no y1 para a próxima y1 y2

12 Ludwig Krippahl, 2007 12 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

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

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

15 Ludwig Krippahl, 2007 15 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

16 Ludwig Krippahl, 2007 16 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

17 Ludwig Krippahl, 2007 17 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!

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

19 Ludwig Krippahl, 2007 19 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

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

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

22 Ludwig Krippahl, 2007 22 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

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

24 Ludwig Krippahl, 2007 24 Integrar um sistema de equações diferenciais. function tcs=reacabc(cis,dt,tmax,k) tcs=[0,cis]; %valores em t0 for t=0: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

25 Ludwig Krippahl, 2007 25 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

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

27 Ludwig Krippahl, 2007 27 Generalizando: cinética com método de Euler Separar a função que avalia a derivada. Estequiometria Exemplo A + B C Reacção reversível: kd e ki Derivada = [C]ki - [A][B]kd

28 Ludwig Krippahl, 2007 28 Generalizando: cinética com método de Euler Separar a função que avalia a derivada. Estequiometria Caso geral Derivada = kd*reagentes esteq - ki*produtos esteq Alterar as concentrações cs=cs+derivada*esteq Nota: reagentes têm estequiometria negativa

29 Ludwig Krippahl, 2007 29 Cinética com método de Euler function tconcs=cinetica(esteq,cis,kd,ki,dt,tmax) rs=find(esteq<0); ps=find(esteq>0); tconcs=[0,cis]; for t=0:dt:tmax dps=prod(cis(ps).^esteq(ps))*ki; drs=prod(cis(rs).^-esteq(rs))*kd; deriv=(drs-dps)*dt; cis=cis+deriv*esteq; tconcs=[tconcs;t,cis]; endfor endfunction

30 Ludwig Krippahl, 2007 30 Cinética com método de Euler function tconcs=cinetica(esteq,cis,kd,ki,dt,tmax) rs=find(esteq<0); ps=find(esteq>0); tconcs=[0,cis]; for t=0:dt:tmax dps=prod(cis(ps).^esteq(ps))*ki; drs=prod(cis(rs).^-esteq(rs))*kd; deriv=(drs-dps)*dt; cis=cis+deriv*esteq; tconcs=[tconcs;t,cis]; endfor endfunction Encontrar os índices dos reagentes e produtos na estequiometria

31 Ludwig Krippahl, 2007 31 Cinética com método de Euler esteq>0Devolve vector 0s e 1s octave:110> vector=[1,2,-3,0,-4] vector = 1 2 -3 0 -4 octave:111> vector>0 ans = 1 1 0 0 0

32 Ludwig Krippahl, 2007 32 Cinética com método de Euler find(esteq>0)Índices dos não 0 octave:113> find([0,1,0,-2,0,0.5]) ans = 2 4 6

33 Ludwig Krippahl, 2007 33 Cinética com método de Euler function tconcs=cinetica(esteq,cis,kd,ki,dt,tmax) rs=find(esteq<0); ps=find(esteq>0); tconcs=[0,cis]; for t=0:dt:tmax dps=prod(cis(ps).^esteq(ps))*ki; drs=prod(cis(rs).^-esteq(rs))*kd; deriv=(drs-dps)*dt; cis=cis+deriv*esteq; tconcs=[tconcs;t,cis]; endfor endfunction Encontrar os índices dos reagentes e produtos na estequiometria

34 Ludwig Krippahl, 2007 34 Cinética com método de Euler function tconcs=cinetica(esteq,cis,kd,ki,dt,tmax) rs=find(esteq<0); ps=find(esteq>0); tconcs=[0,cis]; for t=0:dt:tmax dps=prod(cis(ps).^esteq(ps))*ki; drs=prod(cis(rs).^-esteq(rs))*kd; deriv=(drs-dps)*dt; cis=cis+deriv*esteq; tconcs=[tconcs;t,cis]; endfor endfunction Guardar valores para t 0

35 Ludwig Krippahl, 2007 35 Cinética com método de Euler function tconcs=cinetica(esteq,cis,kd,ki,dt,tmax) rs=find(esteq<0); ps=find(esteq>0); tconcs=[0,cis]; for t=0:dt:tmax dps=prod(cis(ps).^esteq(ps))*ki; drs=prod(cis(rs).^-esteq(rs))*kd; deriv=(drs-dps)*dt; cis=cis+deriv*esteq; tconcs=[tconcs;t,cis]; endfor endfunction Contribuição dos produtos e reagentes para a derivada (reacção inversa e directa)

36 Ludwig Krippahl, 2007 36 Cinética com método de Euler function tconcs=cinetica(esteq,cis,kd,ki,dt,tmax) rs=find(esteq<0); ps=find(esteq>0); tconcs=[0,cis]; for t=0:dt:tmax dps=prod(cis(ps).^esteq(ps))*ki; drs=prod(cis(rs).^-esteq(rs))*kd; deriv=(drs-dps)*dt; cis=cis+deriv*esteq; tconcs=[tconcs;t,cis]; endfor endfunction Calcular derivada e actualizar concentrações

37 Ludwig Krippahl, 2007 37 Cinética com método de Euler function tconcs=cinetica(esteq,cis,kd,ki,dt,tmax) rs=find(esteq<0); ps=find(esteq>0); tconcs=[0,cis]; for t=0:dt:tmax dps=prod(cis(ps).^esteq(ps))*ki; drs=prod(cis(rs).^-esteq(rs))*kd; deriv=(drs-dps)*dt; cis=cis+deriv*esteq; tconcs=[tconcs;t,cis]; endfor endfunction Acrescentar à matriz o tempo t e as concentrações numa nova linha.

38 Ludwig Krippahl, 2007 38 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 esteq=[-1,-1,1]reacção pontos=cinetica(esteq,cis,kd,ki,0.1,5);

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

40 Ludwig Krippahl, 2007 40 Cinética com método de Euler

41 Ludwig Krippahl, 2007 41 Sistema de reacções. Mesma abordagem, mas estequiometria é matriz (uma linha por reacção) e cada constante cinética um vector (um valor por reacção)

42 Ludwig Krippahl, 2007 42 Sistema de reacções. Alterações: Dentro do ciclo for com os passos é preciso dois ciclos, cada um percorrendo todas as reacções. O primeiro calcula os índices dos reagentes e produtos e o valor da derivada para cada reacção. O segundo ciclo actualiza as concentrações para todas as reacções considerando todas as derivadas calculadas. É preciso dois ciclos internos para processar todas as reacções em simultâneo.

43 Ludwig Krippahl, 2007 43 Ajuste de um modelo Dados Experimentais Simulação Discrepância Minimizar

44 Ludwig Krippahl, 2007 44 Ajuste de um modelo Dados Experimentais Simulação Discrepância Minimizar minfn cinetica

45 Ludwig Krippahl, 2007 45 Ajuste de um modelo Dados: matriz com tempo na primeira coluna e concentração (ou concentrações) na segunda. Função erro compara cada vector com o correspondente na simulação. Mas os valores de t podem ser diferentes. É preciso interpolar. Primeiro, função interpol

46 Ludwig Krippahl, 2007 46 Interpolação linear Função interpol Recebe: uma matriz x, y, em colunas, e um vector x1 com os pontos a interpolar. Devolve: vector y1 com os valores em x1 interpolados de x, y.

47 Ludwig Krippahl, 2007 47 Interpolação linear xi x1 x2 y1 y2

48 Ludwig Krippahl, 2007 48 Interpolação linear yi = (y1*(x2-xi) + y2*(xi-x1)) / (x2 – x1) xi x1 x2 y1 y2 yi

49 Ludwig Krippahl, 2007 49 Interpolação linear function yi=interpol(matxy,xi) yi=0*xi; for f=1:length(xi) for g=2:rows(matxy) if matxy(g,1)>=xi(f); x1 = matxy(g-1,1); x2 = matxy(g,1); y1 = matxy(g-1,2); y2 = matxy(g,2); d = x2-x1; yi(f) = (y1*(x2-xi(f))+y2*(xi(f)-x1))/d; break endif endfor

50 Ludwig Krippahl, 2007 50 Interpolação linear function yi=interpol(matxy,xi) yi=0*xi; for f=1:length(xi) for g=2:rows(matxy) if matxy(g,1)>=xi(f); x1 = matxy(g-1,1); x2 = matxy(g,1); y1 = matxy(g-1,2); y2 = matxy(g,2); d = x2-x1; yi(f) = (y1*(x2-xi(f))+y2*(xi(f)-x1))/d; break endif endfor Cria vector yi, dos valores interpolados

51 Ludwig Krippahl, 2007 51 Interpolação linear function yi=interpol(matxy,xi) yi=0*xi; for f=1:length(xi) for g=2:rows(matxy) if matxy(g,1)>=xi(f); x1 = matxy(g-1,1); x2 = matxy(g,1); y1 = matxy(g-1,2); y2 = matxy(g,2); d = x2-x1; yi(f) = (y1*(x2-xi(f))+y2*(xi(f)-x1))/d; break endif endfor Para cada xi onde interpolar percorre os x da matriz até encontrar o primeiro que ultrapassa xi. Começa do 2º elemento porque precisa do anterior para interpolar.

52 Ludwig Krippahl, 2007 52 Interpolação linear function yi=interpol(matxy,xi) yi=0*xi; for f=1:length(xi) for g=2:rows(matxy) if matxy(g,1)>=xi(f); x1 = matxy(g-1,1); x2 = matxy(g,1); y1 = matxy(g-1,2); y2 = matxy(g,2); d = x2-x1; yi(f) = (y1*(x2-xi(f))+y2*(xi(f)-x1))/d; break endif endfor Calcula a interpolação e termina o ciclo interno (g).

53 Ludwig Krippahl, 2007 53 Interpolação linear xy=[[1:10]',[2:2:20]']; xi=[2.5:2:8]; yi=interpol(xy,xi) hold off plot(xy(:,1), xy(:,2)) hold on plot(xi,yi,"ob;;");

54 Ludwig Krippahl, 2007 54 Interpolação linear

55 Ludwig Krippahl, 2007 55 Medir a discrepância (erro) Reacção 2A B Só kd Função erro mede o erro quadrático médio, que é a média dos quadrados das diferenças entre os vectores

56 Ludwig Krippahl, 2007 56 Medir a discrepância (erro) Função erro mede o erro quadrático: soma dos quadrados das diferenças.

57 Ludwig Krippahl, 2007 57 Medir a discrepância (erro) Exemplo: 2A B Só kd (irreversível) Função erro2AB mede o erro quadrático entre os dados experimentais e o cálculo para esta reacção. A função inclui a concentração inicial e reacção

58 Ludwig Krippahl, 2007 58 Medir a discrepância (2A B) function r=erro2AB(vals,k) esteq=[-2,1];define a reacção cis=[1,0];e as concentrações aqui falta calcular os valores previstos pelo modelo para este k e comparar com o vector vals para calcular o erro, interpolando os valores endfunction

59 Ludwig Krippahl, 2007 59 Ajustar o modelo (2A B) Basta usar a minfn para calcular o k que minimiza o erro Exemplo: vals=[0.5,0.5;2,0.2;6,0.07;9,0.055]; k=minfn("erro2AB",vals,0,1,2,0.001) k = 0.97843

60 Ludwig Krippahl, 2007 60 Ajustar o modelo (2A B) Comparar o modelo com os dados esteq=[-2,1]; cis=[1,0]; xy=cinetica(esteq,cis,k,0,0.01,10); hold off plot(xy(:,1),xy(:,2)) hold on plot(vals(:,1),vals(:,2),"ob;;");

61 Ludwig Krippahl, 2007 61 Ajustar o modelo (2A B)

62 Ludwig Krippahl, 2007 62 Ajustar um modelo Abordagem genérica Simular dados previstos para um conjunto de parâmetros Minimizar a discrepância entre os valores previstos e observados alterando os parâmetros. Na prática pode ser difícil...

63 Ludwig Krippahl, 2007 63 Dúvidas


Carregar ppt "Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 7."

Apresentações semelhantes


Anúncios Google