Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como fazer uma Classe em Python que represente uma função quadrática?

0 votos
47 visitas
perguntada Ago 5 em Ciência da Computação por Henrique Alves (1 ponto)  
editado Ago 5 por Henrique Alves
Compartilhe

1 Resposta

0 votos
respondida Ago 5 por Henrique Alves (1 ponto)  

Olá a todos!

Vamos hoje discutir um pouco sobre uma das possíveis implementações em Python para uma Classe que represente uma função quadrática.

Esse projeto é uma resposta para o exercício 7.7 do livro A primer on Scientific Programming with Python.

Espero que a discussão seja de grande proveito para todos :) Então vamos lá!

Primeira coisa, precisamos definir a nossa classe, e como o livro nos recomenda, vamos usar o nome quadratic:

import numpy as np
import math
import matplotlib as plt

class quadratic:

    def __init__(self,a,b,c):

        self.a = a

        self.b = b

        self.c = c

Os parâmetros a, b e c da nossa equação quadrática, estão descritos por self.a, self.b e self.c. Aqui eu tomei a decisão de fazer que a classe iniciasse apenas os parâmetros, vamos ver o porquê disso em seguida.

A questão nos fala para apresentarmos alguns resultados por meio de métodos. O primeiro método é simples, calculamos a função quadrática em um ponto x:

    def func(self,x): #Primeiro método
    print('Método 1: Função no ponto x:')
    result = (self.a*x*x) + (self.b*x) + self.c
    print(result)

O segundo método é um pouco mais complexo. A questão nos pede para calcularmos a função nos pontos dentro de um intervalo, por exemplo:

Queremos a função em 10 pontos dentro do intervalo de 1 a 10, então buscamos:
*x = 1, y = f(1), x = 2, y = f(2), x = 3, y = f(3)...

O método usado para resolver o problema foi:

    def func2(self, l,r,n): #Segundo método

    dist = np.linspace(l,r,n)
    print('Método 2: Tabela de pontos:')
    print('\n')
    print('Tabela dos Valores x / f(x):')

    for i in range(len(dist)):

        result = (self.a*i*i) + (self.b*i) + self.c

        print('x:',dist[i], 'f(x):', result)

O terceiro método é talvez o mais interessante quando o assunto é funções quadráticas:

Encontrar as raízes.

Usando a fórmula de Bhaskara o método se tornou bem simples de ser implementado:

    def func3(self): #Terceiro método

    delta = (self.b*self.b)-(4*self.a*self.c)

    if delta >= 0:

        raizdelta = np.sqrt(delta)

        #print(raizdelta)

        at = (1/(2*self.a))

        #print(at)

        raiz1 = (self.b + raizdelta )*at

        raiz2 = (self.b - raizdelta )*at
        print('Método 3: Raízes')
        print('\n')
        print('A primeira raíz é:',raiz1)

        print('A segunda raíz é:', raiz2)

    else:

        print('Não existem raízes')

Mas enfim, como fica os resultados do programa?

Vamos considerar os parâmetros: a = 2, b = 0, c = -5, e usar o seguinte comando para executar o programa:

entrada = quadratic(2,0,-5)

entrada.func(1)
entrada.func2(0,10,10)
entrada.func3()

Ou seja, para o método 1, x = 1; Para o método 2, o intervalo é 0 a 10 com n = 10, e no método 3 é usado apenas os parâmetros da função.

O resultado no console foi:

**Método 1: Função no ponto x:**
-3

**Método 2: Tabela de pontos:**


Tabela dos Valores x / f(x):
x: 0.0 f(x): -5
x: 1.1111111111111112 f(x): -3
x: 2.2222222222222223 f(x): 3
x: 3.3333333333333335 f(x): 13
x: 4.444444444444445 f(x): 27
x: 5.555555555555555 f(x): 45
x: 6.666666666666667 f(x): 67
x: 7.777777777777779 f(x): 93
x: 8.88888888888889 f(x): 123
x: 10.0 f(x): 157

**Método 3: Raízes**


A primeira raíz é: 1.5811388300841898
A segunda raíz é: -1.5811388300841898

Resumo do exercício:

É um exercício excelente para entender bem o funcionamento das classes em Python. Algumas melhorias que poderiam ser feitas, caso o programa tivesse um uso intensivo, era fazer a leitura manual dos parâmetros da função usando o comando input().

Além disso, para resolver o problema de funções sem raízes, fazemos uma impressão simples no console, o que já resolve nosso problema :)

Recomendo a todos, que assim como eu, estão aprendendo sobre as classes em Python que procurem reproduzir esse exercício. Irei colocar aqui o código completo.

É isso! Cheers.

#
import numpy as np
import math
import matplotlib as plt

class quadratic:

    def __init__(self,a,b,c):

        self.a = a

        self.b = b

        self.c = c

    def func(self,x): #Primeiro método
        print('Método 1: Função no ponto x:')
        result = (self.a*x*x) + (self.b*x) + self.c
        print(result)

    def func2(self, l,r,n): #Segundo método

        dist = np.linspace(l,r,n)
        print('Método 2: Tabela de pontos:')
        print('\n')
        print('Tabela dos Valores x / f(x):')

        for i in range(len(dist)):

            result = (self.a*i*i) + (self.b*i) + self.c

            print('x:',dist[i], 'f(x):', result)

    def func3(self): #Terceiro método

        delta = (self.b*self.b)-(4*self.a*self.c)

        if delta >= 0:

            raizdelta = np.sqrt(delta)

            #print(raizdelta)

            at = (1/(2*self.a))

            #print(at)

            raiz1 = (self.b + raizdelta )*at

            raiz2 = (self.b - raizdelta )*at
            print('Método 3: Raízes')
            print('\n')
            print('A primeira raíz é:',raiz1)

           print('A segunda raíz é:', raiz2)

        else:

            print('Não existem raízes')


if __name__ == '__main__':

    entrada = quadratic(2,0,-5)

    entrada.func(1)
    entrada.func2(0,10,10)
    entrada.func3()
comentou Ago 6 por Thiago Trafane (21 pontos)  
Henrique, antes de mais nada, parabéns pela solução! Quanto aos meus comentários e sugestões:

1) Pergunta:
1.1) Talvez fosse interessante colocar a equação da função quadrática no enunciado, de modo a deixar explícito o significado dos parâmetros ‘a’, ’b’ e ‘c’.
1.2) No campo "Mais informações sobre a pergunta", seria importante colocar os detalhes do enunciado, como os métodos pedidos, e a fonte da pergunta (livro, capítulo, etc).

2) Resposta:
2.1) Pacotes: os pacotes math e matplotlib não estão sendo usados. Assim, apenas para deixar o programa mais limpo, você poderia deixar de importá-los.

2.1) Métodos – comentário geral: talvez ficasse mais claro para o leitor se você definisse os métodos usando os nomes sugeridos no enunciado (value, table e roots). Além disso, o output dos métodos estão sempre usando a função print, mas penso que seria mais adequado usar return, para facilitar o uso do output dos métodos dentro de um algoritmo maior (fazer algum cálculo com esses outputs, por exemplo).

2.2) Método 2 (table):  você utilizou len(dist) para identificar o número de iterações, mas você já tem isso diretamente, dado que esse número é igual ao parâmetro de input ‘n’.

2.3) Método 3 (roots): em primeiro lugar, há um erro na implementação da fórmula de Bhaskara. O correto seria: raiz1=(-self.b+raizdelta)*at e raiz2 = (-self.b-raizdelta)*at. Em segundo lugar, se o delta é negativo, não existem raízes reais, mas existem raízes complexas. Então, você poderia apenas ajustar a mensagem para ‘Não existem raízes reais’ ou tentar considerar essa possibilidade também. Em terceiro lugar, o cálculo das raízes (reais ou complexas) já está implementado na função numpy.roots. Assim, você poderia definir esse método usando def roots(self): return np.roots([self.a,self.b,self.c]).
comentou Ago 21 por Henrique Alves (1 ponto)  
Thiago, muito obrigado por seu comentário! Todas as suas propostas são ótimas e agregam muito. Irei implementar as mudanças.

Mais uma vez, muito obrigado!
...