【问题标题】:Plotting Takagi function with Matplotlib用 Matplotlib 绘制 Takagi 函数
【发布时间】:2012-02-24 16:53:05
【问题描述】:

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

【问题讨论】:

  • 应该phi 包含return 声明吗?照原样,它看起来没有返回任何东西。
  • 我尝试将 'lambda' 更改为 'return',但也没有成功。
  • 你的意思是在什么时候截断你的总和?
  • @katrielalex,为什么需要截断总和?
  • 尝试list(map(f, t)) 而不是map(f, t)。 Python 3 中的 map 返回一个迭代器,所以可能会让人感到困惑。

标签: python matplotlib


【解决方案1】:

问题在于您如何定义变量。例如,您写道:

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))

【讨论】:

  • 一个类型错误:只有长度为1的数组可以转换为Python标量
  • @highBandWidth:或者,他可以写成f = np.vectorize(f)。他可能还想使用 linspace 而不是 arange,以自然地获得上限。
  • 您还必须类似地更改其他函数 f 的定义。为什么定义是循环的?
  • @highBandWidth,我更改了 f 的定义,但我的帖子中出现了同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
相关资源
最近更新 更多