import matplotlib.pyplot as plt
import numpy as np
passo=0.5
#Funções a terem seus zeros encontrados
def fun0(x):
return x**3+4*x**2-10
def fun1(x):
return np.exp(x)-5*x
def fun2(x):
return 3*x**3-4
def bissec(fun,epsilon,passo,intervalo):
#Contador de Iterações
itera=0;
#Criação de um vetor de entradas
x = np.arange(intervalo[0],intervalo[1],passo);
#Determinação dos intervalos da função
par = [[n,n+passo] for n in x if fun(n)*fun(n+passo)<0]
#Plotagem da função
plt.plot(x,fun(x),'c')
#Loop para todos os intervalos encontrados
for n in range(0,len(par)):
#Troca de variaveis para melhor redabilidade do código
a,b=par[n][0],par[n][1]
#Valor inicial recebe a média entre os valores
x0 = (a+b)/2
#Loop para encontrar o zero
while abs(fun(x0))>epsilon:
#Condição para determinar se x0 esta a direita ou a
#Esquerda do zero da função e modificar a ou b
if fun(b)*fun(x0)<0:
a=x0
else:
b=x0
#Encontra-se um novo valor inicial
x0=(a+b)/2
#Contador de iterações incrementado
itera+=1;
#Plotagem dos zeros encontrados
plt.plot(x0,fun(x0),'.r')
print(itera, end=' ', flush=True)
#Funções para a plotagem
plt.grid()
plt.show()
bissec(fun0,0.001,passo,[-5,5])
7
bissec(fun1,0.001,passo,[-5,5])
9 19
bissec(fun2,0.001,passo,[-5,5])
8
def new_rap(fun,epsilon,passo,intervalo):
itera=0;
x = np.arange(intervalo[0],intervalo[1],passo);
par = [[n,n+passo] for n in x if fun(n)*fun(n+passo)<0]
plt.plot(x,fun(x),'c')
for n in range(0,len(par)):
a,b=par[n][0],par[n][1]
#Chute inicial para x0 dentro do intervalo
x0 = (a+b)/2
while abs(fun(x0))>epsilon:
#Novo valor de x0 encontrado, utilizando a definição
#de taxa de variação para sinais discretos no lugar
#da derivada analitica
x0 -= epsilon*fun(x0)/(fun(x0+epsilon/2)-fun(x0-epsilon/2))
itera+=1;
plt.plot(x0,fun(x0),'.r')
print(itera, end=' ', flush=True)
plt.grid()
plt.show()
new_rap(fun0,0.001,passo,[-5,5])
2
new_rap(fun1,0.001,passo,[-5,5])
1 4
new_rap(fun2,0.001,passo,[-5,5])
3
def secante(fun,epsilon,passo,intervalo):
itera=0;
x = np.arange(intervalo[0],intervalo[1],passo);
par = [[n,n+passo] for n in x if fun(n)*fun(n+passo)<0]
plt.plot(x,fun(x),'c')
for n in range(0,len(par)):
a,b=par[n][0],par[n][1]
x0 = a
x1 = b
while abs(fun(x0))>epsilon:
#Novo valor de x0 encontrado
x0 = (x0*fun(x1)-x1*fun(x0))/(fun(x1)-fun(x0))
itera+=1;
plt.plot(x0,fun(x0),'.r')
print(itera, end=' ', flush=True)
plt.grid()
plt.show()
secante(fun0,0.001,passo,[-5,5])
4
secante(fun1,0.001,passo,[-5,5])
3 8
secante(fun2,0.001,passo,[-5,5])
6