Построить решетку связанных карт, используя 2D массив - PullRequest
0 голосов
/ 21 января 2020

Итак, я пытаюсь построить решетку связанных карт на моем компьютере.

Решетка связанных карт (CML) задается следующим уравнением:

The equation

, где функция f (Xn) - логистика c карта:

The function

со значением x от 0-1 и r = 4 для этого CML.

Примечание: 'n' можно рассматривать как время, а «я» - как пространство

Я потратил много времени на понимание итераций, и я придумал код, приведенный ниже, однако я не уверен, правильно ли это код для итерации этого уравнения.

Примечание: Я использовал массивы 2d numpy, где строки - это «n», а столбцы - «i», как видно из кода.

В общем, я хочу разработать код для имитации этого уравнения, и вот мой взгляд на это

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

import numpy as np
import matplotlib.pyplot as plt

'''The 4 definitions created below are actually similar and only vary in their indexings. These 4 
   have been created only because of the if conditions I have put in the for loop '''
def logInit(r,x):
    y[n,0]=r*x[n,0]*(1-x[n,0])
    return y[n,0]

def logPresent(r,x):
    y[n,i]=r*x[n,i]*(1-x[n,i])
    return y[n,i] 

def logLast(r,x):
    y[n,L-1]=r*x[n,L-1]*(1-x[n,L-1])
    return y[n,L-1] 

def logNext(r,x):
    y[n,i+1]=r*x[n,i+1]*(1-x[n,i+1])
    return y[n,i+1]

def logPrev(r,x):
    y[n,i-1]=r*x[n,i-1]*(1-x[n,i-1])
    return y[n,i-1]

# 2d array with 4 row, 3 col. I created this because I want to store the evaluated values of log 
  function into this y[n,i] array

y=np.ones(12).reshape(4,3)

# creating an array of random numbers between 0-1 with 4 rows 3 columns  

np.random.seed(0)
x=np.random.random((4,3))

L=3
r=4
eps=0.5

for n in range(3):
    for i in range(L):


        if i==0:
            x[n+1,i]=(1-eps)*logPresent(r,x) + 0.5*eps*(logLast(r,x)+logNext(r,x))

        elif i==L-1:
              x[n+1,i]=(1-eps)*logPresent(r,x) + 0.5*eps*(logPrev(r,x) + logInit(r,x))

        elif i > 0 and i < L - 1:
             x[n+1,i]=(1-eps)*logPresent(r,x) + 0.5*eps*(logPrev(r,x) +logNext(r,x))

        print(x)

Это действительно дает вывод. Вот оно:

[[0.5488135  0.71518937 0.60276338]
 [0.94538775 0.82547604 0.64589411]
 [0.43758721 0.891773   0.96366276]
 [0.38344152 0.79172504 0.52889492]]

[[0.5488135  0.71518937 0.60276338]
 [0.94538775 0.82547604 0.92306303]
 [0.2449672  0.49731638 0.96366276]
 [0.38344152 0.79172504 0.52889492]]

[[0.5488135  0.71518937 0.60276338]
 [0.94538775 0.82547604 0.92306303]
 [0.2449672  0.49731638 0.29789622]
 [0.75613708 0.93368134 0.52889492]]  

Но я уверен, что это не то, что я ищу.

Если вы можете найти правильный способ итерации и l oop уравнение CML с кодом? Предложите мне изменения, которые я должен сделать. Большое спасибо!!

Вам нужно будет подумать об итерациях и циклах, которые необходимо выполнить для моделирования этого уравнения. Это может быть утомительно, но только так вы можете предложить мне некоторые изменения в моем коде.

1 Ответ

0 голосов
/ 22 января 2020

Ваши расчеты мне кажутся нормальными. Вы можете улучшить скорость, используя векторизацию по пространственному измерению и повторно используя промежуточные результаты y. Я немного реструктурировал вашу программу, но по сути она делает то же самое, что и раньше. Для меня результаты выглядят правдоподобно. На рисунке показан случайный начальный вектор в первой строке, и с течением времени (сверху вниз) включается связь, и образуются маленькие островки и узоры.

import numpy as np
import matplotlib.pyplot as plt

L = 128  # grid size
N = 128  # time steps 
r = 4
eps = 0.5

# Create random values for the initial time step
np.random.seed(0)
x = np.zeros((N+1, L))
x[0, :] = np.random.random(L)

# Create a helper matrix to save and reuse part of the calculations
y = np.zeros((N, L))

# Indices for previous, present, next position for every point on the grid
idx_present = np.arange(L)        #   0, 1, ..., L-2, L-1
idx_next = (idx_present + 1) % L  #   1, 2, ..., L-1, 0
idx_prev = (idx_present - 1) % L  # L-1, 0, ..., L-3, L-2

def log_vector(rr, xx):
    return rr * xx * (1 - xx)

# Loop over the time steps
for n in range(N):
    # Compute y once for the whole time step and reuse it 
    # to build the next time step with coupling the neighbours
    y[n, :] = log_vector(rr=r, xx=x[n, :])
    x[n+1, :] = (1-eps)*y[n,idx_present] + 0.5*eps*(y[n,idx_prev]+y[n,idx_next])

# Plot the results
plt.imshow(x)

resulting grid with N=L=128, r=4, eps=0.5

...