我一周前开始使用 matplotlib;我正在尝试绘制函数
在哪里
我更改了我的代码
from math import*
import numpy as np
import matplotlib.pyplot as plt
def phi(x):
return min(ceil(x) - x, x - floor(x))
n=50
def f(x):
return sum([phi(x*2.0**i)/(2.0**i) for i in range (1,n)])
t = np.arange(0.0, 3.0, 0.1)
plt.plot(t, map(f,t))
plt.show()
但它不起作用。我得到的错误是:
File "C:\Documents and Settings\Macedo\Desktop\exem.py", line 15, in <module>
plt.plot(t, map(f,t))
File "C:\Python32\lib\site-packages\matplotlib\pyplot.py", line 2459, in plot
ret = ax.plot(*args, **kwargs)
File "C:\Python32\lib\site-packages\matplotlib\axes.py", line 3850, in plot
for line in self._get_lines(*args, **kwargs):
File "C:\Python32\lib\site-packages\matplotlib\axes.py", line 325, in _grab_next_args
for seg in self._plot_args(remaining, kwargs):
File "C:\Python32\lib\site-packages\matplotlib\axes.py", line 302, in _plot_args
x, y = self._xy_from_xy(x, y)
File "C:\Python32\lib\site-packages\matplotlib\axes.py", line 242, in _xy_from_xy
raise ValueError("x and y must have same first dimension")
ValueError: x and y must have same first dimension
请您参考如下方法:
问题在于您如何定义变量。例如,您写道:
def phi(x):
phi = lambda x: min(ceil(x) - x, x - floor(x))
您可以将其定义为
def phi(x):
return min(ceil(x) - x, x - floor(x))
或
phi = lambda x: min(ceil(x) - x, x - floor(x))
在 Python 中查找函数定义和 lambda 函数。
f 的定义不应该在循环中。所以你需要类似的东西
n=50
def f(x):
return sum([phi(x*2.0**i)/(2.0**i) for i in range (1,n)])
要摆脱“只有长度为 1 的数组可以转换为 Python 标量”错误,请使用
plt.plot(t, map(f,t))
代替
plt.plot(t, f(t))
问题是 math.ceil 需要一个标量,而不是按元素对数组进行操作,而这正是您想要的。所以 map 现在将在 t 上按元素操作 f。
最后,我使用的代码是:
from math import *
import numpy as np
import matplotlib.pyplot as plt
def phi(x):
return min(ceil(x) - x, x - floor(x))
n=50
def f(x):
return sum([phi(x*2.0**i)/(2.0**i) for i in range (1,n)])
t = np.arange(0.0, 3.0, 0.1)
plt.plot(t, map(f,t))
plt.show()
输出是
这是在 Python 2.7.2 中。正如@ThomasK 所建议的,对于 Python 3,您可能需要 list(map(f,t))。
