In [1]:
import matplotlib.pyplot as plt
import numpy as np
passo=0.5
In [2]:
#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

Método da Bissecção

In [3]:
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()
In [4]:
bissec(fun0,0.001,passo,[-5,5])
7 
In [5]:
bissec(fun1,0.001,passo,[-5,5])
9 19 
In [6]:
bissec(fun2,0.001,passo,[-5,5])
8 

Método de Newton-Rapson

In [7]:
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()
In [8]:
new_rap(fun0,0.001,passo,[-5,5])
2 
In [9]:
new_rap(fun1,0.001,passo,[-5,5])
1 4 
In [10]:
new_rap(fun2,0.001,passo,[-5,5])
3 

Método da Secante

In [11]:
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()
In [12]:
secante(fun0,0.001,passo,[-5,5])
4 
In [13]:
secante(fun1,0.001,passo,[-5,5])
3 8 
In [14]:
secante(fun2,0.001,passo,[-5,5])
6