ludwig krippahl, 2008 programação para as ciências experimentais 2007/8 teórica 4
TRANSCRIPT
Ludwig Krippahl, 2008
Programação para as Ciências Experimentais
2007/8
Teórica 4
Ludwig Krippahl, 2008 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
Ludwig Krippahl, 2008 3
Funções
Para usar a função Se retorna uma variável:
x = funcaoqq(arg1, arg2) Se retorna mais que uma:
[x,y,y] = outrafn(arg1, arg2)
Ludwig Krippahl, 2008 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, 2008 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, 2008 6
Funções
function res = funcaoqq( arg1 , arg2 )
Indica que é a declaração de uma função.
Ludwig Krippahl, 2008 7
Funções
function res = funcaoqq( arg1 , arg2 )
Nome da variável com o valor a devolver
Ludwig Krippahl, 2008 8
Funções
function [res1, res2] = funcaoqq( arg1 ..
Se devolve vários valores, usamos um vector de variáveis
Ludwig Krippahl, 2008 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, 2008 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, 2008 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, 2008 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, 2008 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.
Ludwig Krippahl, 2008 14
Função: polinomio
Polinómio:
Y= k1 + k2*x + k3*x2 + k4*x3 ...
Ludwig Krippahl, 2008 15
Função: polinomio
Polinómio:
Y= k1 + k2*x + k3*x2 + k4*x3 ...
Coeficientes num vector:
[ k1 , k2 , k3 , k4 ... ]
Ludwig Krippahl, 2008 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, 2008 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, 2008 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, 2008 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, 2008 20
Função: polinomio (exemplos)
plot(-10:10, polinomio([2,3,-1], -10:10))
Ludwig Krippahl, 2008 21
Uma raiz de um polinómio
Método da bissecção.
Ludwig Krippahl, 2008 22
Uma raiz de um polinómio
y = 0.3+x – x2 + x3
x = -0.23309
Ludwig Krippahl, 2008 23
Uma raiz de um polinómio
Começamos com um intervalo que inclui o zero: [-1,1]
Ludwig Krippahl, 2008 24
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, 2008 25
-
+
Uma raiz de um polinómio
Dividir ao meio: (-1 +1)/2 = 0
Ludwig Krippahl, 2008 26
-
+
Uma raiz de um polinómio
Calculamos y(0)= 0.3+
Ludwig Krippahl, 2008 27
- +
Uma raiz de um polinómio
Calculamos y(0)= 0.3
O intervalo com sinais opostos nos extremos contém o zero
+
Ludwig Krippahl, 2008 28
- +
Uma raiz de um polinómio
+-
Ludwig Krippahl, 2008 29
- +
Uma raiz de um polinómio
+- -
Ludwig Krippahl, 2008 30
Uma raiz de um polinómio
Quando paramos?• Quando o intervalo for pequeno
• Precisão.
Ludwig Krippahl, 2008 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
Ludwig Krippahl, 2008 32
Uma raiz de um polinómio
function xm=zeropol(coefs,x1,x2,prec)
Argumentos:CoeficientesIntervaloPrecisão
....endfunction
Ludwig Krippahl, 2008 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
Ludwig Krippahl, 2008 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
Ludwig Krippahl, 2008 35
Uma raiz de um polinómio
O resultado é o ponto médio:
function xm=zeropol(coefs,x1,x2,prec)
...
endfunction
Ludwig Krippahl, 2008 36
Uma raiz de um polinómio
O resultado é o ponto médio:
function xm=zeropol(coefs,x1,x2,prec)
...
endfunction
Ludwig Krippahl, 2008 37
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)
Ludwig Krippahl, 2008 38
Uma raiz de um polinómio
zeropol([0.3,1,-1,1],-1,1,0.01)
Ludwig Krippahl, 2008 39
Representação de números
A que precisão podemos ir?
Ludwig Krippahl, 2008 40
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
Ludwig Krippahl, 2008 41
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, 2008 42
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, 2008 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
Ludwig Krippahl, 2008 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)
Ludwig Krippahl, 2008 45
O zero de uma função
A nossa função genérica será.
y = nome(params,x)
Ludwig Krippahl, 2008 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
Ludwig Krippahl, 2008 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
Ludwig Krippahl, 2008 48
O zero de uma função
Para a função que encontra o zero temos que 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)
Ludwig Krippahl, 2008 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);
Ludwig Krippahl, 2008 50
O zero de uma função
Para calcular uma raíz do polinómio:• z=zerofn("polinomio",coefs,-1,1,0.0001)
Ludwig Krippahl, 2008 51
Ficheiros
Para aceder a um ficheiro temos sempre que 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.
Ludwig Krippahl, 2008 52
Ficheiros
fopen(nome,modo [, arquitectura])• normalmente usamos só os primeiros dois
argumentos:
octave:7> teste=fopen("teste.txt","w")
teste = 3
Ludwig Krippahl, 2008 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
Ludwig Krippahl, 2008 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
Ludwig Krippahl, 2008 55
Ficheiros
fopen(nome,modo [, arquitectura])• normalmente usamos só os primeiros dois
argumentos:
octave:7> teste=fopen("teste.txt","w")
teste = 3
Identificador
Ludwig Krippahl, 2008 56
Ficheiros
fopen(nome,modo [, arquitectura])• normalmente usamos só os primeiros dois
argumentos:
octave:7> teste=fopen("teste.txt","w")
teste = 3
Identificador
Ludwig Krippahl, 2008 57
Ficheiros
Escrever no ficheiro• fprintf(id,var)
• escreve o valor de var no ficheiro
• exemplo:
id=fopen(“teste.txt”,”r”)
fprintf(id,”qualquer coisa”)
fclose(id);
Ludwig Krippahl, 2008 58
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.
Ludwig Krippahl, 2008 59
Ficheiros
Ler do ficheiro• exemplo:
id=fopen(“teste.txt”,”r”)
s=fgetl(id)
fclose(id);
(s fica com o valor “qualquer coisa”)
Ludwig Krippahl, 2008 60
Ficheiros
Sabemos que o ficheiro chegou ao fim com a função feof:• feof( identificador )
• Devolve true se o ficheiro estiver no fim.
Ludwig Krippahl, 2008 61
Mais informação:
Sobre o método para encontrar os zeros:• http://www.nrbook.com/a/bookcpdf.php
• Capítulo 9.1
Sobre ficheiros• Capítulo 14 do manual Octave