Проблема в том, как вы определяете переменные. Например, вы написали:
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()
И вывод

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