1.12k likes | 1.23k Views
Programação para as Ciências Experimentais 2006/7. Teórica 9. Na aula de hoje. Minimização multidimensional Leitura e escrita formatada de ficheiros. Introdução à folha de cálculo (Excel) Exemplo: estimativa do efeito de um antibiótico no crescimento bacteriano. Crescimento bacteriano.
E N D
Programação para as Ciências Experimentais2006/7 Teórica 9 Ludwig Krippahl, 2007
Na aula de hoje... • Minimização multidimensional • Leitura e escrita formatada de ficheiros. • Introdução à folha de cálculo (Excel) • Exemplo: estimativa do efeito de um antibiótico no crescimento bacteriano.
Crescimento bacteriano • Equação de Verhulst: dB/dt = cB – mB2
Crescimento bacteriano • Equação de Verhulst: dB/dt = cB – mB2 Variação do número de organismos
Crescimento bacteriano • Equação de Verhulst: dB/dt = cB – mB2 É o ritmo de crescimento vezes o número de organismos
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.
Crescimento bacteriano • Problema: • Dado um conjunto de medições, ajustar os parâmetros da equação
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.
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 • Análogo ao método usado no trabalho 1
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.
Minimização multidimensional Ponto inicial
Minimização multidimensional Ponto inicial Mínimo de X
Minimização multidimensional Ponto inicial Mínimo de X Mínimo de Y
Minimização multidimensional Ponto inicial Mínimo de X Novo mínimo de X Mínimo de Y
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.
Os 3 pontos iniciais X1 é o ponto dado
Os 3 pontos iniciais X1 Xm próximo de X1
Os 3 pontos iniciais X1 Desce? Se não, troca Xm próximo de X1
Os 3 pontos iniciais X1 Xm X2 a 1.618*(Xm-X1)
Os 3 pontos iniciais X1 Y2>Ym? Não, continua: X1=Xm Xm=X2 Xm X2
Os 3 pontos iniciais Y2>Ym? Não, continua: X1=Xm Xm=X2 X1 Xm
Os 3 pontos iniciais Y2>Ym? Não, continua: X1=Xm Xm=X2 X1 Xm X2
Os 3 pontos iniciais Y2>Ym? Sim.Devolve: X1 Xm X2 Ym (Ym para começar a minimização) X2 X1 Xm
Os 3 pontos iniciais function [x1,xm,x2,ym]= mininicial(funcao,params,vars,indice,delta)
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.
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
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)
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)
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).
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
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
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
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.
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).
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 sege para valores menores.
Os 3 pontos iniciais while y2<ym x1=xm; xm=x2; ym=y2; x2=xm+razaod*(xm-x1); vars(indice)=x2; y2=feval(funcao,params,vars); endwhile Enquanto continua “a descer”, avança com os pontos,
Minimização • Antes era: function xm=minfn(func,params,x1,xm,x2,prec) • Agora é: function xm=minfnvec(func,params,vars,indice,prec)
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.
Minimização multidimensional function xm=minfnvec(func,params,vars,indice,prec) Função (o nome, em string) e parâmetros constantes, como de costume.
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.
Minimização multidimensional function xm=minfnvec(func,params,vars,indice,prec) Índice da variável onde procurar o mínimo.
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)
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.
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);
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).
Minimização multidimensional • Precisamos de: function xs=multimin(funcao,params,xs,prec)
Minimização multidimensional functionxs=multimin(funcao,params,xs,prec) Vector com os valores de todas as variáveis no mínimo da função
Minimização multidimensional function xs=multimin(funcao,params,xs,prec) Nome da função a minimizar.
Minimização multidimensional function xs=multimin(funcao,params,xs,prec) Parâmetros constantes...