11/10/2015

Chaotic Map: Skew Tent Map

Pada tulisan kali ini, saya akan membanding dua bahasa pemrograman yaitu Python dan Octave dalam hal seberapa cepat mereka menghasilkan angka secara acak. Angka acak sendiri dapat dihasilkan dengan menggunakan fungsi interasi dimana kondisi awal diberikan pada suatu fungsi untuk mendapatkan output yang akan digunakan kembali sebagai input pada fungsi yang sama. Dalam simulasi ini, skew tent map yang didefinisikan seperti pada persamaan di bawah ini digunakan sebagai fungsi yang menunjukkan perilaku acak.

$f(x) =
  \begin{cases}
    \displaystyle \frac{x}{c}       & \quad \text{for } 0 \leq x < c\\
    \displaystyle \frac{1-x}{1-c}       & \quad \text{for } c \leq x \leq 1\\
  \end{cases}
$


Persamaan 1D non-linier diferensial untuk menghasilkan angka acak didefinisikan sebagai berikut

$x_{n+1} = f(x_n)$

Persamaan di atas dalam Python dan Octave dapat dituliskan seperti di bawah ini,

# Python (simpan code berikut dengan nama "main_py.py")
import time
import numpy as np
import matplotlib.pyplot as pL

t0 = time.time()

def tent_map(xi,ci):
  if xi > 0 and xi < ci:
    return xi/ci
  else:
    return (1-xi)/(1-ci)
   
c = 0.31
xo = 0.1
N = 10000000;
x = np.zeros(N)

x[0] = xo
for i in range(1,x.size):
  x[i] = tent_map(x[i-1],c)

pL.figure()
pL.plot(x[:50])

pL.figure() 
pL.hist(x,bins=100,normed=True)
pL.show()

delta_time = time.time() - t0
print '%.4f seconds' % (delta_time)

# Octave (simpan code berikut dengan nama "main_oct.m")
close all
clear
clc

tic
c = 0.31;
xo = 0.1;
N = 10000000;
x = zeros(1,N);

x(1) = xo;
for i = 2:length(x)
  if x(i-1) > 0 & x(i-1) < c
     x(i) = x(i-1)/c;
  else
     x(i) = (1-x(i-1))/(1-c);
  end
end

figure
plot(0:49,x(1:50))

figure
n = linspace(0,1,100);
hist(x,n,length(n))
xlim([0 1])
toc

Dalam code di atas, kita menghasilkan angka acak sebanyak $10^7$ sampel dan hasil running program di atas adalah seperti di bawah ini

# Python
In [8]: %run main_py.py
18.0477 seconds

50 angka acak pertama
Probability density function (*menunjukkan distribusi normal)

# Octave
octave:10> main_oct
Elapsed time is 113.463 seconds.

50 angka acak pertama
Probability density function (*menunjukkan distribusi normal)

# Download code.
Untuk code dapat didownload di link ini.
Selamat mencoba,.

No comments:

Post a Comment