Post on 17-Apr-2015
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.
Ludwig Krippahl, 2008 3
Crescimento bacteriano
Equação de Verhulst:
dB/dt = cB – mB2
Ludwig Krippahl, 2008 4
Crescimento bacteriano
Equação de Verhulst:
dB/dt = cB – mB2
Variação do número de organismos
Ludwig Krippahl, 2008 5
Crescimento bacteriano
Equação de Verhulst:
dB/dt = cB – mB2
É o ritmo de crescimento vezes o número de organismos
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.
Ludwig Krippahl, 2008 7
Crescimento bacteriano
Ludwig Krippahl, 2008 8
Crescimento bacteriano
Problema:• Dado um conjunto de medições, ajustar os
parâmetros da equação
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.
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
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.
Ludwig Krippahl, 2008 12
Minimização multidimensionalPonto inicial
Ludwig Krippahl, 2008 13
Minimização multidimensionalPonto inicial
Mínimo de X
Ludwig Krippahl, 2008 14
Minimização multidimensionalPonto inicial
Mínimo de X
Mínimo de Y
Ludwig Krippahl, 2008 15
Minimização multidimensionalPonto inicial
Mínimo de X
Mínimo de Y
Novo mínimo de X
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.
Ludwig Krippahl, 2008 17
Os 3 pontos iniciais
X1 é o ponto dado
Ludwig Krippahl, 2008 18
Os 3 pontos iniciais
X1
Xm próximo de X1
Ludwig Krippahl, 2008 19
Os 3 pontos iniciais
X1
Xm próximo de X1Desce?
Se não, troca
Ludwig Krippahl, 2008 20
Os 3 pontos iniciais
X1
Xm
X2 a 1.618*(Xm-X1)
Ludwig Krippahl, 2008 21
Os 3 pontos iniciais
X1
Xm
X2
Y2>Ym?
Não, continua:
X1=Xm
Xm=X2
Ludwig Krippahl, 2008 22
Os 3 pontos iniciais
X1
Xm
Y2>Ym?
Não, continua:
X1=Xm
Xm=X2
Ludwig Krippahl, 2008 23
Os 3 pontos iniciais
X1
Xm
Y2>Ym?
Não, continua:
X1=Xm
Xm=X2
X2
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
Ludwig Krippahl, 2008 25
Os 3 pontos iniciais
function [x1,xm,x2,ym]=
mininicial(funcao,params,vars,indice,delta)
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.
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
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)
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)
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).
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
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
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
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.
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).
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.
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,
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)
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.
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.
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.
Ludwig Krippahl, 2008 42
Minimização multidimensional
function
xm=minfnvec(func,params,vars,indice,prec)
Índice da variável onde procurar o mínimo.
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)
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.
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);
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).
Ludwig Krippahl, 2008 47
Minimização multidimensional
Precisamos de:
function xs=multimin(funcao,params,xs,prec)
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
Ludwig Krippahl, 2008 49
Minimização multidimensional
function xs=multimin(funcao,params,xs,prec)
Nome da função a minimizar.
Ludwig Krippahl, 2008 50
Minimização multidimensional
function xs=multimin(funcao,params,xs,prec)
Parâmetros constantes...
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)
Ludwig Krippahl, 2008 52
Minimização multidimensional
function xs=multimin(funcao,params,xs,prec)
Precisão
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.
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
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
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)
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.
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)
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
Ludwig Krippahl, 2008 60
Crescimento bacteriano
function mat=crescimento(cresc,mort,dt,qini,tfinal)
Taxa de crescimento
Ludwig Krippahl, 2008 61
Crescimento bacteriano
function mat=crescimento(cresc,mort,dt,qini,tfinal)
Taxa de mortalidade
Ludwig Krippahl, 2008 62
Crescimento bacteriano
function mat=crescimento(cresc,mort,dt,qini,tfinal)
Passo de integração
Ludwig Krippahl, 2008 63
Crescimento bacteriano
function mat=crescimento(cresc,mort,dt,qini,tfinal)
Quantidade inicial de organismos.
Ludwig Krippahl, 2008 64
Crescimento bacteriano
function mat=crescimento(cresc,mort,dt,qini,tfinal)
Tempo final.
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
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.
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.
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...
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.
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....
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.
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,:)
Ludwig Krippahl, 2008 73
Crescimento bacteriano
Escolhemos um ponto inicial diferente, e minimizamos:
xs=multimin("errocres",dados,[0.05,0.005],1e-4)
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));
Ludwig Krippahl, 2008 75
Crescimento bacteriano
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.
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.
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
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.
Ludwig Krippahl, 2008 80
Processar dados experimentais
Ler os ficheiros para uma lista de estruturas
function dados=leficheiros(num)
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
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
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
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
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).
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)
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)
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.
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] = ...
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)
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.
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.
Ludwig Krippahl, 2008 93
Organizar os dados
Exemplo: todos os dados
l=leficheiros(20);
dados=compiladados(l,"","");
clearplot;
plot(dados(:,1),dados(:,2),"o");
Ludwig Krippahl, 2008 94
Organizar os dados
Exemplo: todos os dados
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;");
Ludwig Krippahl, 2008 96
Organizar os dados
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;");
Ludwig Krippahl, 2008 98
Organizar os dados
Exemplos: separados por preparador
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);
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);
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;");
Ludwig Krippahl, 2008 102
Ajustar o modelo
Compara-se no gráfico:
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)
Ludwig Krippahl, 2008 104
Exportar o resultado
fprintf(fid,"%i\t%i\n",mat’)
%i indica que é um número inteiro.
Ludwig Krippahl, 2008 105
Exportar o resultado
fprintf(fid,"%i\t%i\n",mat’)
\t é o caracter tab.
Ludwig Krippahl, 2008 106
Exportar o resultado
fprintf(fid,"%i\t%i\n",mat’)
\n indica uma nova linha.
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: \\, %%
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.
Ludwig Krippahl, 2008 109
Trabalho 2
O trabalho 2 é parecido.• Ler os ficheiros com dados e modelos.
• Ajustar as constantes.
• Exportar resultados
Ludwig Krippahl, 2008 110
Trabalho 2
Reacções:1: A B
2: 2A B
3: 2A B
4: A BB C
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
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
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]
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]
Ludwig Krippahl, 2008 115
Trabalho 2
Primeira tarefa• Ler os ficheiros (estruturas?)
• Calcular as constantes que ajustam o modelo aos dados de cada ficheiro
Ludwig Krippahl, 2008 116
Trabalho 2
Segunda tarefa• Gravar o relatório com todos (report.txt)
• Gravar os relatórios dos modelos (modelo1.txt, ...)
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
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
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
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
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
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
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.
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)
Ludwig Krippahl, 2008 125
Dúvidas