Ошибка «‘<' не поддерживается между int и NoneType"

#python #matplotlib

#python #matplotlib

Вопрос:

Я работаю над созданием диаграмм бифуркации. Я могу сгенерировать их с помощью уравнений

 rx(1-x)
rsin(pi x)
  

но когда я переключаюсь на них, он выдает вышеупомянутую ошибку.

 f(x)=2rx for 0 < x < 1/2
2r(1-x) for 1/2 < x < 1
  

введите описание изображения здесь

Я не могу понять, откуда может возникнуть ошибка. Я попытался уменьшить n и распечатать x, но это не помогло мне сузить круг поиска. Это остановило бы меня, но я не могу придумать, что заставило бы это сделать. Итерация выполняется через x и r, которые оба являются действительными числами.

Я создал предыдущую версию на основе этого руководства: https://ipython-books.github.io/121-plotting-the-bifurcation-diagram-of-a-chaotic-dynamical-system / . Я не мог точно понять, что с ним происходит, когда мне нужно было переключиться на тот же набор уравнений. Поэтому я решил перестроить его, чтобы попытаться лучше понять.

 import matplotlib.pyplot as plt
import math

def sequence(r, x):
    #these two work well
    #return r * x * (1 - x)
    #return r * math.sin(math.pi * x)
    
    if 0 < x and x < 1/2:
        return 2 * r * x
    
    if 1/2 < x and x < 1:
        return 2 * r * (1 - x)

rmin = 0.5
rmax = 1.5
n = 6000
r = []

for i in range(n):
    r.append(rmin   (rmax - rmin) * i / n)

iterations = 1000
last = 100

x0 = 0.1

bifurcation = []

for i in r:
    points = []
    points.append(sequence(i, x0))
    
    for j in range(iterations):
        x = sequence(i, points[j - 1])
        
        points.append(x)
        
        if j >= iterations - last:
            bifurcation.append(x)
    
plt.plot(bifurcation, 'ko', markersize = 0.1, alpha = 0.25)
plt.show()
  

Комментарии:

1.В тот же момент x становится None . Добавьте try except предложение вокруг вашего оператора if, когда он попадает в печать исключения x .. Это так None . Если это правильно, вам нужно pass исключение, если нет, вам нужно больше копаться в x том, почему None

2. Я всегда забываю перехват ошибок. Это была невероятно краткая тема в моей степени и никогда не применялась. К сожалению. Я это сделаю! Спасибо!

Ответ №1:

Добавьте некоторую точку, которую вы вызываете sequence(1.0, 0.5) , которая возвращается None , потому что она падает с нижней части. Затем это значение передается как x при более позднем вызове sequence , и вы получаете указанную ошибку.

Извините, ваш код немного слишком запутан, чтобы я мог понять что-либо помимо этого.

Комментарии:

1. Правильно. В моем предыдущем решении я использовал numpy.where(…) для двух уравнений. А затем добавил два решения и удалил нули с return x[x != 0] помощью . Теперь я чувствую себя глупо. Надеюсь, это будет так же просто, как оператор if, когда я вернусь к нему через несколько часов.

2. Также. Что значит запутанный? Я всегда открыт для улучшения своего кодирования.

3. Просто для меня не было очевидно, каким был поток программы. Я мог бы сказать x , что это был как вывод функции sequence , так и ввод в нее, но я не мог понять, как это работает. Я уверен, что если бы я действительно знал, что вы делаете в своем коде, все это имело бы смысл.

4. В качестве дополнительного вопроса я настоятельно рекомендую вам изменить sequence . Функция, которая должна возвращать значение, никогда не должна иметь пути с пропуском и возвратом. Либо возвращайте какое-то разумное значение, либо имейте утверждение, что вы не можете туда добраться.

Ответ №2:

обратите внимание на вашу функцию sequence , в некоторых случаях она ничего не возвращает (что неявно фактически возвращает None ), в этом случае вы добавляете None в свой список и далее отправляете его обратно в функцию, как вы можете видеть из модифицированного примера:

 def sequence(r, x):
    #these two work well
    #return r * x * (1 - x)
    #return r * math.sin(math.pi * x)
    if 0 < x and x < 1/2:
        return 2 * r * x
    
    if 1/2 < x and x < 1:
        return 2 * r * (1 - x)
    
    print(f"return None, because {x} was not in any of cases above")


# return None, because 0.5 was not in any of cases above
  

далее, когда вы вызываете его снова, вы сравниваете с None , обрабатываете все случаи в функции и возвращаете допустимые значения, и это сработает!