Você está na página 1de 6

Nesta aula. . .

Contedo
1

Mtodo de bisseces

Cadeias de caracteres

Mtodo de bisseces

Resoluo numrica de equaes


Problema: encontrar uma soluo x da equao
x3 5x + 2 = 0
Equivalente: encontrar zeros da funo
f (x) = x3 5x + 2
Polinmio do 3o grau: no tem uma frmula resolvente simples
Podemos obter aproximaes x1 , x2 , . . . tais que limn xn = x
Paramos quando o erro |x xn | for aceitvel
Mtodo de bisseces
Pr-condies:
f contnua em [a, b]
f (a) f (b) < 0 (f (a) e f (b) tm sinais opostos)
f tem uma raiz nica em [a, b]
Mtodo recursivo:
1. calculamos o ponto mdio m = (a + b)/2
2. se f (a) f (m) < 0: a raiz est em [a, m]
3. caso contrrio: a raiz est em [m, b]
4. repetir com o novo intervalo encontrado

Mtodo de bisseces

Mtodo de bisseces recursivo


def bissect(f, a, b, n):
"Efectuar n bisseces de f(x)=0 em [a,b]."
# calcula o ponto mdio
m = (a+b)/2.0
# terminou?
if n==0:
return m
# ponto mdio
# seno, parte o intervalo ao meio
if f(a)*f(m) < 0:
return bissect(f, a, m, n-1)
else:
return bissect(f, m, b, n-1)
Execuo
# equao x**3-5*x+2==0
def eq(x):
return x**3-5*x+2
# zero em [0,1]
>>> bissect(eq,
0.421875
# zero em [0,1]
>>> bissect(eq,
0.41455078125

com 5 iteraes
0.0, 1.0, 5)
com 10 iteraes
0.0, 1.0, 10)

# verificao
>>> eq(0.41455078125)
-0.0015123802004382014
Eliminar a recurso
chamadas recursivas apenas no final da funo
podem ser substitudas por iterao com um ciclo while
vantagem: reduz o uso de pilha de execuo (stack)
Mtodo de bisseces iterativo
def bissect(f, a, b, n):
"Efectua n bisseces de f(x)=0 em [a,b]."
while n>0:
m = (a+b)/2.0 # calcula o ponto mdio
# parte o intervalo ao meio
if f(a)*f(m) < 0:
b = m
else:
a = m
n = n-1
# fim do ciclo
# resultado o ponto mdio final
return m
# fim do programa
Exerccio
Seja x? a raz exacta e x a aproximao retornada pela funo. O erro da aproximao |x? x|.
Exerccio Escreva uma funo
bissect2(f,a,b,eps)
que retorna uma aproximao da raz da equao f (x) = 0 com um erro no superior
a eps.
Optimizar a implementao
reduzir o custo computacional do algoritmo
em cada iterao: calcula f trs vezes
podemos fazer melhor:

1. guardar f (a), f (b) e f (m) em f a, f b e f m


2. actualizamos as variveis de forma a manter invariantes as condies:

f a = f (a)
f b = f (b)

f m = f (m)
Mtodo de bisseces optimizado
def bissect(f, a, b, n):
"Efectua n bisseces de f(x)=0 em [a,b]."
fa = f(a)
# valores de f nos extremos
fb = f(b)
while n>0:
m = (a+b)/2.0 # calcula o ponto mdio
fm = f(m)
# valor de f no ponto mdio
.
.
.
.
.
.
# parte o intervalo ao meio
if fa*fm < 0:
b = m
fb = fm # manter invariante
else:
a = m
fa = fm # manter invariante
n = n-1
# menos uma iterao
# fim do ciclo
# resultado o ponto mdio final
return m
# fim do programa
Anlise do mtodo optimizado
em cada iterao: calcula f uma vez
reduzimos o custo de calcular f em 50%
vantagem: f pode ser uma expresso matemtica complexa
usamos apenas trs variveis extra
Sumrio
comear pela formulao abstracta do problema
fazer uma implementao simples e correcta
refinar a implementao passo-a-passo
4

Cadeias de caracteres

Cadeias de caracteres
compostas por caracteres individuais
podemos trat-las como um entidade nica
podemos tambm aceder aos caracteres individuais
>>>
>>>
B
>>>
a
>>>
n
>>>
6

fruta = Banana
fruta[0]
fruta[1]
fruta[2]
len(fruta)

ndices
str B
0

a
1

n
2

ndices: 0, 1, 2, 3, 4, 5
em geral: 0, 1, . . . , len(str)-1
caracteres: str[0], str[1], . . .
ltimo caracter: str[len(str)-1]
penltimo caracter: str[len(str)-2]
Percorrer uma cadeia
Usando um ciclo while
# invariante: 0<=i<=len(fruta)-1
i = 0
while i<len(fruta):
letra = fruta[i]
print letra
i = i + 1

a
3

n
4

a
5

Strings: o que permitido usar nesta disciplina


Em problemas com strings o aluno apenas poder usar operaes elementares (a
no ser que o enunciado diga o contrrio)
Acesso a um ndice de cada vez; por exemplo fruta[i] mas no fruta[: i]
Comparaes envolvendo os caracteres que esto nos ndices (um caracter de
cada vez); por exemplo fruta[i] == b mas no fruta == banana
A funo len(); por exemplo len(fruta) mas no lower(fruta)
Percorrer uma cadeia (2)
Idioma: o ciclo for
for letra in fruta:
print letra
evita a utilizao explcita do ndice
generalizao: percorrer sequncias (mais tarde)