В качестве расширения моего предыдущего проекта, где уравнение X[i+1]=R*X[i](1-X[i])
используется для демонстрации хаотической системы (в зависимости от R). Теперь я пытаюсь построить бифуркационный граф.
Что касается кода, я определил функцию для выполнения фактических вычислений и извлечения последних 100 вычисленных значений (для обеспечения достижения равновесия), чтобы построить разветвленную зависимость R от x[i], я добавляю каждое значение R в пустой список X-данных и несколько (то есть возвращаемые 100 значений) x[i] в список Y-данных (так что на самом деле это вложенный список...)
Дело в том, что в зависимости от значения R x[i] может быть либо одним значением (после достижения равновесия), либо несколькими значениями. Поэтому я подумал «очистить» вложенный список Y-данных с помощью numpy.unique(), чтобы удалить все реплицированные значения.
Странно, но когда я не делаю дополнительный шаг "очистки", код действительно работает.
Но когда я ввожу x = np.unique(logistic_calc(R,N))
, мне выдает ошибку ValueError: setting an array element with a sequence.
Ниже приведен работающий код...
import numpy as np
import matplotlib.pyplot as plt
R = 0.2
N = 10_000
x0 = 0.5
def logistic_calc(R,N):
x = np.empty(N)
x[0] = x0
for i in range(1, N):
x[i] = R* x[i-1] * (1 - x[i-1])
return x[-100:]
x_lst = []
y_lst = []
for r in np.linspace(0.1,4,100):
R = r
x = logistic_calc(R,N)
x_lst.append(r)
y_lst.append(x)
plt.figure(figsize=(7, 4))
plt.plot(x_lst, y_lst, ls='', marker='.',ms='0.5', c="royalblue")
plt.ylim(0, 1)
plt.grid(c="lightgray")
plt.xlabel(r"$r$")
plt.ylabel(r"$x_n$")
plt.show()
Привет спасибо за быстрый ответ. Теперь я примерно понимаю проблему. По сути,
plt.plot
отрисовывает несколько наборов, когда либо x-данные, либо y-данные имеют более 1 измерения, поэтому проблема сопоставления размеров требует внимания. Тогда мне интересно, когда несколько y-данных соответствуют одному x-данным, может лиplt.scatter
быть решением? Или это в основном следует той же идее, что иplt.plot
...?Например,
plt.plot(x=[0, 1, 2, 3], y=[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
будет работать сlen(x) == len(y)
и означает создание следующих 3 графиковplt.plot([0, 1, 2, 3], [1, 4, 7, 10])
,plt.plot([0, 1, 2, 3], [2, 5, 8, 11])
иplt.plot([0, 1, 2, 3], [3, 6, 9, 12])
. Вот почему все подсписки должны иметь одинаковое количество элементов. Таким образом, в первом случае, когдаx_lst
представляет собой простой список длиныnR
, аy_lst
содержитnR
списки длиныm
,plt.plot(x_lst, y_lst)
следует рассматривать как ""Нарисуй меня горизонтально""m
> строк(x_lst, y_lst[i])
".И
plt.scatter
строго требует, чтобыx
иy
были одного размера. Обратите внимание, чтоplt.scatter
обрабатывает каждую точку как отдельный объект, аplt.plot
с аргументомo
обрабатывает их как одну линию. Следовательно, если вы хотите, чтобы все точки имели одинаковый вид, всегда используйтеplt.plot
.