У меня есть задание для моего класса прикладной информатики, в котором мы должны проверить силу и качество алгоритма, который пытается найти k: -е наивысшее значение в списке. Это должно быть проверено как для изменения k: s (0, 1, 2, ..., k = N), так и для изменения N: s, где я выбрал k = 0 и N (1, 2, ..., N). Мы должны определить, будет ли алгоритм когда-либо производить больше, чем pi * N сравнений, а также log2 (N / 2 - k) * N сравнений.
Чтобы найти некоторую ясность в этом, я сделал два графика, на каждом из которых указано количество сравнений по оси y и k и N соответственно для оси x. Наряду с графиками мне нужны функции y = pi * N и y = log2 (N / 2 - k) * N. Проблема в том, что я получаю ValueError для второй функции, особенно когда N / 2 = k. Я все еще хотел бы построить его на Python, и мой вопрос в том, как это обойти.
Остальная часть кода не имеет отношения к делу. Мой вопрос: как я могу построить эту функцию, обойдя ее неопределенные части? Я все еще хочу проиллюстрировать неопределенную часть, поэтому я не хочу делать исключения, в которых делается упрощение.
def plotHelper(x, yA, yS, title, trials):
yPi = list()
yLogN = list()
for point in x:
yPi.append(point*math.pi)
yLogN.append((trials*math.log(trials/2 - point, 2)
plt.figure()
plt.title(title)
plt.plot(x, yA)
plt.plot(x, yS)
plt.plot(x, yPi)
plt.plot(x, yLogN)
plt.grid(True)
plt.legend(["Mean", "Standard Deviation", "y = pi * N"])
plt.ylabel("Comparisons")
plt.xlabel("k")
plt.show()
def plot():
choice = initiate()
yA, yS, trials = trialFunc(choice)
x = range(0, trials)
f_of_k = "Comparisons as a function of desired k (N elements)"
f_of_n = "Comparisons as a function of elements (k = 0)"
if choice:
title = f_of_k
else:
title = f_of_n
plotHelper(x, yA, yS, title, trials)
@DannyData Вы скопировали код точно так, как он выглядит в вашем файле? Отступы важны, и этот код не будет работать должным образом, если тела функций plotHelper и plot не имеют отступа, как вы видите из редактирования Дэвида.






Если вы не можете представить значение функции в виде числа, вы можете представить его как Not-a-Number, или NaN. Для него нет готовой константы, но вы можете легко получить это значение:
NaN = float('NaN')
Теперь ваша функция может выглядеть так:
def function_to_plot(n): # A contrived example.
if abs(n) <= 1:
return NaN
return sqrt(n * n - sin(n) ** 2)
После этого matplotlib просто работает, он умеет пропускать точки, которые являются NaN.
Если вы просто хотите вручную табулировать свою функцию, вы можете безопасно распечатать NaN, используя формат для чисел с плавающей запятой.
Для более подробной информации вы можете использовать float('+inf') и float('-inf') для представления бесконечностей.
Также на всякий случай Python отлично работает с комплексными числами; import cmath и делать такие вещи, как assert cmath.sqrt(-2j) == (1-1j).
Другой вариант - использовать np.nan вместо определения собственной константы.
^ Это справедливо, но предполагает наличие numpy, о котором вопрос не упоминается.
Правда. Но поскольку он все равно будет импортирован в matplotlib, он должен быть установлен и доступен для использования, даже если это означает добавление дополнительного импорта в код. Просто мои 2 ¢
Хм, хорошо. Я попытался реализовать это так, как вы описали. Кажется, он обрабатывает части NaN, но не рисует его, как я думал. def plotHelper (x, yA, yS, title, trials): yPi = list () yLogN = list () NaN = float ('NaN') для точки в x: yPi.append (point * math.pi) try: yLogN .append (trials * (math.log (abs (trials / 2 - point), 2))) except ValueError: yLogN.append (NaN) Я пробовал описанный вами способ использования функции, но все равно получил ValueError.
Не уверен, как я добавляю изображения, но при построении функции он начинается с x = 0, y = 1000, но он должен начинаться с 1 * log2 (1/2 - 0) иш.
Я понимаю, что это должно быть точка * журнал .... не журнал испытаний * ... Так что все в порядке, спасибо всем!
Можете ли вы создать Минимальный, полный и проверяемый пример