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

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

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

Apresentações semelhantes


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

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

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

3 Ludwig Krippahl, 2008 3 Trabalho 1 Problema: Ler sequências (lefasta) Devolve matrizes com nomes e sequências. Ler a tabela com pks. Encontrar grupos na sequência Calcular o zero

4 Ludwig Krippahl, 2008 4 Trabalho 1 function t=letabela(fich) id=fopen(fich,"r"); ix=1; fgetl(id); while !feof(id) m=split(fgetl(id),"\t"); t(ix).cod=m(1,1); t(ix).coh=str2num(m(2,:)); t(ix).nh=str2num(m(3,:)); t(ix).cl=str2num(m(4,:)); t(ix).cd=str2num(m(5,:)); ix=ix+1; endwhile fclose(id);

5 Ludwig Krippahl, 2008 5 Trabalho 1 Problema: Ler sequências (lefasta) Devolve matrizes com nomes e sequências. Ler a tabela com pks (letabela). Devolve vector de estruturas Encontrar grupos na sequência Calcular o zero

6 Ludwig Krippahl, 2008 6 Trabalho 1 Problema: Ler sequências (lefasta) Devolve matrizes com nomes e sequências. Ler a tabela com pks (letabela). Devolve vector de estruturas Encontrar grupos na sequência Converter logo tudo... Calcular o zero

7 Ludwig Krippahl, 2008 7 Trabalho 1 seq2pks Recebe sequência e tabela com os pks Devolve matriz de 3 colunas e uma linha para cada grupo 1ª coluna: o número de vezes que o grupo ocorre 2ª coluna: o pka do grupo 3ª coluna: a carga desprotonada do grupo Desta forma só é preciso consultar a tabela uma vez para cada sequência.

8 Ludwig Krippahl, 2008 8 Trabalho 1 function pks=seq2pks(seq,tabela) ultimo=length(seq); pks=[]; for f=1:length(tabela) if strcmp(tabela(f).cod,seq(1)) pks=[pks;1,tabela(f).nh,0]; endif if strcmp(tabela(f).cod,seq(ultimo)) pks=[pks;1,tabela(f).coh,-1]; endif...(cadeias laterais) endfor endfunction Percorre a tabela

9 Ludwig Krippahl, 2008 9 Trabalho 1 function pks=seq2pks(seq,tabela) ultimo=length(seq); pks=[]; for f=1:length(tabela) if strcmp(tabela(f).cod,seq(1)) pks=[pks;1,tabela(f).nh,0]; endif if strcmp(tabela(f).cod,seq(ultimo)) pks=[pks;1,tabela(f).coh,-1]; endif...(cadeias laterais) endfor endfunction Se o aminoácido nesta posição da tabela é o primeiro da sequência, acrescenta NH3

10 Ludwig Krippahl, 2008 10 Trabalho 1 function pks=seq2pks(seq,tabela) ultimo=length(seq); pks=[]; for f=1:length(tabela) if strcmp(tabela(f).cod,seq(1)) pks=[pks;1,tabela(f).nh,0]; endif if strcmp(tabela(f).cod,seq(ultimo)) pks=[pks;1,tabela(f).coh,-1]; endif...(cadeias laterais) endfor endfunction Se o aminoácido nesta posição da tabela é o último da sequência, acrescenta COOH

11 Ludwig Krippahl, 2008 11 Trabalho 1 function pks=seq2pks(seq,tabela) ultimo=length(seq); pks=[]; for f=1:length(tabela) if strcmp(tabela(f).cod,seq(1)) pks=[pks;1,tabela(f).nh,0]; endif if strcmp(tabela(f).cod,seq(ultimo)) pks=[pks;1,tabela(f).coh,-1]; endif...(cadeias laterais) endfor endfunction Processa as cadeias laterais

12 Ludwig Krippahl, 2008 12 Trabalho 1 if !isempty(tabela(f).cl) v=findstr(seq,tabela(f).cod); if !isempty(v) pks=[pks;length(v), tabela(f).cl,tabela(f).cd]; endif Se tem cadeia lateral

13 Ludwig Krippahl, 2008 13 Trabalho 1 if !isempty(tabela(f).cl) v=findstr(seq,tabela(f).cod); if !isempty(v) pks=[pks;length(v), tabela(f).cl,tabela(f).cd]; endif Conta os aminoácidos destes na sequência

14 Ludwig Krippahl, 2008 14 Trabalho 1 if !isempty(tabela(f).cl) v=findstr(seq,tabela(f).cod); if !isempty(v) pks=[pks;length(v), tabela(f).cl,tabela(f).cd]; endif Se há acrescenta esse número de grupos à matriz dos pks

15 Ludwig Krippahl, 2008 15 Trabalho 1 Problema: Ler sequências (lefasta) Devolve matrizes com nomes e sequências. Ler a tabela com pks (letabela). Devolve vector de estruturas Encontrar grupos na sequência Converter logo tudo... Calcular o zero Usa a função zeropol modificada

16 Ludwig Krippahl, 2008 16 Trabalho 1 function pH=pisoelec(pks,prec) x1=1; x2=13; y1=carga(pks,x1); y2=carga(pks,x2); while abs(x1-x2)>prec (bipartição...) endwhile pH=xm; endfunction Recebe a matriz com os dados dos grupos e a precisão.

17 Ludwig Krippahl, 2008 17 Trabalho 1 function pH=pisoelec(pks,prec) x1=1; x2=13; y1=carga(pks,x1); y2=carga(pks,x2); while abs(x1-x2)>prec (bipartição...) endwhile pH=xm; endfunction Intervalo inicial (x1 e x2 podiam vir como argumentos)

18 Ludwig Krippahl, 2008 18 Trabalho 1 function pH=pisoelec(pks,prec) x1=1; x2=13; y1=carga(pks,x1); y2=carga(pks,x2); while abs(x1-x2)>prec (bipartição...) endwhile pH=xm; endfunction A carga total é calculada em função do pH e da matriz com os pks e cargas.

19 Ludwig Krippahl, 2008 19 Trabalho 1 function pH=pisoelec(pks,prec) x1=1; x2=13; y1=carga(pks,x1); y2=carga(pks,x2); while abs(x1-x2)>prec (bipartição...) endwhile pH=xm; endfunction O mesmo do zeropol...

20 Ludwig Krippahl, 2008 20 Trabalho 1 Calcular a carga de um grupo: function c=hendhas(pH,pKa,ch) lf=pH-pKa; %log 10 da proporção [A-]/[AH] f=10.^lf; % proporção [A-]/[AH]; A=f./(1+f); % fracção [A-] c=ch.*A+(ch+1).*(1-A); endfunction

21 Ludwig Krippahl, 2008 21 Trabalho 1 Calcular a carga da sequência: function c=carga(pks,pH) c=0; for f=1:rows(pks) c=c+pks(f,1)*hendhas(pH,pks(f,2),pks(f,3)); endfor endfunction

22 Ludwig Krippahl, 2008 22 Trabalho 1 Calcular a carga da sequência: Mas como hendhas está preparada para vectores, podia ser: function c=carga(pks,pH) c=sum(pks(:,1).*hendhas(pH,pks(:,2),pks(:,3))); endfunction

23 Ludwig Krippahl, 2008 23 Trabalho 1 function vpis=calculapis(fich) [ns,seqs]=lefasta(fich); tabela=letabela("pKas.txt"); vpis=[]; for f=1:rows(seqs) pks=seq2pks(deblank(seqs(f,:)),tabela); vpis=[vpis;pisoelec(pks,0.1)]; endfor endfunction

24 Ludwig Krippahl, 2008 24 Trabalho 1 calculapis lefasta letabela seq2pks pisoelec carga hendhas

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

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

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

28 Ludwig Krippahl, 2008 28 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

29 Ludwig Krippahl, 2008 29 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

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

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

32 Ludwig Krippahl, 2008 32 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

33 Ludwig Krippahl, 2008 33 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

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

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

36 Ludwig Krippahl, 2008 36 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

37 Ludwig Krippahl, 2008 37 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

38 Ludwig Krippahl, 2008 38 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!

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

40 Ludwig Krippahl, 2008 40 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

41 Ludwig Krippahl, 2008 41 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

42 Ludwig Krippahl, 2008 42 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

43 Ludwig Krippahl, 2008 43 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

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

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

46 Ludwig Krippahl, 2008 46 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

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

48 Ludwig Krippahl, 2008 48 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

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

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

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

52 Ludwig Krippahl, 2008 52 Cinética com método de Euler Integração: for t=0: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

53 Ludwig Krippahl, 2008 53 Cinética com método de Euler Integração: for t=0: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, 2008 54 Cinética com método de Euler Integração: for t=0: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, 2008 55 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, 2008 56 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, 2008 57 Cinética com método de Euler

58 Ludwig Krippahl, 2008 58 Sistema de reacções. Mesma abordagem, mas a estequiometria são matrizes (uma linha por reacção) e cada constante cinética um vector (um valor por reacção)

59 Ludwig Krippahl, 2008 59 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, 2008 60 Sistema de reacções. Função function tconcs=cineticas(ers,eps,cis,kds,kis,dt,tmax) (para fazer na aula)

61 Ludwig Krippahl, 2008 61 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, 2008 62 Sistema de reacções. ers=[1 1 0 0;0 1 1 0;0 0 1 0]; eps=[0 2 0 0;0 0 2 0;0 0 0 1]; 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, 2008 63 Sistema de reacções.

64 Ludwig Krippahl, 2008 64 Sistema de reacções.

65 Ludwig Krippahl, 2008 65 Dúvidas


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

Apresentações semelhantes


Anúncios Google