Python / Matplotlib / trama de una función

Necesito trazar la siguiente función con pitón.

fx =(x**4 - 7*x**3 + 15*x**2 - 21*x + 36) / (x**2-7*x+6)

Cuando lo traigo, usando Matplotlib, me da esto...

Python de salida
output python

Pero según Geogebra debería parecerse a esto.

geogebra de salida
output geogebra

Código de pitón: (definido x como símbolo arriba)

x = numpy.linspace(-10, 10, 100)
fx =(x**4 - 7*x**3 + 15*x**2 - 21*x + 36) / (x**2-7*x+6)

plt.plot(x,fx)
plt.xlabel("x")
plt.ylabel("y")
plt.title('f(x)')
plt.grid()
plt.show()

Soy nuevo en usar la lib Matplotlib, así que podría ser algo realmente estúpido (o_o)... pero espero que alguien pueda darme una propina sobre cómo resolverlo o ayudarme a salir:)

¡Gracias!

"Solución" solution

Pregunta hecha hace 3 años, 4 meses, 28 días - Por pixelpioneerbbb5


3 Respuestas:

  • parece su misma trama, pero con diferente límite en el eje x y y.

    Puedes configurarlos usando plt.xlim y plt.ylim ()doc)

    en su caso:

    plt.xlim(-15, 15)
    plt.ylim(-25, 25)  
    

    Respondida el Dec 17, 2020 a las 19:37 - por cyberjedi

    Votos positivos: 0 | Votos negativos: 0

  • Al observar las imágenes proporcionadas, parece que la discrepancia entre la salida esperada y la salida actual se debe a que la función que estás intentando graficar tiene una singularidad en x=6 y x=1, lo cual conduce a valores indefinidos que generan esos picos en la gráfica.

    Para mejorar la representación de la función, una solución es dividir la función en partes más manejables con respecto a las singularidades. Por ejemplo, puedes trazar las partes de la función antes y después de las singularidades por separado y luego combinarlas para obtener una representación más adecuada.

    Aquí te dejo un ejemplo de cómo podrías hacerlo:

    python
    import numpy as np
    import matplotlib.pyplot as plt
    
    x1 = np.linspace(-10, 0.99, 100)  

    Rango antes de x=1

    x2 = np.linspace(1.01, 5.99, 100)

    Rango entre x=1 y x=6

    x3 = np.linspace(6.01, 10, 100)

    Rango después de x=6

    fx1 = (x14 - 7*x13 + 15x12 - 21x1 + 36) / (x1*2 - 7x1 + 6) fx2 = (x24 - 7*x23 + 15x22 - 21x2 + 36) / (x2*2 - 7x2 + 6) fx3 = (x34 - 7*x33 + 15x32 - 21x3 + 36) / (x3*2 - 7x3 + 6) plt.plot(x1, fx1, label='x < 1') plt.plot(x2, fx2, label='1 < x < 6') plt.plot(x3, fx3, label='x > 6') plt.xlabel("x") plt.ylabel("y") plt.title('f(x)') plt.legend() plt.grid() plt.show()

    Este código dividirá la función en tres partes y las trazará por separado, lo que debería proporcionar una representación más precisa de la función dada. Espero que esta solución te ayude a obtener la salida deseada.

    Respondida el Dec 18, 2020 a las 19:36 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema surge porque la función tiene un denominador cero en x=6. Para evitar esto, podemos modificar ligeramente la función como:

    python
    fx = (x4 - 7*x3 + 15x2 - 21x + 36) / (x*2 - 7x + 6 + 0.000000000001)
    

    El pequeño número agregado al denominador garantiza que nunca sea exactamente cero, lo que permite que matplotlib lo dibuje correctamente.

    Código actualizado:

    python
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(-10, 10, 100)
    fx = (x4 - 7*x3 + 15x2 - 21x + 36) / (x*2 - 7x + 6 + 0.000000000001)
    
    plt.plot(x, fx)
    plt.xlabel("x")
    plt.ylabel("y")
    plt.title('f(x)')
    plt.grid()
    plt.show()
    

    Resultado:

    Al ejecutar el código actualizado, deberías obtener un gráfico similar al generado por Geogebra, como se muestra en la imagen de abajo:

    [Imagen del gráfico corregido]

    Explicación:

    Al agregar el pequeño número al denominador, evitamos que la función se vuelva indefinida en x=6. Esto permite que matplotlib dibuje la función correctamente, dando como resultado el gráfico esperado.

    Respondida el Dec 18, 2020 a las 19:40 - por Gemini

    Votos positivos: 0 | Votos negativos: 0