Showing posts with label MATLAB. Show all posts
Showing posts with label MATLAB. Show all posts

Thursday, October 31, 2013

Plot animasi sinusoidal di MATLAB

Berikut ini adalah contoh plot animasi sinusoidal di MATLAB


Adapun source codenya adalah
clc ;
awal = 0; 
akhir = 2*pi ; 
f = figure; 
temp = awal + .1;
step =0.05;
while ishandle(f) && temp <= akhir
 x = awal:step:temp;
 plot(x,sin(2.*x),'-ro'); 
 axis([0  akhir  -1 1]);
 drawnow;
 temp = temp+ step;
 pause(0.02);
end

while ishandle(f)
 awal = awal + step; 
 akhir = akhir + step; 
 x = awal:.025:akhir;
 plot(x,sin(2.*x),'-ro'); 
 axis([awal  akhir  -1 1]);
 drawnow;
 pause(0.02);
end
disp('program selesai'); 

Tuesday, October 29, 2013

Membuat 2 plot dalam satu figure di MATLAB

Berikut adalah source code membuat dua plot dalam satu figure di MATLAB.
function main
f = figure('menubar', 'none', 'position', [200 100 780 500]); 
panel_plot = uipanel('title', 'plot area', ...
            'units', 'pix', ...
            'positioN', [10 50 750 400] , ...
            'fontsize', 12);

g0 =axes('units','pixels','position',[50  50  300 300], ...
    'xlim', [0 (2*pi)], ... 
    'parent', panel_plot);

g1 =axes('units','pixels','position',[400 50   300 300], ...
    'xlim', [0 (2*pi)], ... 
    'parent', panel_plot);

x = 0:.1:2*pi; 
plot(x, sin(x), 'parent', g1); 
plot(x,sin(x.^2), 'parent', g0); 
Dengan contoh plot

Wednesday, July 17, 2013

Jawaban soal nomor dua pelatihan MATLAB

Bagi teman-teman sekalian yang mungkin belum mengetahui bagaimana jawaban soal nomor dua, berikut saya berikan listingnya. Silakan dicoba sendiri di rumah. Semoga bermanfaat
% jawaban nomor dua
function plot_bolak_balik
clc;
f = figure('menubar', 'none');
x = linspace(45 ,405,100);
y1 = cosd(x);
y2 = sind(x);
plot(x, y1, 'b.- ', x, y2, 'g.-'); % untuk menjaga sumbunya konstan
hold on ;
i = 1;
state = true;
while ishandle(f),
    if state
        p = plot(x(i), y1(i), 'r.' , 'Markersize' ,30);
        if(i == numel(x) ), state = false; i = i - 1;  end
        i = i+ 1;
        pause(0.02);
        if ishandle(p),delete(p); end
    else
        p = plot(x(i), y2(i), 'r.' , 'Markersize' ,30);
        if(i ==  1 ), state = true ; i = i+ 1;  end
        i = i- 1;
        pause(0.02);
        if ishandle(p),delete(p); end
    end
end
Adapun hasil cuplikan animasinya adalah sebagai berikut

Hubungan ukuran array dengan performa indeks di MATLAB

Posting kali ini masih berhubungan dengan posting saya sebelumnya. Cuma pada bagian ini saya akan memperlihatkan bagaimana hubungan antara ukuran array dengan lama eksekusi dengan metode indeks. Ternyata hasil yang diperoleh meunjukkan bahwa dengan menggunakan looping di MATLAB, waktu eksekusi yang diberikan bertambah secara signifikan dan cenderung eksponensial. Sementara dengan bantuan indeks, waktu eksekusi datar-datar saja. Adapun codenya bisa dilihat pada listing berikut
function indeks1
clear all ; 
clc; 
step = 100:50:700; 
cara1 = zeros(length(step),1); 
cara2 = zeros(length(step),1); 
for ii=1:numel(step)
    % first way, iterate trough looping
    dim = step(ii);
    Y  = zeros(dim,dim) ; 
    tic ; 
    for i=1:length(Y), 
        for j=1:length(Y(1,:)),
            if mod(i+j, 2) == 0
                Y(i,j) = 2; 
            else
                Y(i,j) = 1;
            end
        end
    end
    cara1(ii) = toc; 

    % second way, using MATLAB index
    X  = zeros(dim,dim) ;
    tic; 
    [a,b] = ind2sub(size(X), 1:numel(X)) ;
    X((mod(a+b, 2) ==0))  = 2; 
    X((mod(a+b, 2) > 0)) = 1; 
    cara2(ii) = toc;
end

plot(step, cara1, 'r.-', step, cara2, 'g.-' )

disp('Is the first  get the same output with the second?')
indeks = find(Y(:,:) ~= X(:,:));
xlabel('ukuran array'); 
ylabel('lama eksekusi dalam detik'); 
if(numel(indeks) ==  0),
   disp('oh... yes..  '); 
end
Di mana saya sudah melakukan perubahan time step dalam rentang yang berbeda-beda. Pada hasilnya juga diperlihatkan bahwa penggunaan indeks ini sangat terasa ketika ukuran array semakin besar.
Anda bisa mengetes sendiri untuk selang waktu yang lain. Tentunya MATLAB membatasi kita dalam mengalokasikan array, mengingat kapasitas memori yang terbatas. Untuk mengetahui kapasitas memori di komputer anda, matlab menyediakan perintah memory yang bisa digunakan untuk memperkirakan kapasitas array yang bisa anda alokasikan. 







Performa indeks di MATLAB bagian 2

Pada kesempatan kali ini sekali lagi saya menekankan pentingnya menghindari looping dalam pemrograman MATLAB. Kebetulan ini merupakan soal yang saya berikan dalam pelatihan MATLAB kemarin kepada teman-teman. Saya g tau apa ini bisa dikerjakan atau tidak, yang jelas saya kasikan aja jawabannya, sekalian berbagi pengetahuan. Semoga bisa diambil manfaatnya.

Soalnya adalah diberikan sebuah matriks yang ukurannya 1000 x 1000. Kenapa 1000 x 1000, karena biar kita terbiasa dengan perhitungan sesungguhnya di lapangan. Pada matriks ini,  sederhana saja yang dilakukan yakni, jika penjumlahan baris dan kolom genap, isi matriks tersebut dengan angka dua, sementara jika ganjil, isi dengan 1. Adapaun hasil codingnya adalah sebagai berikut.

Jadi terlihat jelas bahwa performa indeks 10 kali lipat lebih cepat ketimbang pake looping.

Tuesday, July 9, 2013

Performa indeks dalam mengganti logika if di MATLAB

Posting ini berkaitan dengan posting saya sebelumnya yakni tentang vektorisasi molekular dinamik di MATLAB:
yang sampai saat ini masih menyisakan pertanyaan besar di kepala saya. Antara lain, mengapa vektorisasi justru membutuhkan waktu lebih lama, serta yang kedua, entah kenapa simulasinya g sesuai dengan yang diharapkan: terjadi kolaps setelah waktu tertentu dan perpindahan posisi yang cukup lambat ketimbang companion-nya yang dibuat di java [1]. Dalam menyelidiki masalah ini saya sekali lagi pengen menunjukin kenapa vektorisasi itu penting di MATLAB dan sebisa mungkin kita harus menghindari loop dalam menulis program di MATLAB.

Oleh karena itu saudara bisa menyimak listing berikut

Terlihat jelas bahwa penggunaan indeks di MATLAB bisa digunakan untuk mengganti logika if pada looping. Lantas bagaimana dengan performanya. Pada listing berikut ini telah saya ukur bagaimana performa dari indeks sendiri.

Yang mana menunjukkan bahwa dengan menggunakan indeks kita bisa mengurangi waktu eksekusi program hingga sampai setengahnya. Hal ini jelas disebabkan oleh perintah indeks sendiri ditangani secara 'native' oleh MATLAB interpreter.

Fakta kedua yang bisa digaris bawahi adalah ternyata dua fungsi dalam satu file pada MATLAB alokasi eksekusinya  ditempatkan pada core processor yang berbeda seperti  sudah saya komentari pada listing di atas.


1. Ternyata perintah axis manual di MATLAB hanya berlaku ketika ada perintah  hold on.

Sunday, July 7, 2013

Vektorisasi loop molekular dinamik di MATLAB


Pada banyak kasus tidak selamanya dokumentasi resmi itu bisa dipercaya. Atau secara umum tidak semua buku yang kita baca di bangku kuliah itu bisa dipercaya. Contohnya waktu adanya sindrom HIV AIDS tahun 80-an. Semua orang menduga bahwa penyakit ini disebabkan oleh hubungan sesama jenis dan ini menjadi asumsi standar dalam prosedur  pemeriksaan dokter pada dekade tersebut. Akibatnya apa, banyak orang yang sebenarnya tertular penyakit tersebut, akan tetapi karena  semua dokter pada saat itu rujukannya pada buku yang menyatakan HIV itu hanya tertular melalui hubungan sesama jenis, tidak bisa mendapatkan penanganan yang sesuai. Nanti baru seorang Magic Johnson yang notabene orang berduit yang mengeluhkan gejala tersebut, barulah dokter-dokter berfikir di luar kotak. Padahal dengan diagnosis singkatpun seharusnya bisa disimpulakan: bagaimana mungkin seorang pebasket homo? Ajaibnya Magic Johnson mampu membayar untuk tes lebih lanjut.

Hal ini berlaku pula dalam dunia pemrograman. Dalam dokumentasi resmi MATLAB yang saya ambil di link http://www.mathworks.com/help/matlab/matlab_prog/techniques-for-improving-performance.html disebutkan bahwa agar program MATLAB bisa berjalan dengan lebih cepat maka salah satu cara yang bisa digunakan adalah menggunakan pre-alocating array dan menghindari penggunaan looping:
http://stackoverflow.com/questions/12074373/matlab-vectorization-how-to-avoid-this-for-loop
http://stackoverflow.com/questions/16214891/how-to-avoid-a-for-loop-in-matlab-when-performing-a-operation-on-each-row-in-a
Akan tetapi baru-baru ini saya mencoba mengetes dugaan tersebut dalam simulasi molekular dinamik. Dan ternyata hasilnya tidak sesuai yang ada pada buku. Rupanya pengembangan MATLAB akhir-akhir ini cenderung melakukan optimisasi pada looping ketimbang prosedur standar (yakni operasi matriks) yang merupakan brand dari MATLAB.

Simulasi molekular dinamik sendiri saya translate dari sumber di
http://www.personal.psu.edu/auk183/MolDynamics/Molecular%20Dynamics%20Simulations.html
Yang aslinya dikembangkan dengan bahasa java. Setelah melakukan debugging yang susah payah, akhirnya saya berhasil mengembangkan versi MATLAB nya: menggunakan teknik vektorisasi yang menjadi brand MATLAB ketimbang menggunakan looping yang katanya  mengurangi performa. Berikut merupakan kode hasil vektorisasi tersebut

Adapun kode hasil translate secara 'mentah' adalah sebagai berikut

Setelah dieksekusi terlihat bahwa hasil penggunaan loop bukannya memperlambat performa, malah mempercepat performa dari program MATLAB sendiri. Rata-rata waktu eksekusi looping berada di sekitar 0.03 detik, sementara hasil vektorisasi ternyata membutuhkan waktu 3 kali lebih lama yani berada di sekitar 0.1 detik.

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.


Plot gerak jatuh bebas di MATLAB

Buat teman-teman sekalian yang ingin belajar plot gerak jatuh bebas di MATLAB berikut saya berikan sedikit tutorial. Semoga bermanfaat:




Wednesday, January 30, 2013

Belajar baca dan tulis file excel dengan MATLAB

Berikut ini adalah tutorial membaca dan menulis file excel dengan MATLAB. Sebenarnya ada cara lain yang lebih bagus. Cuma anda boleh menggunakan cara ini sebagai perbandingan. Kendatipun hakikatnya intinyapun sama (menggunakan ActiveX ).

Tuesday, January 29, 2013

Belajar GUI di MATLAB

Pada tulisan kali ini saya akan memberikan sebuah tutorial sederhana mengenai pemrogaraman GUI di MATLAB. Kebetulan ini tutorial pertama tentang GUI, jadi saya ambil satu contoh familiar yakni bagaimana memplot fungsi sinusoidal dengan GUI. Sebenarnya kalo anda ingin pahami benar bagaimana GUI di MATLAB bekerja, ada baiknya jangan gunakan GUIDE (gui builder default). MEndingan langsung koding langsung dari scriptnya. Di samping membantu pemahaman anda ---- khususnya jika GUI yang dibuat makin rumit ---- juga memperkuat ingatan. Kata teman saya, dengan menulis maka ingatan kita tentang sesuatu semakin bagus.
Biar lebih paham, silakan copy-paste source berikut ke komputer anda, dan langsung dijalankan. Kebetulan pada komennya sudah diberikan penjelasannya.

function runGUI
% dibuat oleh Mohammad Fajar pada malam selasa (29/1/2013)
clc;
init();
% dalam GUI matlab, container kedua tertinggi adalah figure... 
% yang pertama tertinggi  adalah root yang merupakan  monitor
fig = ... 
    figure('name', 'Test Sin', ...
         'numbertitle', 'off', ...
         'position' , [200, 100, 500,500], ...% relatif terhadap 
         'menubar' , 'none'  ...              % monitor
         );
     
% panel yang digunakan untuk memanajemen control-control 
panel_control =  uipanel( ...
        'title', 'Control Panel', ...
        'units', 'pix', ...
        'fontsize', 12, ...
        'backgroundcolor', 'white', ... 
        'position',[10 10 480 100] ...  % relatif terhadap 'fig'
        );

buttonStart = uicontrol('units','pix',...
          'style','pushbutton',...
          'parent', panel_control, ...
          'position',[10 10  90 25],...  % relatif terhadap 'panel_control'
          'fontweight','bold',...
          'fontsize',12,... 
          'string','draw',...
          'HorizontalAlignment' , 'right', ...
          'callback',@start ...  % memanggil fungsi 'start' 
          );
      
% untuk button ini kita akan gunakan unit centimeter...
% sementara pada button sebelumnya (button start) yang digunakan adalah
% unit pixels (atau disingkat 'pix'  ==> dalam matlab terdapat kemudahan
% dengan menggunakan singkatan)
% cuma saya bingung yang mana bisa disingkat, yang mana tidak...
% demi amannya mending g usa disingkat..... 
buttonPause  = uicontrol('units', 'centimeters', ...
            'style', 'pushbutton',... 
            'parent' , panel_control , ... 
            'position', [ .24  1.0   2.5   .7], ...  % rel. terhadap 'panel_control'
            'fontsize', 12, ...
            'fontweight', 'bold', ...
            'string', 'delete', ...
            'HorizontalAlignment', 'left', ... 
            'callback', @pause );  % memanggil fungsi 'pause' 
        
% ingat parameter-parameter pada MATLAB selain bisa disingkat juga tidak
% mengenal case-sensitiv ... alias tidak peduli huruf besar atau huruf
% kecil .... jadi 'Position' atau 'posiTion' hasilnya sama saja...
% sepanjang hurufnya tidak kurang atau lebih.... 


% selanjutnya akan dibuat panel untuk memanajemen daerah plotting 
panel_plot = uipanel('title', 'plot area', ...
            'units', 'pix', ...
            'positioN', [10 120 480 370] , ...
            'backgrounDcolor', 'cyan', ...
            'fontsize', 12);

% sekarang tambahkan plot area 
% saya ga' tau kenapa, yang jelas untuk object "axis" tidak dibolehkan 
% untuk menggunakan units selain 'inch'
global g;
g =axes('position',[.1  .1  .86  .87], ...
        'xlim', [0 (2*pi)], ... 
        'parent', panel_plot);
% mesh(peaks(20));
end

function init()
global x;
x = linspace(0,2*pi , 400 );
end 

function []  = start(varargin)
global x;
global hline;
hline = plot(x,sin(x));
end

function [] =  pause(varargin)
% gunanya untuk menghapus plotting 
cc = get(gcf, 'CurrentAxes');
aa = get(cc, 'Children');
delete(aa);
end