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
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))
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.
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