Skip to main content
 首页 » 编程设计

python之使用 Matplotlib 绘制 Takagi 函数

2025年05月04日15grandyang

我一周前开始使用 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))。