#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
, обрабатываете все случаи в функции и возвращаете допустимые значения, и это сработает!