Saturday, July 6, 2013

Belajar Monte Carlo di MATLAB

Berikut saya berikan contoh program tentang bagaimana menghitung luas poligon dengan metode monte carlo. Saya harap dengan pemahaman ini, teman-teman semua bisa memahami hakikat dari monte carlo. Sehingga bisa menggunakannya untuk keperluan-keperluan lainnya.


% http://www.mathworks.com/matlabcentral/fileexchange/17964-monte-carlo-sim
% ulations-using-matlab
function monte_carlo
clc;
maxsize = 100; % faktor skala, 100 maksimum
NbMaxPoints = 15; % makin banyak, makin banyak sudut convex hull
figure;
% bangkitkan titik-titik secara acak lalu kumpulkan titik-titik yang
% membentuk convex set (https://en.wikipedia.org/wiki/Convex_set)
Points = maxsize*rand(NbMaxPoints,2);
K = convhull(Points(:,1),Points(:,2));
xpoly = Points(K,1);
ypoly = Points(K,2);
% plot convex hull
plot(xpoly,ypoly,'r','LineWidth',2);
hold on;
% bangkitkan titik-titik secara acak sebanyak 2500
RandomPoints = maxsize .* rand(2500,2);
% periksa titik-titik mana saja ada dalam convex hull
% simpan dalam IN
% http://stackoverflow.com/questions/10673740/how-to-check-if-a-point-x-y-i
% s-inside-a-polygon-in-the-cartesian-coordinate-sy
IN = inpolygon(RandomPoints(:,1),RandomPoints(:,2),xpoly,ypoly);
% bandingkan jumlah titik-titik di dalam convex hull dengan
% titik-titik di luar convex hull, kemudian kalikan skala
% yang hasilnya merupakan luas convex hull dengan
% metode monte carlo
Area = maxsize .* maxsize * sum(IN) ./ 2500;
% Hitung luas convex hull secara 'eksak' (bukan pake monte carlo)
% http://alienryderflex.com/polygon_area/
Area1 = polyarea(xpoly,ypoly);
% plot titik-titik dalam convex hull
plot(RandomPoints(IN,end-1),RandomPoints(IN,end),...
'g.','LineWidth',1.5);
% plot titik-titik di luar convex hull
plot(RandomPoints(~IN,end-1),...
RandomPoints(~IN,end),'rx','LineWidth',1.5);
% tampilkan luas area convex set berdasarkan monte carlo dan yang secara 'eksak'
disp(['Area of the Polygon -> '...
num2str(Area1)]);
disp(['Estimated Area of the Polygon -> ' ...
num2str( Area)]);
view raw monte_carlo.m hosted with ❤ by GitHub