Проблемы с построением частично неопределенной функции

У меня есть задание для моего класса прикладной информатики, в котором мы должны проверить силу и качество алгоритма, который пытается найти 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) 

Можете ли вы создать Минимальный, полный и проверяемый пример

DavidG 19.04.2018 16:47

@DannyData Вы скопировали код точно так, как он выглядит в вашем файле? Отступы важны, и этот код не будет работать должным образом, если тела функций plotHelper и plot не имеют отступа, как вы видите из редактирования Дэвида.

jpaugh 19.04.2018 16:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы не можете представить значение функции в виде числа, вы можете представить его как 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 вместо определения собственной константы.

tmdavison 19.04.2018 17:10

^ Это справедливо, но предполагает наличие numpy, о котором вопрос не упоминается.

9000 19.04.2018 17:15

Правда. Но поскольку он все равно будет импортирован в matplotlib, он должен быть установлен и доступен для использования, даже если это означает добавление дополнительного импорта в код. Просто мои 2 ¢

tmdavison 19.04.2018 17:17

Хм, хорошо. Я попытался реализовать это так, как вы описали. Кажется, он обрабатывает части 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.

DannyData 20.04.2018 15:11

Не уверен, как я добавляю изображения, но при построении функции он начинается с x = 0, y = 1000, но он должен начинаться с 1 * log2 (1/2 - 0) иш.

DannyData 20.04.2018 15:17

Я понимаю, что это должно быть точка * журнал .... не журнал испытаний * ... Так что все в порядке, спасибо всем!

DannyData 20.04.2018 16:15

Другие вопросы по теме