Programação para as Ciências Experimentais 2008/9 Teórica 12 Ludwig Krippahl, 2009 Na aula de hoje... Minimização multidimensional Exemplo: estimativa do efeito de um antibiótico no crescimento bacteriano. Trabalho Prático 2 Ludwig Krippahl, 2009 2 Crescimento bacteriano Equação de Verhulst: dB/dt = cB – mB2 Ludwig Krippahl, 2009 3 Crescimento bacteriano Equação de Verhulst: dB/dt = cB – mB2 Variação do número de organismos Ludwig Krippahl, 2009 4 Crescimento bacteriano Equação de Verhulst: dB/dt = cB – mB2 É o ritmo de crescimento vezes o número de organismos Ludwig Krippahl, 2009 5 Crescimento bacteriano Equação de Verhulst: dB/dt = cB – mB2 Menos a taxa de mortalidade vezes o quadrado desse número. A mortalidade resulta da competição por recursos. Ludwig Krippahl, 2009 6 Crescimento bacteriano Ludwig Krippahl, 2009 7 Crescimento bacteriano Problema: • Dado um conjunto de medições, ajustar os parâmetros da equação Ludwig Krippahl, 2009 8 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. Ludwig Krippahl, 2009 9 Minimização multidimensional Método: • Minimizar uma variável de cada vez até chegar a um ponto fixo, a menos da precisão desejada Ludwig Krippahl, 2009 10 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. Ludwig Krippahl, 2009 11 Minimização multidimensional Ponto inicial Ludwig Krippahl, 2009 12 Minimização multidimensional Ponto inicial Mínimo de X Ludwig Krippahl, 2009 13 Minimização multidimensional Ponto inicial Mínimo de X Mínimo de Y Ludwig Krippahl, 2009 14 Minimização multidimensional Ponto inicial Mínimo de X Novo mínimo de X Mínimo de Y Ludwig Krippahl, 2009 15 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. Ludwig Krippahl, 2009 16 Os 3 pontos iniciais X1 é o ponto dado Ludwig Krippahl, 2009 17 Os 3 pontos iniciais X1 Xm próximo de X1 Ludwig Krippahl, 2009 18 Os 3 pontos iniciais X1 Desce? Xm próximo de X1 Se não, troca Ludwig Krippahl, 2009 19 Os 3 pontos iniciais X1 Xm X2 a 1.618*(Xm-X1) Ludwig Krippahl, 2009 20 Os 3 pontos iniciais Y2>Ym? Não, continua: X1=Xm X1 Xm X2 Xm=X2 Ludwig Krippahl, 2009 21 Os 3 pontos iniciais Y2>Ym? Não, continua: X1=Xm X1 Xm Xm=X2 Ludwig Krippahl, 2009 22 Os 3 pontos iniciais Y2>Ym? Não, continua: X1=Xm X1 Xm X2 Xm=X2 Ludwig Krippahl, 2009 23 Os 3 pontos iniciais Y2>Ym? Sim.Devolve: X1 Xm X2 Ym X2 X1 Xm (Ym para começar a minimização) Ludwig Krippahl, 2009 24 Os 3 pontos iniciais function [x1,xm,x2,ym]= mininicial(funcao,params,vars,indice,delta) Ludwig Krippahl, 2009 25 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. Ludwig Krippahl, 2009 26 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 Ludwig Krippahl, 2009 27 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) Ludwig Krippahl, 2009 28 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) Ludwig Krippahl, 2009 29 Os 3 pontos iniciais function [x1,xm,x2,ym]= mininicial(funcao,params,vars,indice,delta) Tamanho do passo inicial para calcular o primeiro Xm a partir do X inicial, que será o valor que vem em vars(indice). Ludwig Krippahl, 2009 30 Os 3 pontos iniciais razaod=1.618; Razão dourada x1=vars(indice); y1=feval(funcao,params,vars); xm=x1+delta; vars(indice)=xm; ym=feval(funcao,params,vars); Ludwig Krippahl, 2009 31 Os 3 pontos iniciais razaod=1.618; Calcular x1 e y1. x1=vars(indice); y1=feval(funcao,params,vars); Nota: a função cujo nome xm=x1+delta; foi dado em funcao precisa vars(indice)=xm; de todo o vars, mas só ym=feval(funcao,params,vars); alteramos o elemento indice Ludwig Krippahl, 2009 32 Os 3 pontos iniciais razaod=1.618; x1=vars(indice); y1=feval(funcao,params,vars); xm=x1+delta; Mesma coisa para xm e ym vars(indice)=xm; ym=feval(funcao,params,vars); Ludwig Krippahl, 2009 33 Os 3 pontos iniciais if ym>y1 Se for “a subir” troca o x1 t=ym; com o xm, e o y1 com o 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); Ludwig Krippahl, 2009 34 Os 3 pontos iniciais if ym>y1 Calcula o x2 a uma distância t=ym; de xm igual a 1.618.. vezes o ym=y1; y1=t; intervalo (xm-x1). t=xm; xm=x1; x1=t; endif x2=xm+razaod*(xm-x1); vars(indice)=x2; y2=feval(funcao,params,vars); Ludwig Krippahl, 2009 35 Os 3 pontos iniciais if ym>y1 Se x1>xm, continua para t=ym; valores maiores. ym=y1; y1=t; Se foi trocado, x1-xm é t=xm; xm=x1; negativo e segue para x1=t; valores menores. endif x2=xm+razaod*(xm-x1); vars(indice)=x2; y2=feval(funcao,params,vars); Ludwig Krippahl, 2009 36 Os 3 pontos iniciais Enquanto continua “a descer”, avança com os pontos, while y2<ym x1=xm; xm=x2; ym=y2; x2=xm+razaod*(xm-x1); vars(indice)=x2; y2=feval(funcao,params,vars); endwhile Ludwig Krippahl, 2009 37 Minimização Antes era: function xm=minfn(func,params,x1,xm,x2,prec) Agora é: function xm=minfnvec(func,params,vars,indice,prec) Ludwig Krippahl, 2009 38 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. Ludwig Krippahl, 2009 39 Minimização multidimensional function xm=minfnvec(func,params,vars,indice,prec) Função (o nome, em string) e parâmetros constantes, como de costume. Ludwig Krippahl, 2009 40 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. Ludwig Krippahl, 2009 41 Minimização multidimensional function xm=minfnvec(func,params,vars,indice,prec) Índice da variável onde procurar o mínimo. Ludwig Krippahl, 2009 42 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) Ludwig Krippahl, 2009 43 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. 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 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); 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 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). Ludwig Krippahl, 2009 46 Minimização multidimensional Precisamos de: function xs=multimin(funcao,params,xs,prec) Ludwig Krippahl, 2009 47 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 Ludwig Krippahl, 2009 48 Minimização multidimensional function xs=multimin(funcao,params,xs,prec) Nome da função a minimizar. Ludwig Krippahl, 2009 49 Minimização multidimensional function xs=multimin(funcao,params,xs,prec) Parâmetros constantes... Ludwig Krippahl, 2009 50 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) Ludwig Krippahl, 2009 51 Minimização multidimensional function xs=multimin(funcao,params,xs,prec) Precisão Ludwig Krippahl, 2009 52 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 Ciclo só termina no endwhile Ludwig Krippahl, 2009 break. 53 Minimização multidimensional while true Guarda os valores antigos xvs=xs; for f=1:length(xs) dos 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 Ludwig Krippahl, 2009 54 Minimização multidimensional while true Minimiza em cada dimensão, xvs=xs; for f=1:length(xs) actualizando o valor nos 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 Ludwig Krippahl, 2009 55 Minimização multidimensional while true Mostra o progresso do xvs=xs; cálculo indicando os for f=1:length(xs) valores correntes. 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 Ludwig Krippahl, 2009 56 Minimização multidimensional while true xvs=xs; for f=1:length(xs) xs(f)=minfnvec(funcao,params,xs,f,prec); Se o total da variação endfor absoluta das variáveis é disp("Valores até agora:") inferior à precisão, acabou. disp(xs); fflush(stdout) if sum(abs(xs-xvs))<prec break endif endwhile Ludwig Krippahl, 2009 57 Crescimento bacteriano De volta ao problema: dB/dt = cB – mB2 • Integramos pelo método de Euler, com a função: function mat=crescimento(cresc,mort,dt,qini,tfinal) Ludwig Krippahl, 2009 58 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 Ludwig Krippahl, 2009 59 Crescimento bacteriano function mat=crescimento(cresc,mort,dt,qini,tfinal) Taxa de crescimento Ludwig Krippahl, 2009 60 Crescimento bacteriano function mat=crescimento(cresc,mort,dt,qini,tfinal) Taxa de mortalidade Ludwig Krippahl, 2009 61 Crescimento bacteriano function mat=crescimento(cresc,mort,dt,qini,tfinal) Passo de integração Ludwig Krippahl, 2009 62 Crescimento bacteriano function mat=crescimento(cresc,mort,dt,qini,tfinal) Quantidade inicial de organismos. Ludwig Krippahl, 2009 63 Crescimento bacteriano function mat=crescimento(cresc,mort,dt,qini,tfinal) Tempo final. Ludwig Krippahl, 2009 64 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 Ludwig Krippahl, 2009 65 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. Ludwig Krippahl, 2009 66 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. 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 Nota: Quantidade em “kilobactérias”. Explicação adiante... 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 Interpolar os valores simulados para os pontos dos dados experimentais. 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 Erro quadrático.... 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 Para o erro quadrático médio usar mean ou dividir pelo total. Ludwig Krippahl, 2009 71 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,:) Ludwig Krippahl, 2009 72 Crescimento bacteriano Escolhemos um ponto inicial diferente, e minimizamos: xs=multimin("errocres",dados,[0.05,0.005],1e-4) Ludwig Krippahl, 2009 73 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)); Ludwig Krippahl, 2009 74 Crescimento bacteriano Ludwig Krippahl, 2009 75 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. Ludwig Krippahl, 2009 76 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. Ludwig Krippahl, 2009 77 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 Ludwig Krippahl, 2009 78 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. Ludwig Krippahl, 2009 79 Processar dados experimentais Ler os ficheiros para uma lista de estruturas function dados=leficheiros(num) Ludwig Krippahl, 2009 80 Ler os ficheiros dados=[]; for f=1:num fid=fopen([num2str(f),".txt"],"r"); reg.valores=[]; while !feof(fid) Percorre o número indicado ... de ficheiros numero.txt endwhile dados(f)=reg; fclose(fid); endfor Ludwig Krippahl, 2009 81 Ler os ficheiros dados=[]; for f=1:num fid=fopen([num2str(f),".txt"],"r"); reg.valores=[]; while !feof(fid) ... endwhile Matriz para os valores neste dados(f)=reg; ficheiro fclose(fid); endfor Ludwig Krippahl, 2009 82 Ler os ficheiros dados=[]; for f=1:num fid=fopen([num2str(f),".txt"],"r"); reg.valores=[]; while !feof(fid) ... Ler o ficheiro endwhile dados(f)=reg; fclose(fid); endfor Ludwig Krippahl, 2009 83 Ler os ficheiros dados=[]; for f=1:num fid=fopen([num2str(f),".txt"],"r"); Acrescenta registo à lista e reg.valores=[]; fecha o ficheiro while !feof(fid) ... endwhile dados(f)=reg; fclose(fid); endfor Ludwig Krippahl, 2009 84 Ler os ficheiros s=fgetl(fid); if !isstr(s) break Lê uma linha e testa se o endif if findstr(s,"Meio:")!=[] resultado é string. Se não for reg.meio=s(6:length(s)); é por ser -1, o que indica que elseif findstr(s,"Preparador:")!=[] reg.prep=s(12:length(s)); não há linha para ler. Nesse elseif findstr(s,";")!=[] caso termina o ciclo (pode m=split(s,";"); haver linhas vazias no final reg.valores=[reg.valores;str2num(m(1,:)),str2num(m(2,:))]; endif; do texto). endwhile Ludwig Krippahl, 2009 85 Ler os ficheiros s=fgetl(fid); “Meio:” indica que se segue if !isstr(s) meio (Normal ou Meticilina) 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 Ludwig Krippahl, 2009 86 o Ler os ficheiros s=fgetl(fid); if !isstr(s) O preparador (Ana ou break Carlos) 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 Ludwig Krippahl, 2009 87 Ler os ficheiros s=fgetl(fid); Um ; indica que é uma linha if !isstr(s) com os valores. Split, depois break endif acrescenta à matriz. 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 Ludwig Krippahl, 2009 88 Ler os ficheiros Exemplo: octave:25> l=leficheiros(20); octave:26> l l= ( [1] = { meio = Normal prep = Ana valores = 34 0 ... 304 42 } [2] = ... Ludwig Krippahl, 2009 89 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) Ludwig Krippahl, 2009 90 Organizar os dados function mat=compiladados(lista,prep,meio) mat=[]; for f=1:length(lista) Percorre a lista elemento a elemento. reg=lista(f); if (isempty(meio) || strcmp(meio,reg.meio)) && (isempty(prep)|| strcmp(prep,reg.prep)) mat=[mat;reg.valores]; endif endfor Ludwig Krippahl, 2009 91 Organizar os dados function mat=compiladados(lista,prep,meio) mat=[]; Se é este o meio ou for f=1:length(lista) preparador, ou se “”, reg=lista(f); acrescenta. if (isempty(meio) || strcmp(meio,reg.meio)) && (isempty(prep)|| strcmp(prep,reg.prep)) mat=[mat;reg.valores]; endif endfor Ludwig Krippahl, 2009 92 Organizar os dados Exemplo: todos os dados l=leficheiros(20); dados=compiladados(l,"",""); clearplot; plot(dados(:,1),dados(:,2),"o"); Ludwig Krippahl, 2009 93 Organizar os dados Exemplo: todos os dados Ludwig Krippahl, 2009 94 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;"); Ludwig Krippahl, 2009 95 Organizar os dados Ludwig Krippahl, 2009 96 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;"); Ludwig Krippahl, 2009 97 Organizar os dados Exemplos: separados por preparador Ludwig Krippahl, 2009 98 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); Ludwig Krippahl, 2009 99 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); Ludwig Krippahl, 2009 100 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;"); Ludwig Krippahl, 2009 101 Ajustar o modelo Compara-se no gráfico: Ludwig Krippahl, 2009 102 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) Ludwig Krippahl, 2009 103 Exportar o resultado fprintf(fid,"%i\t%i\r\n",mat’) %i indica que é um número inteiro. Ludwig Krippahl, 2009 104 Exportar o resultado fprintf(fid,"%i\t%i\r\n",mat’) \t é o caracter tab. Ludwig Krippahl, 2009 105 Exportar o resultado fprintf(fid,"%i\t%i\r\n",mat’) \r\n indica uma nova linha. Ludwig Krippahl, 2009 106 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: \\, %% Ludwig Krippahl, 2009 107 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. Ludwig Krippahl, 2009 108 Trabalho 2 O trabalho 2 é parecido. • Ler os ficheiros com dados e modelos. • Ajustar as constantes. • Exportar resultados Ludwig Krippahl, 2009 109 Trabalho 2 Problema • Medicamento no estômago (ME) • Medicamento no sangue (MS) ME MS Excretado Duas constantes Ludwig Krippahl, 2009 110 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 Ludwig Krippahl, 2009 111 Trabalho 2 Problema • Medicamento no estômago (ME) • Medicamento no sangue (MS) • As constantes podem depender • Da idade (<30 anos, >=30 anos) • De tomar em jejum ou depois da refeição Ludwig Krippahl, 2009 112 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. Ludwig Krippahl, 2009 113 Trabalho 2 O que fazer: • Ler os ficheiros (estruturas?) Ludwig Krippahl, 2009 114 Trabalho 2 Idade:49 Administrado em jejum Horas [MS] 2.36 69 Horas: tempo da amostra 4.06 74 [MS]: mg/Kg 6.35 56 ... Ludwig Krippahl, 2009 115 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 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 Calcular as doses necessárias para uma média de 50mg/Kg, 12/12h, 6 dias • Opcional, 2 valores • Não explico como... 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 Gravar tudo para 4 ficheiros com os relatórios • Constantes, dosagem, dados experimentais Ludwig Krippahl, 2009 118 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. Ludwig Krippahl, 2009 119 Dúvidas Ludwig Krippahl, 2009 120