Графирование уравнения с помощью matplotlib
Я пытаюсь сделать функцию, которая будет отображать любую формулу, о которой я рассказываю.
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()
Когда я пытаюсь вызвать его, возникает следующая ошибка, я считаю, что она пытается сделать умножение до того, как оно достигнет 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
Ответы
Ответ 1
Это связано с тем, что в строке
graph(x**3+2*x-4, range(-10, 11))
x не определено.
Самый простой способ - передать функцию, которую вы хотите построить в виде строки, и использовать eval
для оценки ее как выражения.
Таким образом, ваш код с минимальными изменениями будет
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()
и вы можете назвать его
graph('x**3+2*x-4', range(-10, 11))
Ответ 2
Ваша догадка правильная: код пытается оценить x**3+2*x-4
сразу. К сожалению, вы не можете помешать этому сделать это. Хорошей новостью является то, что в Python функции являются первоклассными объектами, и я имею в виду, что вы можете относиться к ним как к любой другой переменной. Поэтому, чтобы исправить вашу функцию, мы могли бы сделать:
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))
Если вы хотите сделать все это в одной строке, вы можете использовать функцию, называемую lambda
, которая является просто короткой функцией без имени, где вы не используете def
или return
:
graph(lambda x: x**3+2*x-4, range(-10, 11))
И вместо range
вы можете посмотреть np.arange
(который допускает нецелые приращения) и np.linspace
, что позволяет указать начало, остановку и количество используемых точек.
Ответ 3
Чтобы построить уравнение, которое не разрешено для конкретной переменной (например, круга или гиперболы):
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()
Подробнее об этом: http://courses.csail.mit.edu/6.867/wiki/images/3/3f/Plot-python.pdf