Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouManoela Portugal Alterado mais de 10 anos atrás
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.