graphique d'une équation avec matplotlib

J'essaie de faire une fonction qui va représenter la formule que je lui dis.

import numpy as np  
import matplotlib.pyplot as plt  
def graph(formula, x_range):  
    x = np.array(x_range)  
    y = formula  
    plt.plot(x, y)  
    plt.show()  

Quand j'essaie de l'appeler l'erreur suivante se produit, je crois qu'il essaie de faire la multiplication avant qu'il arrive à y = formula.

graph(x**3+2*x-4, range(-10, 11))

Traceback (most recent call last):  
  File "<pyshell#23>", line 1, in <module>  
    graph(x**3+2*x-4, range(-10, 11))  
NameError: name 'x' is not defined  
27
demandé sur phant0m 2012-12-22 10:22:49

3 réponses

C'est parce que dans la ligne

graph(x**3+2*x-4, range(-10, 11))

X n'est pas défini.

Le plus simple est de passer la fonction que vous voulez tracer en tant que chaîne et d'utiliser eval pour l'évaluer en tant qu'expression.

Donc votre code avec des modifications minimales sera

import numpy as np  
import matplotlib.pyplot as plt  
def graph(formula, x_range):  
    x = np.array(x_range)  
    y = eval(formula)
    plt.plot(x, y)  
    plt.show()

Et vous pouvez l'appeler comme

graph('x**3+2*x-4', range(-10, 11))
19
répondu rputikar 2012-12-22 06:37:51

Votre supposition est juste: le code essaie d'évaluer x**3+2*x-4 immédiatement. Malheureusement, vous ne pouvez pas vraiment l'empêcher de le faire. Les bonnes nouvelles sont qu'en Python, les fonctions sont des objets de première classe, par lesquels je veux dire que vous pouvez les traiter comme n'importe quelle autre variable. Pour fixer votre fonction, nous pourrions faire:

import numpy as np  
import matplotlib.pyplot as plt  

def graph(formula, x_range):  
    x = np.array(x_range)  
    y = formula(x)  # <- note now we're calling the function 'formula' with x
    plt.plot(x, y)  
    plt.show()  

def my_formula(x):
    return x**3+2*x-4

graph(my_formula, range(-10, 11))

Si vous voulez tout faire en une seule ligne, vous pouvez utiliser ce qu'on appelle une fonction lambda, qui est juste une fonction courte sans nom où vous n'utilisez pas def ou return:

graph(lambda x: x**3+2*x-4, range(-10, 11))

Et au lieu de range, Vous pouvez regarder np.arange (qui permet des incréments non entiers), et np.linspace, qui vous permet de spécifier le début, l'arrêt et le nombre de points à utiliser.

52
répondu DSM 2012-12-22 06:32:16

Pour tracer une équation qui n'est pas résolue pour une variable spécifique (comme un cercle ou une hyperbole):

import numpy as np  
import matplotlib.pyplot as plt  
plt.figure() # Create a new figure window
xlist = np.linspace(-2.0, 2.0, 100) # Create 1-D arrays for x,y dimensions
ylist = np.linspace(-2.0, 2.0, 100) 
X,Y = np.meshgrid(xlist, ylist) # Create 2-D grid xlist,ylist values
F = X**2 + Y**2 - 1  #  'Circle Equation
plt.contour(X, Y, F, [0], colors = 'k', linestyles = 'solid')
plt.show()

De Plus à ce sujet: http://courses.csail.mit.edu/6.867/wiki/images/3/3f/Plot-python.pdf

2
répondu jelde015 2018-01-09 12:09:20