ludwig krippahl, 2007 programação para as ciências experimentais 2006/7 teórica 4

Post on 17-Apr-2015

106 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Ludwig Krippahl, 2007

Programação para as Ciências Experimentais

2006/7

Teórica 4

Ludwig Krippahl, 2007 2

Na aula de hoje...

Revisão:• function, if, for, while

Encontrar o zero de um polinómio• Precisão, representação de valores numéricos

Encontrar o zero de uma função contínua Encontrar o mínimo de uma função contínua

Ludwig Krippahl, 2007 3

Funções

Para usar a função Se retorna uma variável:

x = funcaoqq(arg1, arg2) Se retorna mais que uma:

[x,y,z] = outrafn(arg1, arg2)

Ludwig Krippahl, 2007 4

Funções

O que o Octave faz• funcaoqq – não há nada com este nome em

memória.

• Procura ficheiro funcaoqq.m

• Nesse ficheiro executa a função

Ludwig Krippahl, 2007 5

Funções

O que nós fazemos• Criamos o ficheiro funcaoqq.m

• Nesse ficheiro declaramos a função:

function res=funcaoqq(arg1,arg2)....

endfunction

Ludwig Krippahl, 2007 6

Funções

function res = funcaoqq( arg1 , arg2 )

Indica que é a declaração de uma função.

Ludwig Krippahl, 2007 7

Funções

function res = funcaoqq( arg1 , arg2 )

Nome da variável com o valor a devolver

Ludwig Krippahl, 2007 8

Funções

function [res1, res2] = funcaoqq( arg1 ..

Se devolve vários valores, usamos um vector de variáveis

Ludwig Krippahl, 2007 9

Funções

function res = funcaoqq( arg1 , arg2 )

Variáveis (locais) para onde são copiados os valores dados à função como argumentos

Ludwig Krippahl, 2007 10

Funções

function res = funcaoqq( arg1 , arg2 )

endfunction

Todas a variáveis declaradas aqui e no corpo da função são locais. Só existem dentro da função e não afectam nem são afectadas por variáveis externas.

Ludwig Krippahl, 2007 11

Controlo de execução: if

if condição

else

endif

Isto é executado se a condição for verdadeira (não for 0)

Isto é executado se a condição for false (0). O else é opcional

Ludwig Krippahl, 2007 12

Controlo de execução: while

while condição

endwhile

Executado enquanto a condição for verdadeira (não for 0).

É preciso garantir que dentro do ciclo o valor da condição muda, senão o ciclo não acaba...

Ludwig Krippahl, 2007 13

Controlo de execução: while

for var=vector

endfor

Esta parte é repetida uma vez para cada valor no vector.

A variável var toma cada um dos valores do vector a cada iteração.

Ludwig Krippahl, 2007 14

Função: polinomio

Polinómio:

Y= k1 + k2*x + k3*x2 + k4*x3 ...

Ludwig Krippahl, 2007 15

Função: polinomio

Polinómio:

Y= k1 + k2*x + k3*x2 + k4*x3 ...

Coeficientes num vector:

[ k1 , k2 , k3 , k4 ... ]

Ludwig Krippahl, 2007 16

Função: polinomio

function y=polinomio(coefs,x)

xx=x;

y=coefs(1);

for f=2:length(coefs)

y=y+coefs(f)*xx; indentação, torna

xx=x*xx; mais legível.

endfor

endfunction

Ludwig Krippahl, 2007 17

Função: polinomio

function y=polinomio(coefs,x)

xx=x;

y=coefs(1);

for f=2:length(coefs)

y=y+coefs(f)*xx; Erro se x for um

xx=x*xx; vector.

endfor

endfunction

Ludwig Krippahl, 2007 18

Função: polinomio

function y=polinomio(coefs,x)

xx=x;

y=coefs(1);

for f=2:length(coefs)

y=y+coefs(f)*xx; já funciona com

xx=x.*xx; vectores

endfor

endfunction

Ludwig Krippahl, 2007 19

Função: polinomio (exemplos)

Calcular o valor de • y = 2+3x-x2 para x=3

octave:16> polinomio([2,3,-1],3)

ans = 2

Traçar o gráfico de• y = 2+3x-x2 entre -10 e 10:

• plot(-10:10, polinomio([2,3,-1], -10:10))

Ludwig Krippahl, 2007 20

Uma raiz de um polinómio

Método da bissecção.

Ludwig Krippahl, 2007 21

Uma raiz de um polinómio

y = 0.3+x – x2 + x3

x = -0.23309

Ludwig Krippahl, 2007 22

Uma raiz de um polinómio

Começamos com um intervalo que inclui o zero: [-1,1]

Ludwig Krippahl, 2007 23

Uma raiz de um polinómio

Começamos com um intervalo que inclui o zero: [-1,1]

Os extremos têm sinal diferente:

-

+

Ludwig Krippahl, 2007 24

-

+

Uma raiz de um polinómio

Dividir ao meio: (-1 +1)/2 = 0

Ludwig Krippahl, 2007 25

-

+

Uma raiz de um polinómio

Calculamos y(0)= 0.3+

Ludwig Krippahl, 2007 26

- +

Uma raiz de um polinómio

Calculamos y(0)= 0.3

O intervalo com sinais opostos nos extremos contém o zero

+

Ludwig Krippahl, 2007 27

- +

Uma raiz de um polinómio

+-

Ludwig Krippahl, 2007 28

- +

Uma raiz de um polinómio

+- -

Ludwig Krippahl, 2007 29

Uma raiz de um polinómio

Quando paramos?• Quando o intervalo for pequeno

• Quando no ponto médio y próximo de 0.

• Precisão.

Ludwig Krippahl, 2007 30

Uma raiz de um polinómio

Algoritmo:• Dado: x1, x2, precisão

• Enquanto abs(x2-x1)>precisão repetir• ym = valor no ponto médio xm

• Se abs(ym)<precisão, pára

• Caso contrário, escolhe o intervalo x1,xm ou xm,x2 onde os sinais sejam opostos

Ludwig Krippahl, 2007 31

Representação de números

A que precisão podemos ir?

Ludwig Krippahl, 2007 32

Representação de números

Um número no Octave é representado com 64 bits (double precision):• Sinal (+, -) : 1 bit

• Expoente: 11 bits

• Mantissa: 52 bits

(sinal) mantissa * 2 expoente

Ludwig Krippahl, 2007 33

Representação de números

• Expoente: 11 bits,

• Mantissa: 52 bits

• (sinal) mantissa * 2 expoente

Máximo valor:• 1.7977x 10308 (realmax, 1.7977e308 )

Precisão (épsilon)• 2.2204x 10-16 (eps, 2.2204e-16)

Ludwig Krippahl, 2007 34

Representação de números

Precisão (épsilon)• 2.2204x 10-16 (eps, 2.2204e-16)

• O menor número que somado a 1 dá um resultado diferente de 1:

octave:17> (1+eps)==1

ans = 0

octave:18> (1+eps/2)==1

ans = 1

Ludwig Krippahl, 2007 35

Representação de números

Importante:• Todos os dados no computador são

sequências de bits.

• A memória é limitada (64 bits para os números), por isso a precisão é limitada.

• Normalmente não há problema, mas atenção aos arredondamentos:

octave:20> sqrt(2)^2==2ans = 0

Ludwig Krippahl, 2007 36

O zero de uma função

Suponhamos que uma função y=f(x) pode ser especificada por um vector de parâmetros (constantes) e pelo nome.

e.g:

function y=polinomio(coefs,x)

Ludwig Krippahl, 2007 37

O zero de uma função

A nossa função genérica será. y = nome(params,x)

Para a função que encontra o zero temos que enviar o nome, os parâmetros, o intervalo, e a precisão.

function xm=zerofn(func,params,x1,x2,prec)

Ludwig Krippahl, 2007 38

O zero de uma função

Para avaliar a função func usamos a função do Octave feval:

feval(nome,arg1,arg2, arg3) é o mesmo que

nome(arg1, arg2, arg3)

octave:22> sin(1)

ans = 0.84147

octave:23> feval("sin",1)

ans = 0.84147

Ludwig Krippahl, 2007 39

O zero de uma função

Em vez de:

y1=polinomio(coefs,x1);

y2=polinomio(coefs,x2); Fica

y1=feval(func,params,x1);

y2=feval(func,params,x2);

Ludwig Krippahl, 2007 40

O zero de uma função

Para calcular uma raíz do polinómio:• z=zerofn("polinomio",coefs,-1,1,0.0001)

Ludwig Krippahl, 2007 41

O mínimo de uma função

Método da razão dourada

Ludwig Krippahl, 2007 42

O mínimo de uma função

Tal como “encurralámos” a raiz num intervalo, vamos fazer o mesmo com o mínimo, mas precisamos de 3 pontos:

a

b

c

Ludwig Krippahl, 2007 43

O mínimo de uma função

Se x1<x2<x3 e y2<y1 e y2<y3 então tem que haver um mínimo local entre x1 e x3

x1 x2 x3

Ludwig Krippahl, 2007 44

O mínimo de uma função

O algoritmo é (novamente) partir os intervalos, testar, e repetir até que seja suficientemente pequeno

x1 x2 x3

Ludwig Krippahl, 2007 45

O mínimo de uma função

O algoritmo é (novamente) partir os intervalos, testar, e repetir até que seja suficientemente pequeno

x1 x2 x3

Ludwig Krippahl, 2007 46

O mínimo de uma função

O algoritmo é (novamente) partir os intervalos, testar, e repetir até que seja suficientemente pequeno

x1 x2 x3

Ludwig Krippahl, 2007 47

O mínimo de uma função

O algoritmo é (novamente) partir os intervalos, testar, e repetir até que seja suficientemente pequeno

x1 x2 x3

Ludwig Krippahl, 2007 48

O mínimo de uma função

O algoritmo é (novamente) partir os intervalos, testar, e repetir até que seja suficientemente pequeno

x1 x2 x3

Ludwig Krippahl, 2007 49

O mínimo de uma função

O algoritmo é (novamente) partir os intervalos, testar, e repetir até que seja suficientemente pequeno

x1 x2 x3

Ludwig Krippahl, 2007 50

O mínimo de uma função

O algoritmo é (novamente) partir os intervalos, testar, e repetir até que seja suficientemente pequeno

x1 x2 x3

Ludwig Krippahl, 2007 51

O mínimo de uma função

O algoritmo é (novamente) partir os intervalos, testar, e repetir até que seja suficientemente pequeno

x1 x2 x3

Ludwig Krippahl, 2007 52

O mínimo de uma função

O algoritmo é (novamente) partir os intervalos, testar, e repetir até que seja suficientemente pequeno

x1 x2 x3

Ludwig Krippahl, 2007 53

O mínimo de uma função

Guardar sempre os 3 pontos consecutivos em que o do meio é menor que os extremos.

x1 x2 x3

Ludwig Krippahl, 2007 54

O mínimo de uma função

Como dividir o intervalo:• O ideal é manter as proporções. Dividir ao

meio não é bom.

x1 x2 x3

Ludwig Krippahl, 2007 55

O mínimo de uma função

Como dividir o intervalo:

x1 x2 x3x4 x5

Ludwig Krippahl, 2007 56

O mínimo de uma função

Como dividir o intervalo:• Escolher o ponto novo no intervalo maior e

• Partir pela razão dourada:

(a+b)/a = a / b

a= 0.618 (a+b)

b= (1-0.618) (a+b)

Ludwig Krippahl, 2007 57

O mínimo de uma função

Detalhes:• Escolher o lado maior

• if abs(x1-xm)>abs(x2-xm)

• false, lado maior xm x2

x1 x2xm

Ludwig Krippahl, 2007 58

O mínimo de uma função

Detalhes:• Calcular novo ponto xn (c1=0.618; c2=1-c1)

• xn=c1*xm+c2*x2

x1 x2xm xn

Ludwig Krippahl, 2007 59

O mínimo de uma função

Detalhes:• Calcular yn=f(xn)

• yn=feval(func,params,xn);

x1 x2xm xn

Ludwig Krippahl, 2007 60

O mínimo de uma função

Detalhes:• se yn<xn, xn será o novo xm, e xm o novo x1

• ym=yn

• x1=xm

• xm=xn

x1 x2xm xn

Ludwig Krippahl, 2007 61

O mínimo de uma função

Detalhes:• caso contrário xn será o novo x2

x1 x2xm xn

Ludwig Krippahl, 2007 62

O mínimo de uma função

Se o lado maior for entre x1 e xm, mesma coisa, mas trocando o x1 e o x2...

Ludwig Krippahl, 2007 63

O mínimo de uma função

Como podemos seguir o cálculo: guardar o xn e yn num vector (pontos).

function [xm,pontos]=minfnpts(func,params,x1,xm,x2,prec)

...

guardar os 3 pontos iniciais:

y1=feval(func,params,x1);

y2=feval(func,params,x2);

ym=feval(func,params,xm);

pontos=[x1,x2,xm;y1,y2,ym];

Ludwig Krippahl, 2007 64

O mínimo de uma função

Como podemos seguir o cálculo: guardar o xn e yn num vector (pontos).

while abs(x2-x1)>prec

...

...

durante o ciclo guardar cada xn, yn:

pontos=[pontos,[xn;yn]];

Ludwig Krippahl, 2007 65

O mínimo de uma função Como podemos seguir o cálculo: guardar o xn e yn num

vector (pontos).

Depois de chamada a função, fazer o plot:

coefs=[0.3,-5,1]v=-10:10;clearplotplot(v,polinomio(coefs,v)); traça o polinómio[x,p]=minfnpts("polinomio",coefs,-10,0,10,0.001)hold onplot(p(1,:),p(2,:),"+") traça os pontos

Ludwig Krippahl, 2007 66

O mínimo de uma função

Ludwig Krippahl, 2007 67

Mais informação:

Numerical Recipes http://www.nrbook.com/a/bookcpdf.php Raiz: 9.1 Mínimo: 10.1

Ludwig Krippahl, 2007 68

Próxima aula:

Apresentação do trabalho prático:• A partir de uma lista de strings com equações

de reacções químicas, constantes de equilíbrio, e concentrações iniciais, calcular as concentrações de equilíbrio de todas as espécies tendo em conta todas as reacções.

Revisões• function, if, while, for: muito importante ter isto

bem sabido...

Ludwig Krippahl, 2007 69

Dúvidas...

top related