Recurrence network analysis of the logistic mapΒΆ
This tutorial demonstrates how to use timeseries
for a nonlinear time
series analysis of a realization of the chaotic logistic map. It also features
weave
for including fast inline C++ code.
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Tutorial on how to handle recurrence plots and recurrence networks using
Python, based on the timeseries package.
Written as part of a PhD thesis in Physics by Jonathan F. Donges
(donges@pik-potsdam.de) at the Potsdam Institute of Climate Impact Research
(PIK) and Humboldt University Berlin,
Copyright 2008-2015.
"""
# array object and fast numerics
import numpy as np
# C++ inline code
import weave
# plotting facilities
import pylab
from pyunicorn.timeseries import RecurrencePlot, RecurrenceNetwork
#
# Functions
#
def logistic_map(x0, r, T):
"""
Returns a time series of length T using the logistic map
x_(n+1) = r*x_n(1-x_n) at parameter r and using the initial condition x0.
INPUT: x0 - Initial condition, 0 <= x0 <= 1
r - Bifurcation parameter, 0 <= r <= 4
T - length of the desired time series
"""
# Initialize the time series array
timeSeries = np.empty(T)
r = float(r)
code = r"""
int i;
double xn;
// Set initial condition
timeSeries(0) = x0;
for (i = 1; i < T; i++) {
xn = timeSeries(i-1);
timeSeries(i) = r * xn * (1 - xn);
}
"""
args = ['x0', 'r', 'T', 'timeSeries']
weave.inline(code, arg_names=args, type_converters=weave.converters.blitz,
compiler='gcc', extra_compile_args=['-O3'])
return timeSeries
def logistic_map_lyapunov_exponent(timeSeries, r):
"""
Returns the Lyapunov exponent of the logistic map for different r.
INPUT: timeSeries - The time series generated by a logistic map
r - the bifurcation parameter
"""
lyap = np.log(r) + (np.log(np.abs(1 - 2 * timeSeries))).mean()
return lyap
#
# Settings
#
# Parameters of logistic map
r = 3.679 # Bifurcation parameter
x0 = 0.7 # Initial value
# Length of the time series
T = 150
# Settings for the embedding
DIM = 1 # Embedding dimension
TAU = 0 # Embedding delay
# Settings for the recurrence plot
EPS = 0.05 # Fixed threshold
RR = 0.05 # Fixed recurrence rate
# Distance metric in phase space ->
# Possible choices ("manhattan","euclidean","supremum")
METRIC = "supremum"
#
# Main script
#
# Create a time series using the logistic map
time_series = logistic_map(x0, r, T)
# Print the time series
print time_series
# Plot the time series
pylab.plot(time_series, "r")
# You can include LaTex labels...
pylab.xlabel("$n$")
pylab.ylabel("$x_n$")
# Generate a recurrence plot object with fixed recurrence threshold EPS
rp = RecurrencePlot(time_series, dim=DIM, tau=TAU, metric=METRIC,
normalize=False, threshold=EPS)
# Show the recurrence plot
pylab.matshow(rp.recurrence_matrix())
pylab.xlabel("$n$")
pylab.ylabel("$n$")
pylab.show()
# Calculate and print the recurrence rate
print "Recurrence rate:", rp.recurrence_rate()
# Calculate some standard RQA measures
DET = rp.determinism(l_min=2)
LAM = rp.laminarity(v_min=2)
print "Determinism:", DET
print "Laminarity:", LAM
# Generate a recurrence plot object with fixed recurrence rate RR
rp = RecurrencePlot(time_series, dim=DIM, tau=TAU, metric=METRIC,
normalize=False, recurrence_rate=RR)
# Calculate and print the recurrence rate again to check if it worked...
RR = rp.recurrence_rate()
print "Recurrence rate:", RR
# Calculate some standard RQA measures
DET = rp.determinism(l_min=2)
LAM = rp.laminarity(v_min=2)
print "Determinism:", DET
print "Laminarity:", LAM
# Generate a recurrence network at fixed recurrence rate
rn = RecurrenceNetwork(time_series, dim=DIM, tau=TAU, metric=METRIC,
normalize=False, recurrence_rate=RR)
# Calculate average path length, transitivity and assortativity
L = rn.average_path_length()
T = rn.transitivity()
C = rn.global_clustering()
R = rn.assortativity()
print "Average path length:", L
print "Transitivity:", T
print "Global clustering:", C
print "Assortativity:", R