Você está na página 1de 4

Universidade Federal do Ceará

Centro de Tecnologia
Departamento de Engenharia Elétrica
Métodos Numéricos para Engenharia Elétrica - 2023.1
Prof. Wilkley Bezerra Correia, Dr

Laboratório: Raı́zes De Funções e Estudo Dos erros

1. Automatize o processo de cálculo de raı́zes de f (x) a partir de um valor inicial x0 . Para cada caso enumerado
abaixo desenvolva códigos em Python para os métodos:
a) Bisseção;
b) Posição falsa.

Como resultado, o algoritmo deverá produzir a raiz com precisão de erro aproximado ϵaprox < x, em que x deve
ser passado pelo usuário, o número total de iterações e o valor final de |f (xn )|, além dos gráficos de convergência
da raiz e do erro.
2. Escreva uma função que realize o arredondamento simétrico de um valor passado a essa função como parâmetro.
O valor retornado deverá estar em ponto flutuante na representação F = (10, 5, 4, 4). Na solução apresente:
a) Um caso de overflow;
b) Um caso de underflow.

TH0168 - Métodos Numéricos Aplicados à Engenharia Elétrica 1


Códigos
1. Na primeira questão, o método da bisseção foi utilizado a biblioteca da própria disciplina, enquanto o item B
foi feito de forma manual.

item A
from metodos import raizes
import matplotlib.pyplot as plt
import numpy as np

def f(x):
return x**2 - 4

analise = raizes(f, maxit = 20)

analise.bissecao(-1,10)

print(analise.x)
print(analise.iter)
# Criando um array com valores de x para o gráfico
x = np.linspace(-2, 2, 200)

# Plotando o gráfico da funç~


ao f(x)
plt.plot(x, f(x), color=’blue’)

# Adicionando tı́tulo e rótulos dos eixos


plt.title(’Gráfico de f(x) = x^3 - 9x + 3’)
plt.xlabel(’x’)
plt.ylabel(’f(x)’)

# Mostrando o gráfico
plt.show()

Item B
import matplotlib.pyplot as plt
import numpy as np

import numpy as np
def f(x):
"""
Define a funç~
ao f(x) a ser utilizada no método da posiç~
ao falsa.
"""
return x**3 - 9*x + 3

def posicao_falsa(a, b, tol=1e-6, max_iter=100):


"""
Implementaç~
ao do método da posiç~
ao falsa.
Recebe como entrada os valores iniciais a e b, a toler^
ancia tol e o número máximo de iteraç~
oes max
Retorna a raiz da funç~ao f(x) com precis~ao tol.
"""
fa = f(a)
fb = f(b)

for i in range(max_iter):

TH0168 - Métodos Numéricos Aplicados à Engenharia Elétrica 2


c = (a*fb - b*fa)/(fb - fa)
fc = f(c)

if abs(fc) < tol:


return c

if fc*fb > 0:
b = c
fb = fc
else:
a = c
fa = fc

raise Exception(f"O método da posiç~


ao falsa n~
ao convergiu em {max_iter} iteraç~
oes.")
print(posicao_falsa(0,1))

# Criando um array com valores de x para o gráfico


x = np.linspace(-2, 2, 200)

# Plotando o gráfico da funç~


ao f(x)
plt.plot(x, f(x), color=’blue’)

# Adicionando tı́tulo e rótulos dos eixos


plt.title(’Gráfico de f(x) = x^3 - 9x + 3’)
plt.xlabel(’x’)
plt.ylabel(’f(x)’)

# Mostrando o gráfico
plt.show()

2. A partir dos parâmetros do ponto flutuante, que permitem um número máximo de 5 dı́gitos, foi criada uma
função para realizar o arredondamento simétrico. Para isso, definiu-se uma variável ”cont” que representa o
expoente da base indicada. Em seguida, foram definidas as condições para determinar esse expoente. A primeira
condição foi estabelecida para valores maiores que 1, onde a variável ”cont” seria incrementada em 1 a cada vez
que houvesse uma divisão pela base até que se chegasse ao modelo da mantissa do ponto flutuante, onde o 0
fica à frente, ou seja, um número menor que 1. Caso o número fosse menor que 1, a função verificaria quantos
zeros ele tem à esquerda. Para isso, o valor de ”x” foi convertido em uma string e armazenado na variável
”h”. Em seguida, verificou-se se havia 0 no terceiro termo da string e assim eliminou-o multiplicando por 10.
Através da função recursiva, a variável ”cont” no ”elif” seria decrementada em -1, já que o expoente teria que
ficar negativo. O terceiro ”elif” foi criado para atender a uma peculiaridade que ocorre quando se trabalha
com valores muito pequenos ou menores que 0.0001. Para esses valores, o resultado fica na forma de notação
cientı́fica, por exemplo, ”9e-105” para o número 0.00009. Para lidar com esse caso, a posição do sinal negativo
na string ”h” foi encontrada usando o método ”find”. Em seguida, obteve-se o valor do expoente, que se localiza
à direita do sinal negativo ”-”. O valor da mantissa foi obtido considerando os elementos à esquerda do ”e”.
Assim como nas outras condições, a função recursiva foi utilizada até que a condição fosse concluı́da. Para
todas as condições concluı́das, foi feito um ”else” que imprime o valor caso o número possa ser representado
pelos parâmetros do ponto flutuante. Caso contrário, a função retorna se o valor é ”underflow” ou ”overflow”.

TH0168 - Métodos Numéricos Aplicados à Engenharia Elétrica 3


Por exemplo, o valor 0.0000009 seria ”underflow” e 923293484920 seria ”overflow”, ou seja, ficariam imprecisos
para os parâmetros dados.

def truncamento(num, dig):


trunc = str(num)
return trunc[:dig+2]

cont= 0

def flutuante(x ,y, n, m, M):


global cont
h = str(x)
if x >= 1:
pot10 = x/y
x = pot10
cont = cont + 1
return flutuante(x,y,n,m,M)
elif h[2] == "0":
x = x*10
cont = cont-1
return flutuante(x,y,n,m,M)
elif h[0] != "0":
pos1 = h.find("-")
pos2 = h.find("e")
if "-" in h:
cont = -(int(h[pos1+1:]))
x = float(h[:pos2])/10
return flutuante(x,y,n,m,M)
else:
if -m > cont:
return "Underflow"
elif M < cont:
return "Overflow"
else:
return "{0}*{1}^{2}" .format(truncamento(x,n), y, cont)
else:
if -m > cont:
return "Underflow"
elif M < cont:
return "Overflow"
else:
return "{0}*{1}^{2}" .format(truncamento(x,n), y, cont)

x = float(input())
print(flutuante(x,10,5,4,4))

TH0168 - Métodos Numéricos Aplicados à Engenharia Elétrica 4

Você também pode gostar