Подтвердить что ты не робот

Графирование уравнения с помощью 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  
4b9b3361

Ответ 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