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

Apresentações semelhantes


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

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

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

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

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

5 Ludwig Krippahl, 2008 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, 2008 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, 2008 7 Crescimento bacteriano

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

9 Ludwig Krippahl, 2008 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, 2008 10 Minimização multidimensional Método mais simples: Minimizar uma variável de cada vez até chegar a um ponto fixo, a menos da precisão desejada

11 Ludwig Krippahl, 2008 11 Minimização multidimensional Método mais simples: 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, 2008 12 Minimização multidimensional Ponto inicial

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

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

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

16 Ludwig Krippahl, 2008 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, 2008 17 Os 3 pontos iniciais X 1 é o ponto dado

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

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

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

21 Ludwig Krippahl, 2008 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, 2008 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, 2008 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, 2008 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, 2008 25 Os 3 pontos iniciais function [x1,xm,x2,ym]= mininicial(funcao,params,vars,indice,delta)

26 Ludwig Krippahl, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 31 Os 3 pontos iniciais razaod=1.618; x1=vars(indice); vars(indice)=x1; y1=feval(funcao,params,vars); xm=x1+delta; vars(indice)=xm; ym=feval(funcao,params,vars); Razão dourada

32 Ludwig Krippahl, 2008 32 Os 3 pontos iniciais razaod=1.618; x1=vars(indice); vars(indice)=x1; 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, 2008 33 Os 3 pontos iniciais razaod=1.618; x1=vars(indice); vars(indice)=x1; 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, 2008 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, 2008 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, 2008 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, 2008 37 Os 3 pontos iniciais while y2 { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.com.br/1/332214/slides/slide_37.jpg", "name": "Ludwig Krippahl, 2008 37 Os 3 pontos iniciais while y2

38 Ludwig Krippahl, 2008 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, 2008 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, 2008 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, 2008 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, 2008 42 Minimização multidimensional function xm=minfnvec(func,params,vars,indice,prec) Índice da variável onde procurar o mínimo.

43 Ludwig Krippahl, 2008 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, 2008 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, 2008 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 xn=c1*xm+c2*x1; vars(indice)=xn; yn=feval(func,params,vars);

46 Ludwig Krippahl, 2008 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, 2008 47 Minimização multidimensional Precisamos de: function xs=multimin(funcao,params,xs,prec)

48 Ludwig Krippahl, 2008 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, 2008 49 Minimização multidimensional function xs=multimin(funcao,params,xs,prec) Nome da função a minimizar.

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

51 Ludwig Krippahl, 2008 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, 2008 52 Minimização multidimensional function xs=multimin(funcao,params,xs,prec) Precisão

53 Ludwig Krippahl, 2008 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); if sum(abs(xs-xvs)) { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.com.br/1/332214/slides/slide_53.jpg", "name": "Ludwig Krippahl, 2008 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); if sum(abs(xs-xvs))

54 Ludwig Krippahl, 2008 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); if sum(abs(xs-xvs)) { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.com.br/1/332214/slides/slide_54.jpg", "name": "Ludwig Krippahl, 2008 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); if sum(abs(xs-xvs))

55 Ludwig Krippahl, 2008 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); if sum(abs(xs-xvs)) { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.com.br/1/332214/slides/slide_55.jpg", "name": "Ludwig Krippahl, 2008 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); if sum(abs(xs-xvs))

56 Ludwig Krippahl, 2008 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); if sum(abs(xs-xvs)) { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.com.br/1/332214/slides/slide_56.jpg", "name": "Ludwig Krippahl, 2008 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); if sum(abs(xs-xvs))

57 Ludwig Krippahl, 2008 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); if sum(abs(xs-xvs)) { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.com.br/1/332214/slides/slide_57.jpg", "name": "Ludwig Krippahl, 2008 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); if sum(abs(xs-xvs))

58 Ludwig Krippahl, 2008 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, 2008 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, 2008 60 Crescimento bacteriano function mat=crescimento(cresc,mort,dt,qini,tfinal) Taxa de crescimento

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

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

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

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

65 Ludwig Krippahl, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 73 Crescimento bacteriano Escolhemos um ponto inicial diferente, e minimizamos: xs=multimin("errocres",dados,[0.05,0.005],1e-4)

74 Ludwig Krippahl, 2008 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, 2008 75 Crescimento bacteriano

76 Ludwig Krippahl, 2008 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 que 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, 2008 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, 2008 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, 2008 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, 2008 80 Processar dados experimentais Ler os ficheiros para uma lista de estruturas function dados=leficheiros(num)

81 Ludwig Krippahl, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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, 2008 93 Organizar os dados Exemplo: todos os dados l=leficheiros(20); dados=compiladados(l,"",""); clearplot; plot(dados(:,1),dados(:,2),"o");

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

95 Ludwig Krippahl, 2008 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, 2008 96 Organizar os dados

97 Ludwig Krippahl, 2008 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, 2008 98 Organizar os dados Exemplos: separados por preparador

99 Ludwig Krippahl, 2008 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, 2008 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, 2008 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, 2008 102 Ajustar o modelo Compara-se no gráfico:

103 Ludwig Krippahl, 2008 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\n",mat) fclose(fid)

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

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

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

107 Ludwig Krippahl, 2008 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, 2008 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, 2008 109 Trabalho 2 O trabalho 2 é parecido. Ler os ficheiros com dados e modelos. Ajustar as constantes. Exportar resultados

110 Ludwig Krippahl, 2008 110 Trabalho 2 Reacções: 1:A B 2:2A B 3:2A B 4:A B B C

111 Ludwig Krippahl, 2008 111 Trabalho 2 Ficheiros: Modelo 1 0.680.870.15 2.010.660.36 3.630.490.51 4.730.350.67 Modelo desta reacção

112 Ludwig Krippahl, 2008 112 Trabalho 2 Ficheiros: Modelo 1 0.680.870.15 2.010.660.36 3.630.490.51 4.730.350.67 Tempos

113 Ludwig Krippahl, 2008 113 Trabalho 2 Ficheiros: Modelo 1 0.680.870.15 2.010.660.36 3.630.490.51 4.730.350.67 [A]

114 Ludwig Krippahl, 2008 114 Trabalho 2 Ficheiros: Modelo 1 0.680.870.15 2.010.660.36 3.630.490.51 4.730.350.67 [B]

115 Ludwig Krippahl, 2008 115 Trabalho 2 Primeira tarefa Ler os ficheiros (estruturas?) Calcular as constantes que ajustam o modelo aos dados de cada ficheiro

116 Ludwig Krippahl, 2008 116 Trabalho 2 Segunda tarefa Gravar o relatório com todos (report.txt) Gravar os relatórios dos modelos (modelo1.txt,...)

117 Ludwig Krippahl, 2008 117 Trabalho 2 Gravar o relatório com todos (report.txt) 110.0004770.203251 220.0001500.304144 330.0002780.2132520.108541 440.0002580.2032530.307969 510.0001940.205613 620.0000910.304144 730.0001420.1994330.093819 Número do ficheiro

118 Ludwig Krippahl, 2008 118 Trabalho 2 Gravar o relatório com todos (report.txt) 110.0004770.203251 220.0001500.304144 330.0002780.2132520.108541 440.0002580.2032530.307969 510.0001940.205613 620.0000910.304144 730.0001420.1994330.093819 Modelo

119 Ludwig Krippahl, 2008 119 Trabalho 2 Gravar o relatório com todos (report.txt) 110.0004770.203251 220.0001500.304144 330.0002780.2132520.108541 440.0002580.2032530.307969 510.0001940.205613 620.0000910.304144 730.0001420.1994330.093819 Erro, depois de ajustado

120 Ludwig Krippahl, 2008 120 Trabalho 2 Gravar o relatório com todos (report.txt) 110.0004770.203251 220.0001500.304144 330.0002780.2132520.108541 440.0002580.2032530.307969 510.0001940.205613 620.0000910.304144 730.0001420.1994330.093819 Constantes

121 Ludwig Krippahl, 2008 121 Trabalho 2 Gravar ficheiros para cada modelo 0.2060870.280261 0.5900000.8900000.120000 1.2400000.7900000.200000 1.9200000.6800000.250000 2.5800000.5400000.290000 3.5300000.5100000.310000 4.1500000.4400000.290000 Constantes

122 Ludwig Krippahl, 2008 122 Trabalho 2 Gravar ficheiros para cada modelo 0.2060870.280261 0.5900000.8900000.120000 1.2400000.7900000.200000 1.9200000.6800000.250000 2.5800000.5400000.290000 3.5300000.5100000.310000 4.1500000.4400000.290000 Dados

123 Ludwig Krippahl, 2008 123 Trabalho 2 Para os ficheiros modelo1-4 temos que ignorar experiências problemáticas. As constantes são a média daquelas com um erro quadrático médio < 0.01. Os dados apresentados são apenas os destas experiências. Atenção: o erro é calculado para A e B, e é a média de todas as diferenças ao quadrado.

124 Ludwig Krippahl, 2008 124 Trabalho 2 Depois de tudo feito: Chama-se uma função O programa gera os ficheiros report.txt e modelo1.txt a modelo4.txt Próxima parte é em Excel (próxima aula)

125 Ludwig Krippahl, 2008 125 Dúvidas


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

Apresentações semelhantes


Anúncios Google