2012-12-22 27 views
19

Ich versuche, eine Funktion zu machen, die jede Formel grafisch darstellt, die ich es erzähle.eine Gleichung mit Matplotlib graphisch darstellen

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

Wenn ich versuche, es wird der folgende Fehler passiert, zu nennen, ich glaube, es wird versucht, die Multiplikation zu tun, bevor es zu y = formula bekommt.

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 

Antwort

16

liegt daran, dass in Zeile

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

x ist nicht definiert.

Der einfachste Weg ist, die Funktion, die Sie plotten wollen, als String zu übergeben und eval als Ausdruck zu verwenden.

So Ihr Code mit minimalen Modifikationen

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

und Sie es als

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

gibt es keine Notwendigkeit, Eval hier zu verwenden, und es fügt Overhead – goncalopp

+0

danke, dass das perfekt funktioniert. dachte, dass könnte der Fall sein, aber hatte keine Ahnung, wie man es entwirrt –

44

Ihre Vermutung ist richtig: Der Code versucht x**3+2*x-4 sofort zu bewerten. Leider kann man das nicht wirklich verhindern. Die gute Nachricht ist, dass Funktionen in Python erstklassige Objekte sind, mit denen ich meine, dass Sie sie wie jede andere Variable behandeln können. So Ihre Funktion zu beheben, könnten wir tun:

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

Wenn Sie das alles in einer Zeile tun möchten, können Sie verwenden, was eine lambda Funktion aufgerufen wird, die ohne Namen nur eine kurze Funktion ist, wo Sie don‘ t Verwendung def oder return:

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

und statt range, kann man sich np.arange (die für nicht-ganzzahligen Inkrementen erlaubt) und np.linspace, die Sie den Start festlegen können, stoppen und die Zahl der Punkte zu verwenden. Diese

+0

danke für die Hilfe –

+0

Gibt es eine Möglichkeit, die interaktive Grafik in .html, wie wenn jupyter Notebook, ich möchte eine HTML-Datei, mit denen die Leute spielen können. – xappppp

1

nennen kann eine Gleichung zu zeichnen, die nicht für eine bestimmte Variable (wie Kreis oder Hyperbel) gelöst :

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

Mehr dazu: http://courses.csail.mit.edu/6.867/wiki/images/3/3f/Plot-python.pdf

Verwandte Themen