ludwig krippahl, 2009 programação para as ciências experimentais 2008/9 teórica 4

61
Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Upload: internet

Post on 17-Apr-2015

105 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009

Programação para as Ciências Experimentais

2008/9

Teórica 4

Page 2: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 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 Ler e escrever ficheiros

Page 3: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 3

Funções

Para usar a função Se devolve um valor:

x = funcaoqq(arg1, arg2) Se devolve mais que um:

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

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

Ludwig Krippahl, 2009 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

Não declarem funções em memória

Page 5: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 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

Page 6: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 6

Funções

function res = funcaoqq( arg1 , arg2 )

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

Page 7: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 7

Funções

function res = funcaoqq( arg1 , arg2 )

Nome da variável com o valor a devolver

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

Ludwig Krippahl, 2009 8

Funções

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

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

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

Ludwig Krippahl, 2009 9

Funções

function res = funcaoqq( arg1 , arg2 )

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

Page 10: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 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.

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

Ludwig Krippahl, 2009 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

Page 12: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 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...

Page 13: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 13

Controlo de execução: for

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.

Page 14: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 14

Função: polinomio

Polinómio:

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

Page 15: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 15

Função: polinomio

Polinómio:

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

Coeficientes num vector:

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

Page 16: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 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

Page 17: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 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

Page 18: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 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

Page 19: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 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))

Page 20: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 20

Função: polinomio (exemplos)

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

Page 21: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 21

Uma raiz de um polinómio

Método da bissecção.

Page 22: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 22

Uma raiz de um polinómio

y = 0.3+x – x2 + x3

x = -0.23309

Page 23: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 23

Uma raiz de um polinómio

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

Page 24: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 24

Uma raiz de um polinómio

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

Os extremos têm sinal diferente:

-

+

Page 25: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 25

-

+

Uma raiz de um polinómio

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

Page 26: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 26

-

+

Uma raiz de um polinómio

Calculamos y(0)= 0.3+

Page 27: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 27

- +

Uma raiz de um polinómio

Calculamos y(0)= 0.3

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

+

Page 28: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 28

- +

Uma raiz de um polinómio

+-

Page 29: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 29

- +

Uma raiz de um polinómio

+- -

Page 30: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 30

Uma raiz de um polinómio

Quando paramos?• Quando o intervalo for pequeno

• Precisão.

Page 31: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 31

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

• Escolhe o intervalo x1,xm ou xm,x2 onde os sinais sejam opostos

Page 32: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 32

Uma raiz de um polinómio

function xm=zeropol(coefs,x1,x2,prec)

Argumentos:CoeficientesIntervaloPrecisão

....endfunction

Page 33: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 33

Uma raiz de um polinómio

function xm=zeropol(coefs,x1,x2,prec)

y1=polinomio(coefs,x1);

y2=polinomio(coefs,x2);

primeiro calcular y

nos extremos

....

endfunction

Page 34: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 34

Uma raiz de um polinómio

while abs(x1-x2)>prec enquanto não termina xm=(x1+x2)/2; calcula o ponto médio ym=polinomio(coefs,xm); if y1*ym<0 x2=xm; se o 0 está na primeira metade y2=ym; desloca o ponto 2 else x1=xm; caso contrário y1=ym; desloca o ponto 1 endif endwhile

Page 35: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 35

Uma raiz de um polinómio

O resultado é o ponto médio:

function xm=zeropol(coefs,x1,x2,prec)

...

endfunction

Page 36: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 36

Uma raiz de um polinómio

y = 0.3+x – x2 + x3

x = -0.23309 zeropol([0.3,1,-1,1],-1,1,0.01)

Page 37: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 37

Uma raiz de um polinómio

zeropol([0.3,1,-1,1],-1,1,0.01)

Page 38: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 38

Representação de números

A que precisão podemos ir?

Page 39: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 39

Representação de números

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

• Expoente: 11 bits

• Mantissa: 52 bits

(sinal) mantissa * 2 expoente

Page 40: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 40

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)

Page 41: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 41

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

Page 42: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 42

Representação de números

Exemplo:• Duas casas decimais:

• 1.00

• 1.00x10-3

• 1.00x10-6

• 1.00 + 1.00x10-3 = 1.00

• Epsilon = 0.01 (à parte de arredondamentos...)

Page 43: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 43

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

Page 44: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 44

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)

Page 45: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 45

O zero de uma função

A nossa função genérica será.

y = nome(params,x)

Page 46: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 46

O zero de uma função

A nossa função genérica será.

y = nome(params,x)

Exemplo:

y=sin(a*x)+b

function y=sinab(params,x)

y=sin(params(1)*x)+params(2);

endfunction

Page 47: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 47

O zero de uma função

Para avaliar uma função 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

Page 48: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 48

O zero de uma função

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

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

Page 49: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 49

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

Page 50: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 50

O zero de uma função

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

Page 51: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 51

Ficheiros

Para aceder a um ficheiro temos sempre de o identificar com um número correspondente ao ficheiro aberto.

Usamos a função fopen para abrir o ficheiro e obter o identificador, fclose para fechar e deixar livre o ficheiro para outras aplicações.

Page 52: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 52

Ficheiros

fopen(nome,modo [, arquitectura])• normalmente usamos só os primeiros dois

argumentos:

octave:7> teste=fopen("teste.txt","w")

teste = 3

Page 53: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 53

Ficheiros

fopen(nome,modo [, arquitectura])• normalmente usamos só os primeiros dois

argumentos:

octave:7> teste=fopen("teste.txt","w")

teste = 3

nome do ficheiro

Page 54: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 54

Ficheiros

fopen(nome,modo [, arquitectura])• normalmente usamos só os primeiros dois

argumentos:

octave:7> teste=fopen("teste.txt","w")

teste = 3

w: write, para escrita

r: read, para leitura

a: append, acrescentar

Page 55: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 55

Ficheiros

fopen(nome,modo [, arquitectura])• normalmente usamos só os primeiros dois

argumentos:

octave:7> teste=fopen("teste.txt","w")

teste = 3

Identificador

Page 56: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 56

Ficheiros

Escrever no ficheiro• fprintf(id,var)

• escreve o valor de var no ficheiro

• exemplo:

id=fopen(“teste.txt”,”w”)

fprintf(id,”qualquer coisa”)

fclose(id);

Page 57: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 57

Ficheiros

Ler dados de um ficheiro:• fgetl( identificador, comprimento)

• Lê uma linha do ficheiro identificado, ou o número de caracteres no comprimento.

• Se o comprimento é omitido, lê todos os caracteres até ao final da linha.

• Se não há mais linhas devolve -1.

Page 58: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 58

Ficheiros

Ler do ficheiro• exemplo:

id=fopen(“teste.txt”,”r”)

s=fgetl(id)

fclose(id);

(s fica com o valor “qualquer coisa”)

Page 59: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 59

Ficheiros

Sabemos que o ficheiro chegou ao fim com a função feof:• feof( identificador )

• Devolve true se o ficheiro estiver no fim.

Page 60: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 60

Resumindo:

Saber bem:• Funções

• Controlo de execução (if, while, for)

Hoje• Bissecção

• feval para poder enviar como argumento o nome de uma função.

• Ficheiros (fopen, identificador, fprintf, fgetl)

Page 61: Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4

Ludwig Krippahl, 2009 61

Mais informação:

Sobre o método da bissecção:• http://en.wikipedia.org/wiki/Bisection_method

Sobre ficheiros• Capítulo 14 do manual Octave