Source code for signalz.generators.mackey_glass
"""
.. versionadded:: 0.1
.. versionchanged:: 0.2
This function generates data according a discrete realization of Mackey-Glass
equation as follows
:math:`x_{k+1} = c \cdot x_k + \\frac{\large{a \cdot x_{k-d}}}{b + x^{e}_{k-d}}`
The original Mackey-Glass equation :cite:`glass2010mackey` is the nonlinear
time delay differential equation.
Example Usage
===============
In this example is simulated 1000 samples with arguments that cause
chaotic behaviour.
.. code-block:: python
N = 1000
x = signalz.mackey_glass(N, a=0.2, b=0.8, c=0.9, d=23, e=10, initial=0.1)
The parameters `a`, `b`, `c`, `d`, `e` can be a scalar or a vector. In case
of a vector, every item represents parameter for one sample.
References
============
.. bibliography:: mackey_glass.bib
:style: plain
Function Documentation
======================================
"""
import numpy as np
import signalz
[docs]def mackey_glass(n, a=0.2, b=0.8, c=0.9, d=23, e=10, initial=0.1):
"""
Mackey-Glass discrete equation.
**Args:**
* `n` - length of the output data (int) - how many samples will be on output
**Kwargs:**
Parameters `a`, `b`, `c`, `d`, `e` can be a scalar or a vector. In case
of a vector, every item represents parameter for one sample.
* `a` - parameter of the model (float, 1d array), default is 0.2
* `b` - parameter of the model (float, 1d array), default is 0.8
* `c` - parameter of the model (float, 1d array), default is 0.9
* `d` - time delay of the model (int, 1d array), default is 23
* `e` - parameter of the model (float, 1d array), default is 10
* `initial` - initial value (float), default is 0.1
**Returns:**
* `x` - output of Mackey-Glass equation
"""
x = np.zeros(n)
x[0] = initial
d = int(d)
a = signalz.vectorize_input(a, n)
b = signalz.vectorize_input(b, n)
c = signalz.vectorize_input(c, n)
d = signalz.vectorize_input(d, n).astype("int")
e = signalz.vectorize_input(e, n)
for k in range(0,n-1):
x[k+1] = c[k]*x[k] + ( (a[k]*x[k-d[k]]) / (b[k] + ( x[k-d[k]]**e[k])) )
return x