Построение функции Такаги с помощью Matplotlib - PullRequest
1 голос
/ 24 февраля 2012

Я начал с matplotlib неделю назад;Я пытаюсь построить функцию

enter image description here

, где

enter image description here

Я изменил свой код для

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

1 Ответ

7 голосов
/ 24 февраля 2012

Проблема в том, как вы определяете переменные. Например, вы написали:

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.

Определение 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 будет работать f поэлементно на t сейчас.

Итак, наконец, код, который я использую:

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

И вывод

enter image description here

Это в Python 2.7.2. Как подсказывает @ThomasK, для Python 3 вам может понадобиться list(map(f,t)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...