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, Aviso: P1 e P5 Aula prática extra na sexta, dia 4-5, das 8:00 às 11:00.

3 Ludwig Krippahl, 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, Integração numérica. y = exp(-x 3 )

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

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

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

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

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

11 Ludwig Krippahl, 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, 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, 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 =

14 Ludwig Krippahl, 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, 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, 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, Integração numérica Implementação mais genérica: octave:185> trapezio("expxcubo",0.2,0,2) ans = Nota: expxcubo em vez de expxcubo!

18 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.

19 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

20 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

21 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

22 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

23 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.

24 Ludwig Krippahl, 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, 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, Integrar um sistema de equações diferenciais.

27 Ludwig Krippahl, 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, 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, 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, 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, Cinética com método de Euler esteq>0Devolve vector 0s e 1s octave:110> vector=[1,2,-3,0,-4] vector = octave:111> vector>0 ans =

32 Ludwig Krippahl, 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, 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, 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, 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, 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, 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, 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, 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, Cinética com método de Euler

41 Ludwig Krippahl, 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, 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, Ajuste de um modelo Dados Experimentais Simulação Discrepância Minimizar

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

45 Ludwig Krippahl, 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, 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, Interpolação linear xi x1 x2 y1 y2

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

49 Ludwig Krippahl, 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, 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, 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, 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, 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, Interpolação linear

55 Ludwig Krippahl, 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, Medir a discrepância (erro) Função erro mede o erro quadrático: soma dos quadrados das diferenças.

57 Ludwig Krippahl, 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, 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, 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 =

60 Ludwig Krippahl, 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, Ajustar o modelo (2A B)

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