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

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

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

Apresentações semelhantes


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

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

2 Ludwig Krippahl, 2009 2 Na aula de hoje... Minimização multidimensional Exemplo: estimativa do efeito de um antibiótico no crescimento bacteriano. Trabalho Prático 2

3 Ludwig Krippahl, 2009 3 Crescimento bacteriano Equação de Verhulst: dB/dt = cB – mB 2

4 Ludwig Krippahl, 2009 4 Crescimento bacteriano Equação de Verhulst: dB/dt = cB – mB 2 Variação do número de organismos

5 Ludwig Krippahl, 2009 5 Crescimento bacteriano Equação de Verhulst: dB/dt = cB – mB 2 É o ritmo de crescimento vezes o número de organismos

6 Ludwig Krippahl, 2009 6 Crescimento bacteriano Equação de Verhulst: dB/dt = cB – mB 2 Menos a taxa de mortalidade vezes o quadrado desse número. A mortalidade resulta da competição por recursos.

7 Ludwig Krippahl, 2009 7 Crescimento bacteriano

8 Ludwig Krippahl, 2009 8 Crescimento bacteriano Problema: Dado um conjunto de medições, ajustar os parâmetros da equação

9 Ludwig Krippahl, 2009 9 Crescimento bacteriano Problema: Dado um conjunto de medições, ajustar os parâmetros da equação Mas são dois parâmetros: crescimento e mortalidade. Precisamos de uma minimização a duas dimensões.

10 Ludwig Krippahl, 2009 10 Minimização multidimensional Método: Minimizar uma variável de cada vez até chegar a um ponto fixo, a menos da precisão desejada

11 Ludwig Krippahl, 2009 11 Minimização multidimensional Método : Partir de um ponto inicial, um valor para cada variável. Encontrar o mínimo de uma variável. Alterar o vector das variáveis Encontrar o mínimo da próxima. Repetir para todas, as vezes que for necessário.

12 Ludwig Krippahl, 2009 12 Minimização multidimensional Ponto inicial

13 Ludwig Krippahl, 2009 13 Minimização multidimensional Ponto inicial Mínimo de X

14 Ludwig Krippahl, 2009 14 Minimização multidimensional Ponto inicial Mínimo de X Mínimo de Y

15 Ludwig Krippahl, 2009 15 Minimização multidimensional Ponto inicial Mínimo de X Mínimo de Y Novo mínimo de X

16 Ludwig Krippahl, 2009 16 Minimização multidimensional Vamos modificar a minfn Para partir do ponto dado e não ser preciso especificar os três pontos iniciais (é mais eficiente começar com 3 pontos juntos quando próximo do mínimo) Para procurar o mínimo de uma de várias variáveis.

17 Ludwig Krippahl, 2009 17 Os 3 pontos iniciais X 1 é o ponto dado

18 Ludwig Krippahl, 2009 18 Os 3 pontos iniciais X1X1 X m próximo de X 1

19 Ludwig Krippahl, 2009 19 Os 3 pontos iniciais X1X1 X m próximo de X 1 Desce? Se não, troca

20 Ludwig Krippahl, 2009 20 Os 3 pontos iniciais X1X1 XmXm X 2 a 1.618*(X m -X 1 )

21 Ludwig Krippahl, 2009 21 Os 3 pontos iniciais X1X1 XmXm X2X2 Y 2 >Y m ? Não, continua: X 1 =X m X m =X 2

22 Ludwig Krippahl, 2009 22 Os 3 pontos iniciais X1X1 XmXm Y 2 >Y m ? Não, continua: X 1 =X m X m =X 2

23 Ludwig Krippahl, 2009 23 Os 3 pontos iniciais X1X1 XmXm Y 2 >Y m ? Não, continua: X 1 =X m X m =X 2 X2X2

24 Ludwig Krippahl, 2009 24 Os 3 pontos iniciais X1X1 XmXm Y 2 >Y m ? Sim.Devolve: X 1 X m X 2 Y m (Y m para começar a minimização) X2X2

25 Ludwig Krippahl, 2009 25 Os 3 pontos iniciais function [x1,xm,x2,ym]= mininicial(funcao,params,vars,indice,delta)

26 Ludwig Krippahl, 2009 26 Os 3 pontos iniciais function [x1,xm,x2,ym]= mininicial(funcao,params,vars,indice,delta) Os valores a devolver, os 3 pontos de x e o y do meio que precisamos para começar a minimização.

27 Ludwig Krippahl, 2009 27 Os 3 pontos iniciais function [x1,xm,x2,ym]= mininicial(funcao,params,vars,indice,delta) Nome da função a minimizar e os parâmetros constantes que precisamos para a avaliar. E.g.: os coeficientes do polinómio, os dados experimentais, etc

28 Ludwig Krippahl, 2009 28 Os 3 pontos iniciais function [x1,xm,x2,ym]= mininicial(funcao,params,vars,indice,delta) Um vector com os valores das N variáveis da função (a função tem várias dimensões)

29 Ludwig Krippahl, 2009 29 Os 3 pontos iniciais function [x1,xm,x2,ym]= mininicial(funcao,params,vars,indice,delta) O índice no vector da variável que estamos a minimizar agora (a função tem várias, mas só conseguimos lidar com uma de cada vez)

30 Ludwig Krippahl, 2009 30 Os 3 pontos iniciais function [x1,xm,x2,ym]= mininicial(funcao,params,vars,indice,delta) Tamanho do passo inicial para calcular o primeiro X m a partir do X inicial, que será o valor que vem em vars(indice).

31 Ludwig Krippahl, 2009 31 Os 3 pontos iniciais razaod=1.618; x1=vars(indice); y1=feval(funcao,params,vars); xm=x1+delta; vars(indice)=xm; ym=feval(funcao,params,vars); Razão dourada

32 Ludwig Krippahl, 2009 32 Os 3 pontos iniciais razaod=1.618; x1=vars(indice); y1=feval(funcao,params,vars); xm=x1+delta; vars(indice)=xm; ym=feval(funcao,params,vars); Calcular x1 e y1. Nota: a função cujo nome foi dado em funcao precisa de todo o vars, mas só alteramos o elemento indice

33 Ludwig Krippahl, 2009 33 Os 3 pontos iniciais razaod=1.618; x1=vars(indice); y1=feval(funcao,params,vars); xm=x1+delta; vars(indice)=xm; ym=feval(funcao,params,vars); Mesma coisa para xm e ym

34 Ludwig Krippahl, 2009 34 Os 3 pontos iniciais if ym>y1 t=ym; ym=y1; y1=t; t=xm; xm=x1; x1=t; endif x2=xm+razaod*(xm-x1); vars(indice)=x2; y2=feval(funcao,params,vars); Se for “a subir” troca o x1 com o xm, e o y1 com o ym.

35 Ludwig Krippahl, 2009 35 Os 3 pontos iniciais if ym>y1 t=ym; ym=y1; y1=t; t=xm; xm=x1; x1=t; endif x2=xm+razaod*(xm-x1); vars(indice)=x2; y2=feval(funcao,params,vars); Calcula o x2 a uma distância de xm igual a 1.618.. vezes o intervalo (xm-x1).

36 Ludwig Krippahl, 2009 36 Os 3 pontos iniciais if ym>y1 t=ym; ym=y1; y1=t; t=xm; xm=x1; x1=t; endif x2=xm+razaod*(xm-x1); vars(indice)=x2; y2=feval(funcao,params,vars); Se x1>xm, continua para valores maiores. Se foi trocado, x1-xm é negativo e segue para valores menores.

37 Ludwig Krippahl, 2009 37 Os 3 pontos iniciais while y2<ym x1=xm; xm=x2; ym=y2; x2=xm+razaod*(xm-x1); vars(indice)=x2; y2=feval(funcao,params,vars); endwhile Enquanto continua “a descer”, avança com os pontos,

38 Ludwig Krippahl, 2009 38 Minimização Antes era: function xm=minfn(func,params,x1,xm,x2,prec) Agora é: function xm=minfnvec(func,params,vars,indice,prec)

39 Ludwig Krippahl, 2009 39 Minimização multidimensional function xm=minfnvec(func,params,vars,indice,prec) Valor da variável que está a minimizar no mínimo da função considerando apenas esta variável.

40 Ludwig Krippahl, 2009 40 Minimização multidimensional function xm=minfnvec(func,params,vars,indice,prec) Função (o nome, em string) e parâmetros constantes, como de costume.

41 Ludwig Krippahl, 2009 41 Minimização multidimensional function xm=minfnvec(func,params,vars,indice,prec) Vector com os valores das várias variáveis no ponto inicial, de onde parte à procura do mínimo.

42 Ludwig Krippahl, 2009 42 Minimização multidimensional function xm=minfnvec(func,params,vars,indice,prec) Índice da variável onde procurar o mínimo.

43 Ludwig Krippahl, 2009 43 Minimização multidimensional function xm=minfnvec(func,params,vars,indice,prec) Precisão (tamanho do intervalo abaixo do qual consideramos ter encontrado o mínimo)

44 Ludwig Krippahl, 2009 44 Minimização multidimensional Esta função é igual à minfn, excepto: Usa o mininicial para determinar os 3 pontos e o valor de ym [x1,xm,x2,ym]=mininicial(func,params,vars,indice,prec); Nota: um bom valor para o delta é a precisão: começamos do intervalo mais pequeno.

45 Ludwig Krippahl, 2009 45 Minimização multidimensional Esta função é igual à minfn, excepto: Usa o mininicial para determinar os 3 pontos e o valor de ym Tem de atribuir o valor correcto a vars(indice) antes de chamar a função fornecida em func xn=c1*xm+c2*x1; vars(indice)=xn; yn=feval(func,params,vars);

46 Ludwig Krippahl, 2009 46 Minimização multidimensional Esta função é igual à minfn, excepto: Usa o mininicial para determinar os 3 pontos e o valor de ym Tem que atribuir o valor correcto a vars(indice) antes de chamar a função fornecida em func Mas minfnvec ainda só minimiza numa dimensão (a dimensão indicada em indice).

47 Ludwig Krippahl, 2009 47 Minimização multidimensional Precisamos de: function xs=multimin(funcao,params,xs,prec)

48 Ludwig Krippahl, 2009 48 Minimização multidimensional function xs=multimin(funcao,params,xs,prec) Vector com os valores de todas as variáveis no mínimo da função

49 Ludwig Krippahl, 2009 49 Minimização multidimensional function xs=multimin(funcao,params,xs,prec) Nome da função a minimizar.

50 Ludwig Krippahl, 2009 50 Minimização multidimensional function xs=multimin(funcao,params,xs,prec) Parâmetros constantes...

51 Ludwig Krippahl, 2009 51 Minimização multidimensional function xs=multimin(funcao,params,xs,prec) Ponto inicial (valores de todas as variáveis da função de onde partir à procura do mínimo)

52 Ludwig Krippahl, 2009 52 Minimização multidimensional function xs=multimin(funcao,params,xs,prec) Precisão

53 Ludwig Krippahl, 2009 53 Minimização multidimensional while true xvs=xs; for f=1:length(xs) xs(f)=minfnvec(funcao,params,xs,f,prec); endfor disp("Valores até agora:") disp(xs); fflush(stdout) if sum(abs(xs-xvs))<prec break endif endwhile Ciclo só termina no break.

54 Ludwig Krippahl, 2009 54 Minimização multidimensional while true xvs=xs; for f=1:length(xs) xs(f)=minfnvec(funcao,params,xs,f,prec); endfor disp("Valores até agora:") disp(xs); fflush(stdout) if sum(abs(xs-xvs))<prec break endif endwhile Guarda os valores antigos dos xs

55 Ludwig Krippahl, 2009 55 Minimização multidimensional while true xvs=xs; for f=1:length(xs) xs(f)=minfnvec(funcao,params,xs,f,prec); endfor disp("Valores até agora:") disp(xs); fflush(stdout) if sum(abs(xs-xvs))<prec break endif endwhile Minimiza em cada dimensão, actualizando o valor nos xs

56 Ludwig Krippahl, 2009 56 Minimização multidimensional while true xvs=xs; for f=1:length(xs) xs(f)=minfnvec(funcao,params,xs,f,prec); endfor disp("Valores até agora:") disp(xs); fflush(stdout); if sum(abs(xs-xvs))<prec break endif endwhile Mostra o progresso do cálculo indicando os valores correntes.

57 Ludwig Krippahl, 2009 57 Minimização multidimensional while true xvs=xs; for f=1:length(xs) xs(f)=minfnvec(funcao,params,xs,f,prec); endfor disp("Valores até agora:") disp(xs); fflush(stdout) if sum(abs(xs-xvs))<prec break endif endwhile Se o total da variação absoluta das variáveis é inferior à precisão, acabou.

58 Ludwig Krippahl, 2009 58 Crescimento bacteriano De volta ao problema: dB/dt = cB – mB 2 Integramos pelo método de Euler, com a função: function mat=crescimento(cresc,mort,dt,qini,tfinal)

59 Ludwig Krippahl, 2009 59 Crescimento bacteriano function mat=crescimento(cresc,mort,dt,qini,tfinal) Matriz com os valores de tempo e número de bactérias em duas colunas

60 Ludwig Krippahl, 2009 60 Crescimento bacteriano function mat=crescimento(cresc,mort,dt,qini,tfinal) Taxa de crescimento

61 Ludwig Krippahl, 2009 61 Crescimento bacteriano function mat=crescimento(cresc,mort,dt,qini,tfinal) Taxa de mortalidade

62 Ludwig Krippahl, 2009 62 Crescimento bacteriano function mat=crescimento(cresc,mort,dt,qini,tfinal) Passo de integração

63 Ludwig Krippahl, 2009 63 Crescimento bacteriano function mat=crescimento(cresc,mort,dt,qini,tfinal) Quantidade inicial de organismos.

64 Ludwig Krippahl, 2009 64 Crescimento bacteriano function mat=crescimento(cresc,mort,dt,qini,tfinal) Tempo final.

65 Ludwig Krippahl, 2009 65 Crescimento bacteriano mat=[0,qini]; B=qini; for t=dt:dt:tfinal dB=B*cresc-B^2*mort; B=B+dB*dt; mat=[mat;t,B]; endfor

66 Ludwig Krippahl, 2009 66 Crescimento bacteriano Agora precisamos de calcular o erro do modelo aos dados experimentais. Análogo ao que fizemos para as reacções químicas, mas desta vez com duas variáveis.

67 Ludwig Krippahl, 2009 67 Crescimento bacteriano function err=errocres(dados,vars) mat=crescimento(vars(1),vars(2),10,0.1,400); y=interpol(mat,dados(:,1)); err=sum((y-dados(:,2)).^2); endfunction Matriz com a simulação, 400 minutos, passo de 10 minutos.

68 Ludwig Krippahl, 2009 68 Crescimento bacteriano function err=errocres(dados,vars) mat=crescimento(vars(1),vars(2),10,0.1,400); y=interpol(mat,dados(:,1)); err=sum((y-dados(:,2)).^2); endfunction Nota: Quantidade em “kilobactérias”. Explicação adiante...

69 Ludwig Krippahl, 2009 69 Crescimento bacteriano function err=errocres(dados,vars) mat=crescimento(vars(1),vars(2),10,0.1,400); y=interpol(mat,dados(:,1)); err=sum((y-dados(:,2)).^2); endfunction Interpolar os valores simulados para os pontos dos dados experimentais.

70 Ludwig Krippahl, 2009 70 Crescimento bacteriano function err=errocres(dados,vars) mat=crescimento(vars(1),vars(2),10,0.1,400); y=interpol(mat,dados(:,1)); err=sum((y-dados(:,2)).^2); endfunction Erro quadrático....

71 Ludwig Krippahl, 2009 71 Crescimento bacteriano function err=errocres(dados,vars) mat=crescimento(vars(1),vars(2),10,0.1,400); y=interpol(mat,dados(:,1)); err=sum((y-dados(:,2)).^2); endfunction Para o erro quadrático médio usar mean ou dividir pelo total.

72 Ludwig Krippahl, 2009 72 Crescimento bacteriano Para testar, simulamos dados com estes parâmetros: 10 pontos de 30 em 30 minutos. Nota: cada linha da matriz são 10 minutos. vals=[0.040234,0.001877]; mat=crescimento(vals(1),vals(2),10,0.1,400); dados=mat(3:3:30,:)

73 Ludwig Krippahl, 2009 73 Crescimento bacteriano Escolhemos um ponto inicial diferente, e minimizamos: xs=multimin("errocres",dados,[0.05,0.005],1e-4)

74 Ludwig Krippahl, 2009 74 Crescimento bacteriano Simulamos com os parâmetros calculados e comparamos: mat2=crescimento(xs(1),xs(2),10,0.1,400); hold off plot(dados(:,1),dados(:,2),"or"); hold on plot(mat2(:,1),mat2(:,2));

75 Ludwig Krippahl, 2009 75 Crescimento bacteriano

76 Ludwig Krippahl, 2009 76 Crescimento bacteriano Nota sobre as “kilobactérias”: Com esta equação, se contarmos em unidades de uma bactéria o parâmetro da mortalidade tem de ser mil vezes mais pequeno. Em geral, é melhor escolher as unidades de forma a que a função tenha uma escala semelhante nas várias dimensões. Desta forma a taxa de crescimento e de mortalidade têm apenas uma ordem de grandeza de diferença em vez de quatro.

77 Ludwig Krippahl, 2009 77 Processar dados experimentais Queremos estudar o efeito da meticilina no crescimento de uma bactéria. Duas pessoas, Ana e Carlos, cresceram lotes da bactéria em meios com e sem meticilina, e contaram as colónias de amostras retiradas de 30 em 30 minutos. A concentração inicial era de 100 bactérias por ml.

78 Ludwig Krippahl, 2009 78 Processar dados experimentais Os dados estão em 20 ficheiros 1.txt a 20.txt Dados de crescimento Meio:Normal Preparador:Ana 25;0 59;1... 296;40

79 Ludwig Krippahl, 2009 79 Processar dados experimentais Objectivo: ajustar o modelo de crescimento às 2 condições e comparar os parâmetros Ler os ficheiros para uma lista de estruturas Separar as medições por meio e/ou preparador, em matriz Calcular parâmetros.

80 Ludwig Krippahl, 2009 80 Processar dados experimentais Ler os ficheiros para uma lista de estruturas function dados=leficheiros(num)

81 Ludwig Krippahl, 2009 81 Ler os ficheiros dados=[]; for f=1:num fid=fopen([num2str(f),".txt"],"r"); reg.valores=[]; while !feof(fid)... endwhile dados(f)=reg; fclose(fid); endfor Percorre o número indicado de ficheiros numero.txt

82 Ludwig Krippahl, 2009 82 Ler os ficheiros dados=[]; for f=1:num fid=fopen([num2str(f),".txt"],"r"); reg.valores=[]; while !feof(fid)... endwhile dados(f)=reg; fclose(fid); endfor Matriz para os valores neste ficheiro

83 Ludwig Krippahl, 2009 83 Ler os ficheiros dados=[]; for f=1:num fid=fopen([num2str(f),".txt"],"r"); reg.valores=[]; while !feof(fid)... endwhile dados(f)=reg; fclose(fid); endfor Ler o ficheiro

84 Ludwig Krippahl, 2009 84 Ler os ficheiros dados=[]; for f=1:num fid=fopen([num2str(f),".txt"],"r"); reg.valores=[]; while !feof(fid)... endwhile dados(f)=reg; fclose(fid); endfor Acrescenta registo à lista e fecha o ficheiro

85 Ludwig Krippahl, 2009 85 Ler os ficheiros s=fgetl(fid); if !isstr(s) break endif if findstr(s,"Meio:")!=[] reg.meio=s(6:length(s)); elseif findstr(s,"Preparador:")!=[] reg.prep=s(12:length(s)); elseif findstr(s,";")!=[] m=split(s,";"); reg.valores=[reg.valores;str2num(m(1,:)),str2num(m(2,:))]; endif; endwhile Lê uma linha e testa se o resultado é string. Se não for é por ser -1, o que indica que não há linha para ler. Nesse caso termina o ciclo (pode haver linhas vazias no final do texto).

86 Ludwig Krippahl, 2009 86 Ler os ficheiros s=fgetl(fid); if !isstr(s) break endif if !isempty(findstr(s,"Meio:")) reg.meio=deblank(s(6:length(s))); elseif !isemoty(findstr(s,"Preparador:")) reg.prep=deblank(s(12:length(s))); elseif !isempty(findstr(s,";")) m=split(s,";"); reg.valores=[reg.valores;str2num(m(1,:)),str2num(m(2,:))]; endif; endwhile “Meio:” indica que se segue o meio (Normal ou Meticilina)

87 Ludwig Krippahl, 2009 87 Ler os ficheiros s=fgetl(fid); if !isstr(s) break endif if !isempty(findstr(s,"Meio:")) reg.meio=deblank(s(6:length(s))); elseif !isemoty(findstr(s,"Preparador:")) reg.prep=deblank(s(12:length(s))); elseif !isempty(findstr(s,";")) m=split(s,";"); reg.valores=[reg.valores;str2num(m(1,:)),str2num(m(2,:))]; endif; endwhile O preparador (Ana ou Carlos)

88 Ludwig Krippahl, 2009 88 Ler os ficheiros s=fgetl(fid); if !isstr(s) break endif if !isempty(findstr(s,"Meio:")) reg.meio=deblank(s(6:length(s))); elseif !isemoty(findstr(s,"Preparador:")) reg.prep=deblank(s(12:length(s))); elseif !isempty(findstr(s,";")) m=split(s,";"); reg.valores=[reg.valores;str2num(m(1,:)),str2num(m(2,:))]; endif; endwhile Um ; indica que é uma linha com os valores. Split, depois acrescenta à matriz.

89 Ludwig Krippahl, 2009 89 Ler os ficheiros Exemplo: octave:25> l=leficheiros(20); octave:26> l l = ( [1] = { meio = Normal prep = Ana valores = 34 0... 304 42 } [2] =...

90 Ludwig Krippahl, 2009 90 Organizar os dados Queremos receber uma matriz tempo, contagens para cada meio e/ou preparador: function mat=compiladados(lista,prep,meio) Recebe a lista e dois strings com o preparador e meio (“” para qualquer um)

91 Ludwig Krippahl, 2009 91 Organizar os dados function mat=compiladados(lista,prep,meio) mat=[]; for f=1:length(lista) reg=lista(f); if (isempty(meio) || strcmp(meio,reg.meio)) && (isempty(prep)|| strcmp(prep,reg.prep)) mat=[mat;reg.valores]; endif endfor Percorre a lista elemento a elemento.

92 Ludwig Krippahl, 2009 92 Organizar os dados function mat=compiladados(lista,prep,meio) mat=[]; for f=1:length(lista) reg=lista(f); if (isempty(meio) || strcmp(meio,reg.meio)) && (isempty(prep)|| strcmp(prep,reg.prep)) mat=[mat;reg.valores]; endif endfor Se é este o meio ou preparador, ou se “”, acrescenta.

93 Ludwig Krippahl, 2009 93 Organizar os dados Exemplo: todos os dados l=leficheiros(20); dados=compiladados(l,"",""); clearplot; plot(dados(:,1),dados(:,2),"o");

94 Ludwig Krippahl, 2009 94 Organizar os dados Exemplo: todos os dados

95 Ludwig Krippahl, 2009 95 Organizar os dados Exemplos: separados por meio dmet=compiladados(l,"","Meticilina"); dsem=compiladados(l,"","Normal"); clearplot hold on plot(dmet(:,1),dmet(:,2),"or;Meticilina;"); plot(dsem(:,1),dsem(:,2),"xg;Normal;");

96 Ludwig Krippahl, 2009 96 Organizar os dados

97 Ludwig Krippahl, 2009 97 Organizar os dados Exemplos: separados por preparador ana=compiladados(l,"Ana",""); carlos=compiladados(l,"Carlos",""); clearplot hold on plot(ana(:,1),ana(:,2),"or;Ana;"); plot(carlos(:,1),carlos(:,2),"xg;Carlos;");

98 Ludwig Krippahl, 2009 98 Organizar os dados Exemplos: separados por preparador

99 Ludwig Krippahl, 2009 99 Ajustar o modelo Separamos por meio: dmet=compiladados(l,"","Meticilina"); dsem=compiladados(l,"","Normal"); E minimizamos, a partir de uma estimativa inicial: xs=multimin("errocres",dsem,[0.05,0.002],1e-4); xm=multimin("errocres",dmet,[0.05,0.002],1e-4);

100 Ludwig Krippahl, 2009 100 Ajustar o modelo Simulamos com os parâmetros calculados: sims=crescimento(xs(1),xs(2),10,0.1,400); simm=crescimento(xm(1),xm(2),10,0.1,400);

101 Ludwig Krippahl, 2009 101 Ajustar o modelo E comparamos os dados com a simulação: clearplot hold on plot(dmet(:,1),dmet(:,2),"or"); plot(dsem(:,1),dsem(:,2),"xg"); plot(simm(:,1),simm(:,2),"-r;Meticilina;"); plot(sims(:,1),sims(:,2),"-g;Normal;");

102 Ludwig Krippahl, 2009 102 Ajustar o modelo Compara-se no gráfico:

103 Ludwig Krippahl, 2009 103 Exportar o resultado Escrita formatada: fprintf fprintf(id, formato, dados) Exemplo: escrever tabela em duas colunas separadas por tab. fid=fopen("relatorio.txt","w"); mat=compiladados(l,"",""); fprintf(fid,"%i\t%i\r\n",mat’) fclose(fid)

104 Ludwig Krippahl, 2009 104 Exportar o resultado fprintf(fid,"%i\t%i\r\n",mat’) %i indica que é um número inteiro.

105 Ludwig Krippahl, 2009 105 Exportar o resultado fprintf(fid,"%i\t%i\r\n",mat’) \t é o caracter tab.

106 Ludwig Krippahl, 2009 106 Exportar o resultado fprintf(fid,"%i\t%i\r\n",mat’) \r\n indica uma nova linha.

107 Ludwig Krippahl, 2009 107 Exportar o resultado % é um caracter especial na string de formatação, indica que o que se segue especifica o formato (ver fprint no manual) \ é um caracter especial em qualquer string, usado para caracteres que não são visíveis (mudar de linha, tab, etc.) Para mostrar escrever dois: \\, %

108 Ludwig Krippahl, 2009 108 Exportar o resultado Quando o fprintf ou o printf (para escrever no ecrã) recebem uma matriz percorrem todos os elementos da matriz aplicando a formatação na ordem indicada; Atenção: percorre a primeira coluna toda, depois a segunda, etc.. Como temos dados em colunas, usar transposta.

109 Ludwig Krippahl, 2009 109 Trabalho 2 O trabalho 2 é parecido. Ler os ficheiros com dados e modelos. Ajustar as constantes. Exportar resultados

110 Ludwig Krippahl, 2009 110 Trabalho 2 Problema Medicamento no estômago (ME) Medicamento no sangue (MS) ME  MS  Excretado Duas constantes

111 Ludwig Krippahl, 2009 111 Trabalho 2 Problema Medicamento no estômago (ME) Medicamento no sangue (MS) d[ME]/dt = -[ME] ka d[MS]/dt = [ME] ka – [MS] ke [ ] mg/Kg

112 Ludwig Krippahl, 2009 112 Trabalho 2 Problema Medicamento no estômago (ME) Medicamento no sangue (MS) As constantes podem depender Da idade ( =30 anos) De tomar em jejum ou depois da refeição

113 Ludwig Krippahl, 2009 113 Trabalho 2 Objectivos Determinar as constantes para os 4 casos (idade e quando toma) Determinar a dose necessária (mg/Kg) para manter uma concentração média de 50mg/Kg durante 6 dias tomando de 12 em 12 horas, conforme o caso.

114 Ludwig Krippahl, 2009 114 Trabalho 2 O que fazer: Ler os ficheiros (estruturas?)

115 Ludwig Krippahl, 2009 115 Trabalho 2 Idade:49 Administrado em jejum Horas[MS] 2.3669 4.0674 6.3556... Horas: tempo da amostra [MS]: mg/Kg

116 Ludwig Krippahl, 2009 116 Trabalho 2 O que fazer: Ler os ficheiros (estruturas?) Calcular as constantes que ajustam o modelo aos dados de cada ficheiro Minimizar para as duas constantes: 18 valores Assumir ka dado, minimizar só uma: 15 valores

117 Ludwig Krippahl, 2009 117 Trabalho 2 O que fazer: Ler os ficheiros (estruturas?) Calcular as constantes que ajustam o modelo aos dados de cada ficheiro Calcular as doses necessárias para uma média de 50mg/Kg, 12/12h, 6 dias Opcional, 2 valores Não explico como...

118 Ludwig Krippahl, 2009 118 Trabalho 2 O que fazer: Ler os ficheiros (estruturas?) Calcular as constantes que ajustam o modelo aos dados de cada ficheiro Calcular as doses necessárias para uma média de 50mg/Kg, 12/12h, 6 dias Gravar tudo para 4 ficheiros com os relatórios Constantes, dosagem, dados experimentais

119 Ludwig Krippahl, 2009 119 Próximas Prática Ajustar as curvas de crescimento 2 aulas para o trabalho Teóricas 20: Excel, revisões 27: Introdução à bioinformática 3: Estrutura do exame, revisões, dúvidas.

120 Ludwig Krippahl, 2009 120 Dúvidas


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

Apresentações semelhantes


Anúncios Google