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

Sunday, July 1, 2018

Perbandingan Lama eksekusi perhitungan determinan matriks di MATLAB dengan beberapa metode

Dalam postingan kali ini saya akan memberikan contoh perbandingan perhitungan determinan matriks di MATLAB. Dalam menghitung determinan matriks ini saya gunakan tiga cara. Pertama dengan menggunakan metode eliminasi Gauss. Kedua dengan menggunakan metode ekspansi Laplace. Dan yang ketiga dengan menggunakan perintah built-in "det" di MATLAB, yang menurut informasi yang saya perolah juga dilakukan dengan menggunakan metode eliminasi Gauss.

Matriks yang akan dihitung determinannya adalah matriks persegi yang dibangkitkan secara acak oleh perintah "randi" di MATLAB. Sehingga kita bisa melihat berapa akurasi perhitungan antara ketiga metode ini beserta lama eksekusinya. Untuk keperluan tersebut, saya bagikan saja mi skripnya
function testLamaEksekusiDeterminanMatriks()
clear all; 
clc; 
% alokasi matriks persegi dengan bilangan integer acak
A = randi(320,6);
tic; 

% metode 1 dengan eliminasi gauss
hasil = A; % copy matriks, bukan reference
[m,n] = size(A); 
singularFlag = 0; 
for i=1:m
    % jika nilai elemen ke-(i,i) dari matriks hasil = 0, maka tukar
    % baris ke-i dengan baris di bawahnya yang nilai pada kolom
    % ke-i paling besar
    if hasil(i,i) ==0 
        for ii=i+1:m
            if hasil(ii,i)  > hasil(i,i)
                temp = hasil(i,:); 
                hasil(i,:) = hasil(i+1,:);
                hasil(i+1,:) = temp; 
            end
        end
    end
    
    if hasil(i,i) ~= 0
        % untuk setiap baris di bawah baris ke-i dari matriks hasil
        % bagi kolom ke-i nya dengan kolom ke-i pada baris ke-i
        % dan kalikan nilai ini untuk setiap kolom pada baris ke-i
        % di mulai dari kolom ke-i. Kurangkan nilai tiap kolom pada
        % baris di bawah baris ke-i dengan nilai ini di mulai
        % dari kolom ke-i nya.
        for ii=i+1:m
            temp = hasil(ii,i)/hasil(i,i);
            for j=i:n
                hasil(ii,j) = hasil(ii,j) - temp * hasil(i,j);
            end
        end
    else
        disp('matriks singular');
        singularFlag = 1;
    end
    if singularFlag
        break; 
    end
    
end


if ~ singularFlag 
    determinan = 1;
    % determinan matriks merupakan hasil perkalian elemen 
    % diagonal dari matriks hasil yang sudah dieliminasi
    for i=1:m
        determinan = determinan * hasil(i,i); 
    end
    disp(['nilai determinan = ' num2str(determinan)]);
end
disp(['waktu pengerjaan ', num2str(toc)]);

% metode 2, dengan ekspansi laplace
tic; 
determinan = laplaceExpansion(A);
disp(['nilai determinan = ' num2str(determinan)]);
disp(['waktu pengerjaan ', num2str(toc)]);

% metode 3, dengan perintah built in
tic; 
determinan = det(A);
disp(['nilai determinan = ' num2str(determinan)]);
disp(['waktu pengerjaan ', num2str(toc)]);


function x = laplaceExpansion(matriks)
[m,n]=size(matriks);
if m==1 && n == 1
    x = matriks(1,1); 
    return; 
end
x = 0;
for i=1:m
    baris = i; 
    kolom = 1;
    sign = (-1)^(baris+ kolom);
    x = x + (sign * matriks(i,1) *  ...
        laplaceExpansion(removeRowColumn(matriks,i,1)) ); 
        % rekursi
end

% hapus baris ke-ii dan kolom ke-jj dari matriks input
function hasil = removeRowColumn(matriks, ii, jj)
[m,n]=size(matriks); 
hasil = zeros(m-1,n-1); 
c = 1;
for i=1:m
    if i~=ii
        d = 1;
        for j=1:n
            if j~= jj
                hasil(c,d) = matriks(i,j); 
                d = d +1;
            end
        end
        c = c + 1; 
    end
end

Dalam skrip di atas terlihat bahwa yang pertama diuji adalah metode eliminasi Gausss, kemudian metode ekspansi Laplace, dan yang ketiga perintah built-in di MATLAB. Saya kemudian mencoba matriks dengan beberapa ukuran untuk mengukur ketiga metode tersebut. Pertama matriks ukuran 10 x 10. Hasil eksekusinya bisa dilihat pada gambar berikut ini.



Terlihat bahwa metode ketiga memiliki waktu eksekusi yang jauh lebih cepat ketimbang dua metode sebelumnya. Hal ini tentu dikarenakan kodrat metode ini yang ditulis langsung dengan bahasa yang terkompilasi. Hasil yang berbeda terlihat ketika matriks yang akan dihitung adalah matriks ukuran 100 x 100, 200 x 200, dan 300 x 300. Perhatikan gambar, gambar berikut.







Terlihat bahwa akurasi pengerjaan metode pertama menjadi berkurang seiring bertambahnya ukuran matriks. Sementara akurasi pengerjaan metode kedua boleh dibilang cukup meyakinkan karena nilainya sama saja dengan  hasil perhitungan metode ketiga dalam tiga gambar tersebut.

Tuesday, January 2, 2018

Tutorial Least Square Non-Linear Di MATLAB

Dalam tutorial kali ini saya ingin memberikan sedikit pencerahan kepada pembaca tentang teknik least-square yang diberikan di MATLAB (yang untuk kasus saya adalah MATLAB 2009a). Jadi berhubung MATLAB 2009a lisensinya berakhir sekitar oktober 2017 (kendatipun lisensinya juga bajakan), maka saya harus melakukan pengakalan dengan memundurkan jam di komputer saya sehingga lisensinya masih bisa berlaku sampai malam ini (Januari 2018).

Teknik least-square merupakan teknik yang dilakukan untuk mencocokkan kurva. Jadi diasumsikan kurvanya harus tunduk terhadap persamaan tertentu, namun data yang diberikan ternyata berbeda karena memiliki noise dan error. Jadi kita diperintahkan untuk mencari parameter persamaan tersebut yang membuat kurvanya paling bersesuaian dengan datanya. Sehingga dengan diperolehnya nilai persamaan ini, maka dapat digunakan untuk meramalkan berapa nilai-nilai kedepannya tanpa perlu dilakukan pengambilan data secara langsung, atau bisa juga untuk keperluan-keperluan lain. Yang jelas kita membutuhkan nilai parameternya.

Misalkan kita memiliki nilai data curah hujan sepanjang musim yang bersifat periodik. Di mana kadang intensitas hujan ini besar, namun ada kalanya intensitasnya kecil, namun sifatnya periodik. Karena datanya periodik maka persamaan yang berkaitan adalah persamaan yang sifatnya periodik yang dalam hal ini adalah persamaan sinusoidal. Jadi kita ditugaskan mencari koefisien sinusodial yang membuat kurvanya paling mendekati data tersebut.

Misalkan data curah hujan tersebut diberikan oleh plot berikut:
Dengan script MATLAB:
%%
clc; 
d = 0:.01:2*pi;
y = cos(2*d) + .3*randn(size(d));
plot(d,y,'ko')
hold on;
Jadi dalam plot tersebut terlihat bahwa intensitas curah hujannya bersifat periodik. Namun karena adanya error dan faktor-faktor lainnya yang mempengaruhi, maka terdapat penyimpangan data tersebut dari fungsi periodik yang mengaturnya (governing equation) yang dalam ini persamaan $a * cos(2 *\theta)$. Maka kita kemudian dapat melakukan teknik least square, yang dalam hal ini mencari nilai parameter $a$ ini. Sebenarnya MATLAB 2009a sudah menyediakan fungsi yang dimaksud, yang diberikan oleh perintah lsqnonlin sehingga kita tidak perlu lagi melakukan iterasi manual misalnya dengan metode Lavenberg-Marquardt.

Jadi dengan menjalankan script berikut ini, maka kita akan dapat memperoleh nilai parameter $a$ tersebut.
%%
fun = @(r)r*cos(2*d)-y;
x0 = 4;
x = lsqnonlin(fun,x0); 
Sehingga bisa diperoleh plot hasil least-square curve-fittingnya
%%
plot(d, x*cos(2*d) ,'b-', 'linewidth', 3); 
xlabel('t')
ylabel('a*cos(t)') 
Pelajaran yang bisa diambil adalah, MATLAB 2009a ternyata sudah bisa memberikan banyak hal yang tidak terbayangkan oleh kita sebelumnya sehingga membantu kita dalam mengerjakan banyak hal-hal yang istimewa. Adapun source code lengkapnya adalah sebagai berikut:
%%
clc; 
d = 0:.01:2*pi;
y = cos(2*d) + .3*randn(size(d));
plot(d,y,'ko')
hold on;
%%
fun = @(r)r*cos(2*d)-y;
x0 = 4;
x = lsqnonlin(fun,x0); 

%%
plot(d, x*cos(2*d) ,'b-', 'linewidth', 3); 
xlabel('t')
ylabel('a*cos(t)') 

Wednesday, December 27, 2017

Polinomial Lagrange Di Matlab

Berikut ini saya berikan contoh curve-fitting dengan menggunakan polinomial Lagrange dalam script MATLAB. Semoga bisa bermanfaat bagi pembaca semua yang memerlukan
function lagrangePolinomial()
clc; 
X =  [7.083 7.167 7.25 7.5] ;  
Y1 = [0.11 0.003 0.009 0.005];
xx = 7.083:.005:7.5; 
m = length(xx); 
for i=1:m 
    k(i) = lagrange(X,Y1, xx(i)); 
end
plot(X,Y1,'or',  'markersize', 6, 'MarkerEdgeColor','k','MarkerFaceColor','r'); 
hold on; 
plot(xx,k, 'b.'); 
hold on; 


function sum = lagrange(A,B, p)
a = length(A); 
sum = 0; 
for i=1:a
    prod = B(i); 
    for j=1:a
        if i~=j
            prod = prod * ( p - A(j))/ (A(i) - A(j) );  
        end
    end
    sum  = sum + prod; 
end

Hasil eksekusinya bisa dilihat pada gambar berikut:

Saturday, March 12, 2016

Membuat aplikasi GUI dengan GUIDE di MATLAB

Dalam tutorial kali ini saya ingin mempertontonkan kepada pembaca tentang bagaimana cara membuat aplikasi GUI sederhana di MATLAB. Mudah-mudahan ini bisa bermanfaat. Saya akan mendemokan kasusnya untuk hal yang sederhana, selanjutnya pembaca tinggal menyesuaikannya untuk kasus yang lebih rumit, ya… yang smart dikit lah bro….
1. Step pertama buka MATLAB, yang tampilan keseluruhan window-nya kira-kira seperti berikut:

1

2. Jika sudah dibuka, selanjutnya di command window-nya ketikkan perintah guide dan tekan ENTER:

2

3. Pilih aja ‘BLANK Gui (default)’ dan klik ‘OK’ yang selanjutnya Anda akan digiring menuju tampilan sebagai berikut:

3

4. Jika sudah pencet CTRL + S atau pada menunya klik save as:

4

5. Dan save di komputer Anda dan beri nama misalnya test1:

5

6. Jika sudah, nanti di folder itu akan terbuat (tergenerate) sebuah m file yang namanya itu menyesuaikan dengan nama .fig file yang sudah kita simpan tadi.

6

7. Dan ini secara otomatis akan tampil di editor MATLAB:

7

8. Hal yang perlu pembaca pahami adalah di file editor ini kita tidak boleh melakukan pengeditan secara sembarangan, karena nama-nama variabel atau function di file ini sudah disesuaikan dengan file .fig yang menjadi pasangannya.  Di dalam m file ini terdapat opening-function yang dieksekusi ketika GUI nya pas mulai tampil. Dan ini fungsinya hampir miriplah dengan konstruktor di bahasa java. Untuk saya pribadi biasanya di opening-function ini saya taruh perintah clc, jadi ketika GUI nya tampil,  maka command-windownya dibersihkan dulu.

8

9. Kita kemudian menambahkan beberapa control pada file fig nya tadi, misalnya sebuah button dan sebuah textfield (atau dalam terminologi MATLAB nya disebut sebagai static text), caranya tinggal di drag n drop aja dari panel sebelah kiri:

9

10. Selanjutnya untuk mengeset nilai dari control-control tadi, tinggal klik kanan kemudian ‘Property Inspector’ dan kemudian muncul window buat pengaturan properties-nya:

10
11

11. Di window property inspector itu selanjutnya kita bisa mengatur beberapa hal, misalnya dengan mengganti text dari button-nya menjadi sesuatu yang lain, contoh kita ganti textnya menjadi ‘BUTTON MAKAN’, caranya lihat ke baris String, dan pada kolom di kanannya berikan text sesuai dengan yang Anda kehendaki, setelah itu CTRL + S:

12

12. Jadi Button tadi sudah berubah tampilan

13

13. Untuk memberikan fungsi pada tombol tadi, misalnya jika dia di-klik akan menghasilkan nilai tertentu, maka hal yang dilakukan adalah mengatur variabel pada property inspector nya yakni pada baris CallBack. Nah di situ kan di kolom sebelah kanan ada icon tertentu yang Anda boleh klik:

14

14. Jika sudah di-klik, nanti di m file nya ter-generate (maaf saya kurang tahu apa bahasa Indonesia yang tepat untuk menerjemahkan kata generate, tapi menurut Prof. Bobby Eka Gunara yang jadi dosen di ITB, itu diterjemahkan sebagai membangkitkan, tapi berhubung ini membahas MATLAB maka saya abaikan dulu ajaran beliau itu) sebuah fungsi yang disesuaikan dengan nama dari tombol tadi. Nama tombol ini bisa dilihat pada baris tag pada property inspector:

15

16

15. Jadi jika kita meng-klik tombol/button tadi, maka apapun perintah yang valid yang ditempatkan di dalam fungsi pushbutton1_Callback ini akan dieksekusi.
16. Selain itu, fungsi utama dari baris Tag dari property Inspector ini adalah agar kita bisa mengakses button tadi dari m-file. Misalnya kita ingin mengeprint  text pada button tadi ketika button tersebut di klik, maka yang dilakukan adalah tempatkan perintah berikut pada function pushbutton1_Callback:

17

Jadi dapat kita lihat, bahwa handles  di sini mengacu pada parameter ketiga dari  function pushbutton1_Callback, yang mana ini menyimpan global variabel dari m file nya yang merupakan nilai-nilai yang diset pada fig file. Jadi dalam kasus pushbutton1, handles.pushbutton1 merupakan tag dari button ini. Itu yang kita panggil dan kita tampung dalam variabel y. Kemudian dengan get(y, ‘string’) maka kita mengambil nilai string nya atau text yang ditampilan pada pushbutton1. Dan ini akan ditampilkan pada output.
Sebenarnya banyak hal sih yang bisa kita atur dari property inspector ini.

Sunday, May 17, 2015

Menggunakan komponen java swing dari MATLAB

Berikut ini saya contohkan script tentang bagaimana memanggil komponen java swing dari MATLAB:
clc; 
frame = javax.swing.JFrame; 
frame.setSize(300,300);
frame.setTitle('Hello'); 
frame.setLocationRelativeTo([]); 
frame.setLayout([]); 

button1 = javax.swing.JButton('TEST'); 
button1.setBounds(20,20, 120,30 ); 

label = javax.swing.JLabel('');  
label.setBounds(20,60, 120,30); 

set(button1, 'MouseClickedCallback' , ... 
    @(h,e)(set(label, 'text', ['kalian luar biasa...! ',...
    num2str(randi(11,1))]))); 

frame.add(label); 
frame.add(button1); 
frame.show; 
Yang hasil eksekusinya adalah sebagai berikut:

Saturday, March 28, 2015

Mengatur Area Blur Pada Image Dengan Mouse Scroll di MATLAB

Dalam tutorial kali saya akan memberikan contoh bagaimana mengatur area blur (region of interest yang akan di-blur) dari gambar dengan menggunakan mouse scroll pada MATLAB. Source codenya saya berikan langsung yakni
% test window scroll function untuk memblur gambar. Gunakan mouse scroll
% untuk memperluas atau mempersempit lokasi blur
function testWindowScroll 
clear all; 
clc; 
f = figure('WindowScrollWheelFcn',@sliderHandle,'menubar', 'none' ); 
ax = axes('parent', f, 'units', 'pix' ); 
im = (imread('gambar 1/lion-test.jpg')); % disesuaikan 

imshow(im,'parent', ax); 

sizeImage = size(im);
w = sizeImage(2); 
h = sizeImage(1); 
halfW = double(w)/2; 
halfH = double(h)/2;
maxD = min(w,h)/2; 

initD = 100; 

blurImage(initD); 

    function sliderHandle(src, event)
        m = get(0, 'PointerLocation'); 
        xMouse = m(1); 
        yMouse = m(2); 
        
        posFig = get(f, 'position'); 
        xFig = posFig(1); 
        yFig = posFig(2); 
        widthFig = posFig(3); 
        heightFig = posFig(4); 
        
        if (xMouse > xFig ) && (yMouse > yFig ) && ... 
                (xMouse < xFig + widthFig ) && ... 
                (yMouse < yFig + heightFig )
            if event.VerticalScrollCount < 0  % up 
                initD = initD + 3; 
            elseif event.VerticalScrollCount > 0 % down 
                if initD - 3 > 0 
                   initD = initD - 3;
                end
            end     
            blurImage(initD);
        end
    end

    function blurImage(d)
        if d < maxD
            [xx,yy] = ndgrid(( 1:h )-halfH , ( 1:w ) - halfW ) ; 
            mask = uint8( ( xx.^2 + yy.^2 ) > d^2);
            G = fspecial('disk', 10); 
            cropped = uint8(zeros(sizeImage)); 
            cropped(:,:,1) = roifilt2(G ,im(:,:,1) , mask ); 
            cropped(:,:,2) = roifilt2(G ,im(:,:,2) , mask ); 
            cropped(:,:,3) = roifilt2(G ,im(:,:,3) , mask ); 
            imshow( cropped );  
            drawnow; 
        end
    end
end 
Di mana video implementasinya di komputer saya adalah sebagai berikut

Friday, March 20, 2015

Cara Sorting Cell di MATLAB

Berikut ini adalah contoh bagaimana men-sorting cell di MATLAB:
clear all; 
clc; 
% test sorting dari cell
M = cell(4,2); 
M{1,1} = 'mawar'; 
M{1,2} = 23;
M{2,1} = 'Anggrek' ;
M{2,2} = 11; 
M{3,1} = 'Durian'; 
M{3,2} = 45; 
M{4,1} = 'Benalu'; 
M{4,2} = 222;

% sorting berdasarkan jarak
N = sortrows(M,2);
disp(M); 
disp(N);


% output 
%     'mawar'      [ 23]
%     'Anggrek'    [ 11]
%     'Durian'     [ 45]
%     'Benalu'     [222]
% 
%     'Anggrek'    [ 11]
%     'mawar'      [ 23]
%     'Durian'     [ 45]
%     'Benalu'     [222]

Tuesday, December 23, 2014

Plot Fungsi Gaussian Dengan MATLAB

Fungsi Gaussian didefenisikan oleh persamaan
\begin{equation} f(x) = a \exp \left ( - \frac{(x - b )^2 }{ 2 \, c^2 } \right ) \label{pers1} \end{equation} Dengan $a$, $b$, dan $c$ konstanta real sembarang. Untuk memahami karakteristik persamaan \ref{pers1} di atas, Anda dapat mencoba potongan script berikut
clear all; 
clc; 
% test sorting dari cell
M = cell(4,2); 
M{1,1} = 'mawar'; 
M{1,2} = 23;
M{2,1} = 'Anggrek' ;
M{2,2} = 11; 
M{3,1} = 'Durian'; 
M{3,2} = 45; 
M{4,1} = 'Benalu'; 
M{4,2} = 222;

% sorting berdasarkan jarak
N = sortrows(M,2);
disp(M); 
disp(N);


% output 
%     'mawar'      [ 23]
%     'Anggrek'    [ 11]
%     'Durian'     [ 45]
%     'Benalu'     [222]
% 
%     'Anggrek'    [ 11]
%     'mawar'      [ 23]
%     'Durian'     [ 45]
%     'Benalu'     [222]

Tuesday, November 25, 2014

Membuat Plot Berjalan Dengan MATLAB

Berikut ini saya berikan contoh program MATLAB untuk membuat plot berjalan.  Plot berjalan yang saya maksud adalah bagaimana grafik plotnya itu bergeser sepanjang waktu seiring dengan berubahnya nilai variabel-variabel yang di-plot.

Thursday, April 17, 2014

Benchmarking operasi matriks pengganti loop di MATLAB

Dalam tulisan ini saya hanya sedikit mengulangi kembali beberapa hal yang saya peroleh dari pengalaman selama menggunakan MATLAB. Khususnya berkaitan dengan filosofi dari MATLAB itu sendiri yang merupakan laboratorium  matriks (matrix laboratory). Seperti kita ketahui dalam MATLAB semua operasi pemgrograman ditekankan dalam skema matriks. Jadi bagi pengguna yang terbiasa dengan bahasa lain, maka ada baiknya mempelajari beberapa operasi-operasi dasar dalam manipulasi matriks di MATLAB.

Sebenarnya tulisan ini hanya sekedar mengulangi apa yang sudah saya singgung di tulisan sebelum-nya mengenai seberapa besar pengaruh penggunaan operasi matriks dalam mereduksi waktu komputasi di MATLAB. Namun dalam tulisan ini saya lebih menekankan pada proses benchmarking-nya. Untuk membuktikan perbedaan besar antara menggunakan operasi matriks dengan menggunakan standar pemrograman biasa  (loop: for, while, dll) di MATLAB maka anda bisa mengetes potongan script berikut:
clear all ;
clc; 

% buat matriks M ukuran 5000 x 5000 yang elemennya bilangan bulat acak dari 1 sampai 10
M = randi(10,5000,5000);
% buat matriks N yang ukuran dan nilai elemennya sama dengan matriks M
% ingat, tanda  '='  di MATLAB bukan menandakan pointer kalo merujuk
% pada matriks. Jadi operasi pada elemen M tidak akan berpengaruh pada elemen N. 
N = M; 

[a,b] = size(M);
tic; 
for i=1:a,
    for j=1:b,
        if M(i,j) > 5
            M(i,j) = 20000; 
        end
    end
end
disp(['lama pake loop = ', num2str(toc)]);

tic; 
N(N>5) = 20000;
disp(['lama pake indeks = ', num2str(toc)]);

% cek apakah elemen kedua matriks sama... 
% tanda '==' pada MATLAB bukan menandakan cek objek, tapi cek elemen
if M==N,
    disp('yes..'); 
end
Hasil eksekusinya untuk situasi komputer saya (core i3 dengan ram 4 giga) adalah operasi matriks mampu mereduksi waktu komputasi hingga 5 kali lipat.


Mungkin ada yang menduga jangan-jangan ini dikarenakan waktu pertama running saja. Artinya andaikan operasi ini dilakukan berulang-ulang dalam waktu yang lama, maka hasilnya hampir mirip antara loop dengan operasi matriks. Anda bisa melakukan sedikit modifikasi pada script di atas yakni sebagai berikut:
clear all ;
clc; 
lama_loop = 0; 
lama_indeks = 0;
iter = 0; 
while iter < 23
    M = randi(10,5000,5000);
    N = M; 
    [a,b] = size(M);
    tic; 
    for i=1:a,
        for j=1:b,
            if M(i,j) > 5
                M(i,j) = 20000; 
            end
        end
    end
    lama_loop = lama_loop + toc; 
    tic; 
    N(N>5) = 20000;
    lama_indeks = lama_indeks + toc; 
    iter = iter + 1; 
end

disp(['lama operasi loop untuk 100 iterasi = ', num2str(lama_loop)]);
disp(['lama operasi matriks untuk 100 iterasi = ', num2str(lama_indeks)]);
Hasilnya kurang lebih sama.


Baru satu logika if dan satu loop sudah sekian waktu yang bisa dihemat dengan mengganti loop dengan operasi matriks. Sementara pada kenyataannya dalam suatu proyek komputasi ada banyak loop-loop yang sebenarnya tidak perlu dilakukan karena bisa diganti dengan operasi matriks. 

Intinya operasi matriks ini sangat berfungsi dalam kasus modifikasi elemen-elemen pada matriks. Bahkan hampir semua algoritma yang berhubungan  dengan operasi pada elemen-elemen matriks bisa dinotasikan ke dalam operasi matriks. 

Sunday, April 13, 2014

Menghitung luas area yang gelap pada image di MATLAB



Pada tulisan kali ini saya akan memberikan sedikit tutorial mengenai bagaimana menentukan persentase area pada gambar yang nilai pixel RGB-nya memilik karakter warna tertentu (misalnya gelap atau hitam). Tanpa perlu berbasa-basi saya langsung saja membagikan script disertai komentar seperlunya yang bisa saudara coba di MATLAB.
clc;
clear all ;
[a,b] = imread('polpot.jpg'); 
[m,n,o] = size(a);
% pertama akan ditentukan apakah nilai RGB pada koordinat seragam. Misalnya
% kita ambil sampel koordinat dari 10 baris pertama dan 10 kolom pertama. 
HJ = (a(1:10,1:10,1) == a(1:10,1:10,3) ) & ((a(1:10,1:10,1) == a(1:10,1:10,2) )) ;
HJ
%% 
% yang ternyata elemen matriks HJ  semua 1 yang menandakan semua nilai RGB piksel seragam.
% Untuk  membuktikan, coba kita Print 
% nilai elemen pada baris dan kolom tersebut
a(1:10,1:10,:)
%%
% sekarang karena outputnya seragam maka otomatis nilai sum terhadap
% seluruh matriks HJ akan sama dengan penjumlahan terhadap seluruh matrix
% 'ones' yang ukurannya sama dengan HJ. Jika logika ini kita perumum, akan bisa digunakan pada
% kasus matrik HH yang mencakup seluruh area dari image, yang  akan kita
% peroleh adalah
HH = (a(:,:,1) == a(:,:,2)) & (a(:,:,1) == a(:,:,3)); 
if sum(sum(HH)) == sum(sum(ones(m,n)))
    M  = a(:,:,1) <10;
    disp(['persen area yang nilai pixel-nya di bawah 10 (nilai 0 berarti hitam): ',... 
    num2str(sum(sum(M))/sum(sum(ones(m,n)))*100), ' persen']);
else 
    disp('nilai pixel tidak seragam')
    % karena nilai pixel tidak seragam, maka kita bisa gunakan asumsi bahwa
    % nilai pixel yang mendekati warna gelap itu yang nilai pixel-nya
    % kurang dari 5 untuk R, 5 untuk G, dan 5 untuk B. Memang nilai pixel
    % yang benar-benar hitam adalah R = 0, G = 0, dan B = 0. Akan tetapi
    % kita hanya mendapat sedikit porsi dari area image  untuk nilai tersebut. 
    % Jadi kita gunakan pendekatan tadi. 
    M = (a(:,:,1) < 5) & (a(:,:,2) < 5) & (a(:,:,3) < 5); 
    disp(['persen area yang nilai pixel untuk R < 5; G  < 5, dan B < 5: ',... 
    num2str(sum(sum(M))/sum(sum(ones(m,n)))*100), ' persen']);
end
%% 
% Kita juga bisa menentukan pada baris dan kolom mana saja yang nilai pixel
% R, G, B tidak seragam
logic = (a(:,:,1)== a(:,:, 2)) & (a(:,:,1)== a(:,:,3)); 
[x1,x2,x3] = ind2sub(size(a),find(~logic)); 
disp('10 baris pertama dan 10 kolom pertama yang pikselnya tidak seragam: '); 
x1(1:10)'
x2(1:10)'
disp('nilai RGB pada baris dan kolom tersebut: '); 
a(x1(1:10),x2(1:10),:)

Friday, December 20, 2013

Menghitung bobot dan node pada Gauss Quadrature

Untuk menghitung integral berhingga dengan Gauss-Quadrature sebenarnya agak-agak rumit. Karena kita harus menempuh beberapa metode yang agak ruwet dan tidak mudah. Harus menyelesaikan sistem persamaan Linear dan lain-lain manipulasi aljabar yang membingungkan. Karena kita harus menghitung bobot dan node yang tergantung berapa nodenya. Tapi saya menemukan suatu source code di internet yang sudah menyelesaikan persoalan tersebut. Yakni
function [x,w]=lgwt(N,a,b)

% lgwt.m
%
% This script is for computing definite integrals using Legendre-Gauss 
% Quadrature. Computes the Legendre-Gauss nodes and weights  on an interval
% [a,b] with truncation order N
%
% Suppose you have a continuous function f(x) which is defined on [a,b]
% which you can evaluate at any x in [a,b]. Simply evaluate it at all of
% the values contained in the x vector to obtain a vector f. Then compute
% the definite integral using sum(f.*w);
%
% Written by Greg von Winckel - 02/25/2004
N=N-1;
N1=N+1; N2=N+2;

xu=linspace(-1,1,N1)';

% Initial guess
y=cos((2*(0:N)'+1)*pi/(2*N+2))+(0.27/N1)*sin(pi*xu*N/N2);

% Legendre-Gauss Vandermonde Matrix
L=zeros(N1,N2);

% Derivative of LGVM
Lp=zeros(N1,N2);

% Compute the zeros of the N+1 Legendre Polynomial
% using the recursion relation and the Newton-Raphson method

y0=2;

% Iterate until new points are uniformly within epsilon of old points
while max(abs(y-y0))>eps
    
    
    L(:,1)=1;
    Lp(:,1)=0;
    
    L(:,2)=y;
    Lp(:,2)=1;
    
    for k=2:N1
        L(:,k+1)=( (2*k-1)*y.*L(:,k)-(k-1)*L(:,k-1) )/k;
    end
 
    Lp=(N2)*( L(:,N1)-y.*L(:,N2) )./(1-y.^2);   
    
    y0=y;
    y=y0-L(:,N2)./Lp;
    
end

% Linear map from[-1,1] to [a,b]
x=(a*(1-y)+b*(1+y))/2;      

% Compute the weights
w=(b-a)./((1-y.^2).*Lp.^2)*(N2/N1)^2;
Di mana versi python-nya adalah:
import numpy as np 

np.set_printoptions(precision=4)

# fungsi untuk menghitung node-node pada gauss-quadrature
def lgwt(N, a , b):
    N = N -1 
    N1 , N2= N + 1, N+2 
    xu = np.linspace(-1,1, N1) 
    y =  np.cos(( 2* np.transpose(np.arange(0,N+1)) + 1  )\
    * np.pi / (2 * N + 2))  + (0.27 / N1 ) * np.sin(np.pi * xu * N / N2) ; 
    
    L = np.zeros([N1, N2])
    y0 = 2 
    
    while np.max(np.abs(y - y0 )) > spacing(1):
        L[:,0] = 1        
        L[:,1] = y
        
        for k in range(1, N1):
            L[:,k+1] = ((2*(k+1)-1)*y *L[:,k]-(k)*L[:,k-1])/(k+1)
        
        Lp=(N2)*(L[:,N1-1]-y * L[:,N2-1])/(1-np.power(y,2))   

        y0 = y 
        y = y0 - L[:, N2-1] / Lp
    
    N2 = float(N2) 
    N1 = float(N1)
    x = (a*(1-y ) + b * (1+ y) ) / 2
    w = (b-a) / ((1 -  np.power(y ,2 ) ) * np.power(Lp, 2) ) \
        * np.power(N2/N1 , 2) 
    return (x, w) 
    
(a , b ) = lgwt(12,-5,5) # untuk ngetes
print  a 
print  b 
Potongan eksekusinya adalah



Anda bisa mengkonfirmasi di buku nilai-nilai di atas.

Kebetulan dasar teorinya agak ribet, tapi saya menemukan salah satunya di internet juga yakni sebuah tesis magister. Yang bisa anda download di:
https://drive.google.com/file/d/0B1irLqfPwjq0RFhHQVpvaUVuWlk/edit?usp=sharing

Thursday, December 19, 2013

Maksud perintah eval di MATLAB

Berikut ini saya berikan contoh penggunaan perintah eval di MATLAB. Silakan dites di komputer anda... kebetulan saya g bisa buat video demonya lantaran koneksi lambat :D.
sayang = ['clc;',... 
'f = figure;', ... 
'x = linspace(-pi,pi,100 );', ... 
'y = sin(x);',... 
'maju = 1;',... 
'm = 1;',...
'n = 1;',... 
'while ishandle(f)',...
    'for i=1:length(x)',... 
        'p = plot(x(1:i),y(1:i), ''linewidth'', 3);'...
        'hold on;'...
        'p1 = plot(x(i), y(i),''r.'' , ''markersize'', 30);'...
        'axis([-pi pi -1 1]);'...
        'pause(0.01);',...
        'if ishandle(p), delete(p); end,'...
        'if ishandle(p1),delete(p1); end,'...
    'end,',...
    'for i=length(x):-1:1',...
    'p = plot(x(i:length(x)),y((i:length(y))), ''linewidth'', 3);',...
     'p1 = plot(x(i), y(i),''r.'' , ''markersize'', 30);'...
     'axis([-pi pi -1 1]);'...
        'pause(0.01);',...
        'if ishandle(p), delete(p); end,',...
         'if ishandle(p1),delete(p1); end,'...
    'end,',...
'end'];
eval(sayang);

Wednesday, December 18, 2013

Kenapa harus ada perintah comet di MATLAB

Saya sampai hari ini kurang paham, kenapa sampai ada perintah comet di MATLAB. Coba tes perintah berikut di komputer anda, apa yang terjadi. Soalnya koneksi lagi lambat jadi g bisa buat videonya.
function comet
clc; 
f = figure; 
m = @sin ;
n = @cos ; 
x = linspace(-pi,pi, 300);
a = 'm';
tescomet(30); 
    function tescomet(n)
       state = 1; 
       for i=1:n
          if state
              a = strcat(a,'(n');
              state = 0; 
          else
              a = strcat(a,'(m');
              state = 1;  
          end
      end
      a = strcat(a, '(x)'); 
      for k= 1:n
          a = strcat(a, ')'); 
      end
    end
y = eval(a); 
m = 1; 
plot(x, y); 
hold on; 
maju = 1; 
while ishandle(f)
    if m > length(x), 
        maju = 0;
        m = length(x); 
    elseif m < 1 
        maju = 1 ; 
        m = 1; 
    end
    p = plot(x(m), y(m), 'r.', 'markersize', 30); 
    pause(0.005); 
    if ishandle(p), delete(p); end
    if maju, m = m+1;
    else
        m = m - 1; 
    end
end
end

Batas memori stack pada python dan matlab

Saya penasaran, bagaimana jika kita memplot sebuah fungsi sinusoidal hingga tak berhingga, apa yang terjadi. Maksudnya adalah bagaimana jika kita memplot \( \sin(\sin( \sin( \cdots x) \cdots )) \). Ternyata untuk software yang berbeda hasilnya beda pula. Untuk MATLAB kapasitasnya di batasi sampai 32 kurung bersarang. Sementara untuk python untuk 90 kurung bersarang. Berikut contohnya untuk MATLAB


dengan sourcenya:
function test_sin_sin
clc; 
x = linspace(0, 2*pi ); 
cut(2); 
cut(15); 
cut(30);  
    function cut(a)
    y = 'sin('; 
    for i=1:a,
        y = strcat(y,'sin('); 
    end
    y = strcat(y, 'x)'); 
    for i=1:a, 
        y = strcat(y, ')'); 
    end
    y = eval(y); 
    plot(x, y);
    hold on ; 
    end
end
Adapun untuk python adalah


dengan source-nya
# -*- coding: utf-8 -*-
"""
Created on Thu Dec 19 15:22:44 2013

@author: fajar
"""
x = linspace(-pi,pi, 1000); 
def  test(a):
    aa = 'sin('
    for i in range(a):
        aa += 'sin('
    aa += 'x)'
    for i in range(a):
        aa+= ')'
    yy = eval(aa); 
    plot(x, yy);
    
test(90)
        

Monday, November 18, 2013

Belajar optimisasi di MATLAB

Sebenarnya untuk kreatif g perlu mahal, asalkan kita banyak baca. Berikut ini saya akan membahas sebuah contoh dasar pada buku kalkulus James stewart edisi 5 pada bab 4.7 yakni soal latihan nomor 57.


Yang hasilnya saya gambar ulang menjadi


Pada gambar di atas, terlihat jelas bahwa sudut \(\theta\) dapat dinyatakan sebagai fungsi \(x\) yakni $$ \begin{equation} \theta = 180^o -tan^{-1} \left ( \frac{2}{x} \right ) - \tan^{-1} \left( \frac{5}{3-x} \right ) \end{equation} $$ yang nilai maksimumnya dapat dinyatakan sebagai $$ \begin{eqnarray} \frac{d \theta}{dx } &= & 0 + \frac{2}{x^2} \frac{1}{1 + \frac{4}{x^2} } - \frac{5}{(3 - x)^2} \cdot \frac{1}{1 + \frac{25}{(3 - x)^2}} \\ & = & \frac{2}{x^2 + 4} - \frac{5}{(3 - x)^2 + 25} = 0 \end{eqnarray} $$ atau \begin{eqnarray} 3 x^2 + 12 x - 12 = 0 \end{eqnarray} yang akarnya adalah \(x = - 6 \pm 6\sqrt{2} \). Di mana yang memenuhi adalah \(x = -6 + 6 \sqrt{2} = 6 (\sqrt{2} - 1) \approx 2.4\) Untuk mengilustrasikan jawaban tersebut, saya sudah membuat sebuah program sederhana dalam bahasa MATLAB yang sourcenya pembaca bisa coba di rumah, ditulis dengan menggunakan MATLAB 2009. Adapun sourcenya adalah:
% jawaban soal nomor 57 BAB 4.7 dari buku James Stewart kalkulus
% edisi 5
% author: Mohammad Fajar
function soal57
clc; 
f = figure('menubar', 'none', 'resize', 'off', ... 
    'position', [200, 100, 800, 450]); 
ax1 = axes('units', 'pix', 'position', [50 50 340 270]... 
   ,  'xlim', [0 2*pi], 'ylim', [-1.5, 1.5]); 

ax2 = axes('units', 'pix', 'position', [430 50 340 270]... 
   ,  'xlim', [0 2*pi], 'ylim', [-1.5, 1.5]); 

slider =  uicontrol('style', 'slider', 'position', [50 380 90 20]); 
text_ = uicontrol('style', 'text', 'position', [150 380 40 20 ]); 

set(slider, 'value', 0.1);
set(slider, 'sliderstep', [0.05 0.05]);
ss = 0:0.01:3; 
theta = 180 - atand(2./ss) - atand(5./(3- ss));
maksimum = max(theta); % jawabannya
while ishandle(f)
    xx = get(slider , 'value');
    xx = xx * 3;
    set(text_, 'string', num2str(xx)); 
    trigx = [0 0;5 2;0 0]; 
    trigy = [0 3-xx;0 3;3-xx 3];
    z = [1 1;1 1;1 1];
    p = patch(trigx, trigy, z, 'parent', ax2); 
    axis([-1 ,6, -1, 4]);
    thetax = 180 - atand(2./xx) - atand(5./(3 - xx)); 
    p2 = plot(ss, theta, 'parent', ax1);
    xlabel(ax1, 'x');
    ylabel(ax1, '\theta'); 
    hold on; 
    p3 = line([xx xx], [0 thetax], 'linewidth', 4, 'parent', ax1);
    tt = text(xx+.1,thetax-3,['\theta = ', num2str(thetax)],'parent', ax1 ...
        , 'fontsize', 9);
    tt2 = text(0.8,3-xx,['\leftarrow \theta = ', num2str(thetax), '^o'],'parent', ax2 ...
        , 'fontsize', 12);
    % ini hanya untuk mengakali karena step slider dan step linspace pada 
    % MATLAB tidak sama :)
    if floor(thetax) == floor(maksimum)
        set(p3, 'color', 'r');
        set(p, 'facecolor', 'y'); 
    end
    drawnow;
    if ishandle(p), delete(p);end
    if ishandle(p2), delete(p2);end
    if ishandle(p3), delete(p3);end
    if ishandle(tt), delete(tt);end
    if ishandle(tt2), delete(tt2);end
end
adapaun hasil runningnya adalah:


Wednesday, November 13, 2013

Memahami garis singgung dengan MATLAB

Berikut ini saya berikan contoh program untuk memahami makna filosofis dari garis singgung.
function garis_singgung
% author: mohammad fajar :)
clc; 
f = figure('menubar', 'none', 'resize', 'off'); 
axes('units', 'pix', 'position', [50 50 450 300]... 
   ,  'xlim', [0 2*pi], 'ylim', [-1.5, 1.5]); 
slider =  uicontrol('style', 'slider', 'position', [50 380 90 20]); 
text = uicontrol('style', 'text', 'position', [150 380 40 20 ]); 
t = 0:.1:2*pi;  
y1 = sin(t);  
y2 = cos(t); 
plot(t, y1 , t, y2);
hold on ;
line([0 2*pi], [0 0]);
hold on ;
while ishandle(f)
    value = get(slider , 'value');
    value = value * 2 * pi; 
    set(text, 'string', num2str(value)); 
    hasil = cos(value); 
    yy = (t - value ).* hasil + sin(value) ;
    p = plot(t, yy, 'r' , 'linewidth', 2); 
    p1 = line([value value ] , [0 cos(value)], 'linewidth', 4);
    p2 = plot(value, sin(value),'r.' , 'markersize', 23); 
    % method drawnow tidak mengenali settingan di atas
    axis([0 , 2*pi, -1.5, 1.5 ]); 
    drawnow; 
    if ishandle(p), delete(p); end
    if ishandle(p1), delete(p1); end
    if ishandle(p2), delete(p2); end
end
end
Adapun hasilnya adalah pada gambar berikut:

Friday, November 1, 2013

Belajar monte carlo dengan MATLAB untuk menghitung luas kurva

Berikut ini contoh program yang saya buat pake MATLAB untuk menghitung luas kurva "apa saja" dengan menggunakan metode Monte Carlo.


Yang source codenya 
function test_monte_carlo
clear all ;
clc;
f = figure('menubar', 'none', 'resize', 'off' ); 

ax = axes('units', 'pix', 'position', [40 50 340 340]);

uicontrol('units', 'pix', 'position', [400 360 60 25],... 
    'style', 'text','string','f(x) :' ,  'fontsize', 12, 'horizontalAlignment', 'left', ...
    'fontsize', 12, 'fontweight', 'bold', 'backgroundcolor', get(f, 'color'));

% input fungsi
inputFungsi = uicontrol('units', 'pix', 'position', [450 360 100 25],... 
    'style', 'edit', 'fontsize', 12);

uicontrol('units', 'pix', 'position', [400 330 60 25],... 
    'style', 'text','string','N :' ,  'fontsize', 12, 'horizontalAlignment', 'left', ...
    'fontsize', 12, 'fontweight', 'bold', 'backgroundcolor', get(f, 'color'));

inputN = uicontrol('units', 'pix', 'position', [450 330 100 25],... 
    'style', 'edit', 'fontsize', 12, 'fontweight', 'bold');

% keterangan hasil
ket_hasil  = uicontrol('units', 'pix', 'position', [400 280 100 30],... 
    'style', 'text', 'fontsize', 12, 'fontweight', 'bold', ...
    'string', '0' , 'backgroundcolor', get(f, 'color'));

% hitung button
uicontrol('units', 'pix', 'position', [400 250 100 30],... 
    'style', 'pushbutton', 'fontsize', 12, 'fontweight', 'bold', ...
    'string', 'HITUNG', 'Callback', @fungsi_hitung);

% reset button
uicontrol('units', 'pix', 'position', [400 210 100 30],... 
    'style', 'pushbutton', 'fontsize', 12, 'fontweight', 'bold', ...
    'string', 'RESET', 'Callback', @reset_fungsi);

    function fungsi_hitung(varargin)
        N = get(inputN , 'string'); 
        N = str2double(N); 
        x = 0:.01:2*pi; 
        yy = get(inputFungsi, 'string'); 
        y = eval(yy, x); 
        plot(x,y, 'parent', ax, 'linewidth', 3);
        hold on;
        miny = min(y); 
        maxy = max(y);
        deltax = linspace( 0 , 2*pi ,10000); 
        deltay = linspace( miny,maxy, 10000); 
        a = 0;
        for i=1:N,
            m = randi(length(deltax),1);
            n = randi(length(deltay),1);
            x = deltax(m); 
            y = deltay(n);
            if  y  >= 0 
                if y  <= eval(yy, x)
                    a = a + 1;
                    plot(x,y, 'g*', 'parent', ax);
                    hold on ;
                else
                   plot(x,y, 'r*', 'parent', ax);
                   hold on ;
                end
            else
                if y  >= eval(yy, x)
                    a = a + 1;
                     plot(x,y, 'g*', 'parent', ax);
                     hold on ;
                else
                     plot(x,y, 'r*', 'parent', ax);
                     hold on ;
                end
            end
        end
        axis tight; 
        luas =  (a/N) * ( (maxy- miny) * (2*pi - 0)); 
        set(ket_hasil, 'string', num2str(luas)); 
    end
    
    function reset_fungsi(varargin)
        cla reset; 
        set(ket_hasil, 'string', '0'); 
    end
end

Thursday, October 31, 2013

Menggunakan slider di MATLAB

Contoh penggunaan slider di MATLAB


Adapun source codenya:
function test_slider

figure('menubar', 'none', 'position', [300 300 200 100]); 

slider = uicontrol('style', 'slider', 'position',  [10 10, 100 30]... 
    , 'callback', @call);

ket = uicontrol('style', 'text', 'position',  [10 55, 100 40], ...
    'fontsize', 14, 'fontweight', 'bold' );

set(ket, 'string', get(slider, 'value')); 
        
    function call(varargin)
        set(ket, 'string', get(slider, 'value')); 
    end
end 

Menggunakan input field GUI di MATLAB

Berikut adalah contoh penggunaan input field di MATLAB.



adapun sourcenya adalah:
function tes_button
clc; 
figure('menubar', 'none', 'position', [300 300 200 100]); 

 uicontrol('style', 'pushbutton','position', [10 10, 100 50], 'string', 'TEST'...
 ,  'Callback', @call ); 

edit = uicontrol('style', 'edit','position', [10 65, 60 30], 'string', '0'.... 
    ,'fontsize', 12, 'fontweight','bold');

tampil = uicontrol('style', 'text', 'position', [80 65 60 25], 'string' , '0' ...
      ,'fontsize', 12, 'fontweight','bold'); 

        function call(varargin)
            a = get(edit, 'string'); 
            if ~isnan(str2double(a))
                set(tampil, 'string', a); 
            else
                set(tampil, 'string', 'SALAH');
            end
        end
end