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}
$
\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)
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
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
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.
octave:10> main_oct
Elapsed time is 113.463 seconds.
50 angka acak pertama |
Probability density function (*menunjukkan distribusi normal) |
No comments:
Post a Comment