我正在尝试创建一个函数来绘制我告诉它的任何公式。
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
答案 0 :(得分:58)
您的猜测是正确的:代码正在尝试立即评估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
或{{ 1}}:
return
而不是graph(lambda x: x**3+2*x-4, range(-10, 11))
,您可以查看range
(允许非整数增量)和np.arange
,它允许您指定开始,停止和要使用的点数。
答案 1 :(得分:23)
这是因为在行
graph(x**3+2*x-4, range(-10, 11))
未定义。
最简单的方法是将要绘制的函数作为字符串传递,并使用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 :(得分:4)
绘制未针对特定变量(如圆或双曲线)求解的等式:
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