Hennon Map for a=1.4 and b=0.3. |
Let's first shortly remember the definition of the Hennon Map
$ x_{n+1} = y_{n} + 1 - \alpha x_{n}^2 $
$ y_{n+1} = \beta x_{n} $
It is known that for parameter ranges $\alpha \in [1.16, 1.41]$ and $\beta \in [0.2, 0.3]$ map generates chaotic behaviour i.e. sensitive dependence on initial conditions.
Here is a MATLAB function that generates a png file for a given parameters, initial condition values, file name and the upper bound for the iteration.
function hennonMap(a, b, xn, yn, upper, filename) % HENNONMAP generate hennon map at given parameters and initial conditions % % Mehmet Suzen % msuzen on gmail % (c) 2013 % GPLv3 % % a \in [1.16 1.41] % b \in [0.2, 0.3] % % Example of running this in the command line % > matlab -nodesktop -nosplash -logfile my.log -r "hennonMap(1.4, 0.3, -1.0, -0.4, 1e4, 'hennonA1.4B0.3.png'); exit;" % Xval = zeros(upper, 1); Yval = zeros(upper, 1); for i=1:upper Xval(i) = xn; Yval(i) = yn; x = yn + 1 - a*xn^2; y = b * xn; xn = x; yn = y; end h = figure plot(Xval, Yval,'o') title(['Henon Map at ', sprintf(' a=%0.2f', a), sprintf(' b=%0.2f', b)]) xlabel('x') ylabel('y') print(h, '-dpng', filename) end
Running this function from a command line, as described in the function help, would generate the figure shown above. Now imagine that we need to generate many plots with different ICs. It is easy to open many shells and run from command line many times. However it is a manual task and we developers do not like that at all! Python would help us in this case, specifically its multiprocessing module, to spawn the process from a single script. The concept here is closely related to threading, while multiprocessing module mimics threading API.
For example, let's say we have 16 cores and we would like to generate Henon maps for 16 different initial conditions. Here is a Python code running the above Hennon Map function by invoking 16 different MATLAB instances with each using different ICs:
# # Mehmet Suzen # msuzen on gmail # (c) 2013 # GPLv3 # # Run Hennon Map on multi-process (spawning processes) # from multiprocessing import Pool import commands import numpy import itertools def f(argF): a = '%0.1f' % argF[0] b = '%0.1f' % argF[1] filename = "hennonA" + a + "B" + b + ".png" commandLine = "matlab -nodesktop -nosplash -logfile my.log -r \"hennonMap(1.4, 0.3," + a + "," + b + ", 1e4, '" + filename + "'); exit;\"" print commandLine return commands.getstatusoutput(commandLine) if __name__ == '__main__': pool = Pool(processes=12) # start 12 worker processes xns = list(numpy.linspace(-1.0, 0.5, 4)) yns = list(numpy.linspace(-0.4, 1.1, 4)) print pool.map(f, list(itertools.product(xns, yns)))
It would be interesting to do the same thing only using R. Maybe in the next post, I'll show that too.