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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, Trabalho 1 calculapis lefasta letabela seq2pks pisoelec carga hendhas

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

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

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

28 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

29 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 =

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

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

32 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

33 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

34 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 =

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

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

40 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

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

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 Próximo valor

43 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

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

45 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

46 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

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

48 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

49 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

50 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]

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: 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, 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, 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, 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 são matrizes (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, 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