ludwig krippahl, 2008 programação para as ciências experimentais 2007/8 teórica 11

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

Upload: internet

Post on 17-Apr-2015

106 views

Category:

Documents


3 download

TRANSCRIPT

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

Ludwig Krippahl, 2008

Programação para as Ciências Experimentais

2007/8

Teórica 11

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

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.

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

Ludwig Krippahl, 2008 3

Crescimento bacteriano

Equação de Verhulst:

dB/dt = cB – mB2

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

Ludwig Krippahl, 2008 4

Crescimento bacteriano

Equação de Verhulst:

dB/dt = cB – mB2

Variação do número de organismos

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

Ludwig Krippahl, 2008 5

Crescimento bacteriano

Equação de Verhulst:

dB/dt = cB – mB2

É o ritmo de crescimento vezes o número de organismos

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

Ludwig Krippahl, 2008 6

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.

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

Ludwig Krippahl, 2008 7

Crescimento bacteriano

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

Ludwig Krippahl, 2008 8

Crescimento bacteriano

Problema:• Dado um conjunto de medições, ajustar os

parâmetros da equação

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

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.

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

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

Page 11: Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 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.

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

Ludwig Krippahl, 2008 12

Minimização multidimensionalPonto inicial

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

Ludwig Krippahl, 2008 13

Minimização multidimensionalPonto inicial

Mínimo de X

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

Ludwig Krippahl, 2008 14

Minimização multidimensionalPonto inicial

Mínimo de X

Mínimo de Y

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

Ludwig Krippahl, 2008 15

Minimização multidimensionalPonto inicial

Mínimo de X

Mínimo de Y

Novo mínimo de X

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

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.

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

Ludwig Krippahl, 2008 17

Os 3 pontos iniciais

X1 é o ponto dado

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

Ludwig Krippahl, 2008 18

Os 3 pontos iniciais

X1

Xm próximo de X1

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

Ludwig Krippahl, 2008 19

Os 3 pontos iniciais

X1

Xm próximo de X1Desce?

Se não, troca

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

Ludwig Krippahl, 2008 20

Os 3 pontos iniciais

X1

Xm

X2 a 1.618*(Xm-X1)

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

Ludwig Krippahl, 2008 21

Os 3 pontos iniciais

X1

Xm

X2

Y2>Ym?

Não, continua:

X1=Xm

Xm=X2

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

Ludwig Krippahl, 2008 22

Os 3 pontos iniciais

X1

Xm

Y2>Ym?

Não, continua:

X1=Xm

Xm=X2

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

Ludwig Krippahl, 2008 23

Os 3 pontos iniciais

X1

Xm

Y2>Ym?

Não, continua:

X1=Xm

Xm=X2

X2

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

Ludwig Krippahl, 2008 24

Os 3 pontos iniciais

X1 Xm

Y2>Ym?

Sim.Devolve:

X1 Xm X2 Ym

(Ym para começar a minimização)

X2

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

Ludwig Krippahl, 2008 25

Os 3 pontos iniciais

function [x1,xm,x2,ym]=

mininicial(funcao,params,vars,indice,delta)

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

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.

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

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

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

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)

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

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)

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

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 Xm a partir do X inicial, que será o valor que vem em vars(indice).

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

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

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

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

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

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

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

Ludwig Krippahl, 2008 34

Os 3 pontos iniciais

if ym>y1 t=ym;ym=y1;y1=t;t=xm;xm=x1;x1=t;

endifx2=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.

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

Ludwig Krippahl, 2008 35

Os 3 pontos iniciais

if ym>y1 t=ym;ym=y1;y1=t;t=xm;xm=x1;x1=t;

endifx2=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).

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

Ludwig Krippahl, 2008 36

Os 3 pontos iniciais

if ym>y1 t=ym;ym=y1;y1=t;t=xm;xm=x1;x1=t;

endifx2=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.

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

Ludwig Krippahl, 2008 37

Os 3 pontos iniciais

while y2<ymx1=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,

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

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)

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

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.

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

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.

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

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.

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

Ludwig Krippahl, 2008 42

Minimização multidimensional

function

xm=minfnvec(func,params,vars,indice,prec)

Índice da variável onde procurar o mínimo.

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

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)

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

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.

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

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);

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

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

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

Ludwig Krippahl, 2008 47

Minimização multidimensional

Precisamos de:

function xs=multimin(funcao,params,xs,prec)

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

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

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

Ludwig Krippahl, 2008 49

Minimização multidimensional

function xs=multimin(funcao,params,xs,prec)

Nome da função a minimizar.

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

Ludwig Krippahl, 2008 50

Minimização multidimensional

function xs=multimin(funcao,params,xs,prec)

Parâmetros constantes...

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

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)

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

Ludwig Krippahl, 2008 52

Minimização multidimensional

function xs=multimin(funcao,params,xs,prec)

Precisão

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

Ludwig Krippahl, 2008 53

Minimização multidimensional

while truexvs=xs;for f=1:length(xs)

xs(f)=minfnvec(funcao,params,xs,f,prec);endfordisp("Valores até agora:")disp(xs);if sum(abs(xs-xvs))<prec

breakendif

endwhile

Ciclo infinito que só termina no break.

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

Ludwig Krippahl, 2008 54

Minimização multidimensional

while truexvs=xs;for f=1:length(xs)

xs(f)=minfnvec(funcao,params,xs,f,prec);endfordisp("Valores até agora:")disp(xs);if sum(abs(xs-xvs))<prec

breakendif

endwhile

Guarda os valores antigos dos xs

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

Ludwig Krippahl, 2008 55

Minimização multidimensional

while truexvs=xs;for f=1:length(xs)

xs(f)=minfnvec(funcao,params,xs,f,prec);endfordisp("Valores até agora:")disp(xs);if sum(abs(xs-xvs))<prec

breakendif

endwhile

Minimiza em cada dimensão, actualizando o valor nos xs

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

Ludwig Krippahl, 2008 56

Minimização multidimensional

while truexvs=xs;for f=1:length(xs)

xs(f)=minfnvec(funcao,params,xs,f,prec);endfordisp("Valores até agora:")disp(xs);if sum(abs(xs-xvs))<prec

breakendif

endwhile

Mostra o progresso do cálculo indicando os valores correntes (ver função disp) (opcional)

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

Ludwig Krippahl, 2008 57

Minimização multidimensional

while truexvs=xs;for f=1:length(xs)

xs(f)=minfnvec(funcao,params,xs,f,prec);endfordisp("Valores até agora:")disp(xs);if sum(abs(xs-xvs))<prec

breakendif

endwhile

Se o total da variação absoluta das variáveis é inferior à precisão, acabou.

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

Ludwig Krippahl, 2008 58

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)

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

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

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

Ludwig Krippahl, 2008 60

Crescimento bacteriano

function mat=crescimento(cresc,mort,dt,qini,tfinal)

Taxa de crescimento

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

Ludwig Krippahl, 2008 61

Crescimento bacteriano

function mat=crescimento(cresc,mort,dt,qini,tfinal)

Taxa de mortalidade

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

Ludwig Krippahl, 2008 62

Crescimento bacteriano

function mat=crescimento(cresc,mort,dt,qini,tfinal)

Passo de integração

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

Ludwig Krippahl, 2008 63

Crescimento bacteriano

function mat=crescimento(cresc,mort,dt,qini,tfinal)

Quantidade inicial de organismos.

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

Ludwig Krippahl, 2008 64

Crescimento bacteriano

function mat=crescimento(cresc,mort,dt,qini,tfinal)

Tempo final.

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

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

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

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.

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

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.

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

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

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

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.

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

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

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

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.

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

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,:)

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

Ludwig Krippahl, 2008 73

Crescimento bacteriano

Escolhemos um ponto inicial diferente, e minimizamos:

xs=multimin("errocres",dados,[0.05,0.005],1e-4)

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

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 offplot(dados(:,1),dados(:,2),"or");hold onplot(mat2(:,1),mat2(:,2));

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

Ludwig Krippahl, 2008 75

Crescimento bacteriano

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

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.

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

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.

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

Ludwig Krippahl, 2008 78

Processar dados experimentais

Os dados estão em 20 ficheiros 1.txt a 20.txtDados de crescimento

Meio:Normal

Preparador:Ana

25;0

59;1

...

296;40

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

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.

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

Ludwig Krippahl, 2008 80

Processar dados experimentais

Ler os ficheiros para uma lista de estruturas

function dados=leficheiros(num)

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

Ludwig Krippahl, 2008 81

Ler os ficheiros

dados=[];for f=1:num

fid=fopen([num2str(f),".txt"],"r");reg.valores=[];while !feof(fid)

...endwhiledados(f)=reg;fclose(fid);

endfor

Percorre o número indicado de ficheiros numero.txt

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

Ludwig Krippahl, 2008 82

Ler os ficheiros

dados=[];for f=1:num

fid=fopen([num2str(f),".txt"],"r");reg.valores=[];while !feof(fid)

...endwhiledados(f)=reg;fclose(fid);

endfor

Matriz para os valores neste ficheiro

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

Ludwig Krippahl, 2008 83

Ler os ficheiros

dados=[];for f=1:num

fid=fopen([num2str(f),".txt"],"r");reg.valores=[];while !feof(fid)

...endwhiledados(f)=reg;fclose(fid);

endfor

Ler o ficheiro

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

Ludwig Krippahl, 2008 84

Ler os ficheiros

dados=[];for f=1:num

fid=fopen([num2str(f),".txt"],"r");reg.valores=[];while !feof(fid)

...endwhiledados(f)=reg;fclose(fid);

endfor

Acrescenta registo à lista e fecha o ficheiro

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

Ludwig Krippahl, 2008 85

Ler os ficheiross=fgetl(fid);if !isstr(s)

breakendifif 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).

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

Ludwig Krippahl, 2008 86

Ler os ficheiross=fgetl(fid);if !isstr(s)

breakendifif !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)

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

Ludwig Krippahl, 2008 87

Ler os ficheiross=fgetl(fid);if !isstr(s)

breakendifif !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)

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

Ludwig Krippahl, 2008 88

Ler os ficheiross=fgetl(fid);if !isstr(s)

breakendifif !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.

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

Ludwig Krippahl, 2008 89

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

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

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)

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

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.

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

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

endifendfor

Se é este o meio ou preparador, ou se “”, acrescenta.

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

Ludwig Krippahl, 2008 93

Organizar os dados

Exemplo: todos os dados

l=leficheiros(20);

dados=compiladados(l,"","");

clearplot;

plot(dados(:,1),dados(:,2),"o");

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

Ludwig Krippahl, 2008 94

Organizar os dados

Exemplo: todos os dados

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

Ludwig Krippahl, 2008 95

Organizar os dados

Exemplos: separados por meio

dmet=compiladados(l,"","Meticilina");dsem=compiladados(l,"","Normal");clearplothold onplot(dmet(:,1),dmet(:,2),"or;Meticilina;");plot(dsem(:,1),dsem(:,2),"xg;Normal;");

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

Ludwig Krippahl, 2008 96

Organizar os dados

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

Ludwig Krippahl, 2008 97

Organizar os dados

Exemplos: separados por preparador

ana=compiladados(l,"Ana","");carlos=compiladados(l,"Carlos","");clearplothold onplot(ana(:,1),ana(:,2),"or;Ana;");plot(carlos(:,1),carlos(:,2),"xg;Carlos;");

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

Ludwig Krippahl, 2008 98

Organizar os dados

Exemplos: separados por preparador

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

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);

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

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);

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

Ludwig Krippahl, 2008 101

Ajustar o modelo

E comparamos os dados com a simulação:

clearplothold onplot(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;");

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

Ludwig Krippahl, 2008 102

Ajustar o modelo

Compara-se no gráfico:

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

Ludwig Krippahl, 2008 103

Exportar o resultado

Escrita formatada: fprintffprintf(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)

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

Ludwig Krippahl, 2008 104

Exportar o resultado

fprintf(fid,"%i\t%i\n",mat’)

%i indica que é um número inteiro.

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

Ludwig Krippahl, 2008 105

Exportar o resultado

fprintf(fid,"%i\t%i\n",mat’)

\t é o caracter tab.

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

Ludwig Krippahl, 2008 106

Exportar o resultado

fprintf(fid,"%i\t%i\n",mat’)

\n indica uma nova linha.

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

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: \\, %%

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

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.

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

Ludwig Krippahl, 2008 109

Trabalho 2

O trabalho 2 é parecido.• Ler os ficheiros com dados e modelos.

• Ajustar as constantes.

• Exportar resultados

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

Ludwig Krippahl, 2008 110

Trabalho 2

Reacções:1: A B

2: 2A B

3: 2A B

4: A BB C

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

Ludwig Krippahl, 2008 111

Trabalho 2

Ficheiros:Modelo 1

0.68 0.87 0.15

2.01 0.66 0.36

3.63 0.49 0.51

4.73 0.35 0.67

Modelo desta reacção

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

Ludwig Krippahl, 2008 112

Trabalho 2

Ficheiros:Modelo 1

0.68 0.87 0.15

2.01 0.66 0.36

3.63 0.49 0.51

4.73 0.35 0.67

Tempos

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

Ludwig Krippahl, 2008 113

Trabalho 2

Ficheiros:Modelo 1

0.68 0.87 0.15

2.01 0.66 0.36

3.63 0.49 0.51

4.73 0.35 0.67

[A]

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

Ludwig Krippahl, 2008 114

Trabalho 2

Ficheiros:Modelo 1

0.68 0.87 0.15

2.01 0.66 0.36

3.63 0.49 0.51

4.73 0.35 0.67

[B]

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

Ludwig Krippahl, 2008 115

Trabalho 2

Primeira tarefa• Ler os ficheiros (estruturas?)

• Calcular as constantes que ajustam o modelo aos dados de cada ficheiro

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

Ludwig Krippahl, 2008 116

Trabalho 2

Segunda tarefa• Gravar o relatório com todos (report.txt)

• Gravar os relatórios dos modelos (modelo1.txt, ...)

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

Ludwig Krippahl, 2008 117

Trabalho 2

Gravar o relatório com todos (report.txt)1 1 0.000477 0.203251

2 2 0.000150 0.304144

3 3 0.000278 0.213252 0.108541

4 4 0.000258 0.203253 0.307969

5 1 0.000194 0.205613

6 2 0.000091 0.304144

7 3 0.000142 0.199433 0.093819

Número do ficheiro

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

Ludwig Krippahl, 2008 118

Trabalho 2

Gravar o relatório com todos (report.txt)1 1 0.000477 0.203251

2 2 0.000150 0.304144

3 3 0.000278 0.213252 0.108541

4 4 0.000258 0.203253 0.307969

5 1 0.000194 0.205613

6 2 0.000091 0.304144

7 3 0.000142 0.199433 0.093819

Modelo

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

Ludwig Krippahl, 2008 119

Trabalho 2

Gravar o relatório com todos (report.txt)1 1 0.000477 0.203251

2 2 0.000150 0.304144

3 3 0.000278 0.213252 0.108541

4 4 0.000258 0.203253 0.307969

5 1 0.000194 0.205613

6 2 0.000091 0.304144

7 3 0.000142 0.199433 0.093819

Erro, depois de ajustado

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

Ludwig Krippahl, 2008 120

Trabalho 2

Gravar o relatório com todos (report.txt)1 1 0.000477 0.203251

2 2 0.000150 0.304144

3 3 0.000278 0.213252 0.108541

4 4 0.000258 0.203253 0.307969

5 1 0.000194 0.205613

6 2 0.000091 0.304144

7 3 0.000142 0.199433 0.093819

Constantes

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

Ludwig Krippahl, 2008 121

Trabalho 2

Gravar ficheiros para cada modelo0.206087 0.280261

0.590000 0.890000 0.120000

1.240000 0.790000 0.200000

1.920000 0.680000 0.250000

2.580000 0.540000 0.290000

3.530000 0.510000 0.310000

4.150000 0.440000 0.290000

Constantes

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

Ludwig Krippahl, 2008 122

Trabalho 2

Gravar ficheiros para cada modelo0.206087 0.280261

0.590000 0.890000 0.120000

1.240000 0.790000 0.200000

1.920000 0.680000 0.250000

2.580000 0.540000 0.290000

3.530000 0.510000 0.310000

4.150000 0.440000 0.290000

Dados

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

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.

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

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)

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

Ludwig Krippahl, 2008 125

Dúvidas