Deteksi Warna Komposit dengan Matlab

[peng.citra|t.kom|lab.hardware|pert.7]

Warna dasar RGB adalah Red, Green, dan Blue yang masing-masing menyatakan nilai maksimal komposisinya yaitu 255. Misalnya warna merah, maka matriks-nya sebesar [255 0 0], begitu juga untuk warna hijau dan biru, masing-masing [0 255 0] dan [0 0 255]. Bagaimana cara mendeteksi warna-warna komposit yang bukan merupakan warna dasar seperti kuning, jingga, dan lain-lain? Postingan kali ini sedikit menjelaskan cara mendeteksinya dengan menggunakan jarak Euclidean.

Standar Warna RGB

Standar warna RGB banyak diterapkan pada image processing. Standar ini menggunakan warna merah, hijau dan biru sebagai patokan warna-warna lainnya. Warna lainnya dapat dibuat dengan menggabungkan proporsi warna merah, hijau, dan biru tersebut. Berikut standar warna selain merah, hijau, dan biru.

Tabel di atas juga menyertakan paduan standar Cyan, Magenta, Yelow, dan Black (CMYK) dan HSV. Sebagai kelanjutan Pert 6 yang lalu, di sini kita menerapkan deteksi warna dengan jarak Euclidean.

Praktek dengan GUI

Tambahkan kode tambahan di tombol deteksi warna (Euclidean) karena bukan hanya R, G, dan B, melainkan beberapa warna lain misalnya kuning, oranye, dan hitam.

Tambahkan tiga jarak baru yaitu dY, dO, dan dK untuk jarak terhadap kuning, oranye dan hitam. Untuk memudahkan penentuan jarak terdekat gunakan fungsi min disertai dengan indeksnya. Indeks dapat diketahui dengan membuat sebuah vektor berisi warna-warna dari merah hingga hitam. Sehingga ketika nilai minimum diketahui, diketahui pula indeksnya. Warna dapat diketahui berdasarkan indeks-nya dari vektor warna.


  • dR=norm(warna-[255 0 0])
  • dH=norm(warna-[0 255 0])
  • dB=norm(warna-[0 0 255])
  • dY=norm(warna-[255 255 0])
  • dO=norm(warna-[255 127 0])
  • dK=norm(warna-[0 0 0])
  • hasil=[dR dH dB dY dO dK]
  • % mencari jarak terkecil
  • strwarna={‘merah’
    ‘hijau’
    ‘biru’
    ‘kuning’
    ‘jingga’
    ‘hitam’}

  • [minimum,indeks]=min(hasil)
  • outwarna=strwarna(indeks)
  • set(handles.edit4,‘String’,outwarna)

Coba uji dengan memasukan data sesuai warnanya, misalnya kuning, oranye dan hitam. Coba uji pula dengan warna yang tidak terlalu hitam (abu-abu), atau tidak terlalu kuning. Sistem akan mencoba mendekati dengan warna-warna standar yang ada (R,G,B, plus kuning, orange dan hitam). Semoga bermanfaat.

Deteksi Warna dengan Jarak Euclidean

[peng.citra|t.kom|lab.hardware|pert.6]

Sistem cerdas membutuhkan teknik agar peralatan dapat membedakan satu warna dengan warna lainnya. Teknik termurah dan termudah adalah dengan jarak Euclidean. Perhitungannya menggunakan rumus jarak dua titik koordinat (dua, tiga, dan dimensi-n) yang mirip garis miring Phytagoras. Sebagai kelanjutan dari pertemuan 5 yang lalu, tambahkan tombol pushbutton disertai edit text untuk melihat komposisi RGB sebuah citra.

Agar ukuran dan format sama dengan tombol-tombol yang lain, kita boleh meng-copy paste tombol dan isian lainnya. Jika sudah simpan dan tambahkan tiga buah warna yang akan diuji. Buat saja dengan menggunakan paint pada Windows. Simpan dalam format JPG agar lebih mudah karena kebanyakan citra dibuat dalam format ini.

Mencari Nilai Terbesar RGB

Salah satu teknik termudah menebah warna sebuah citra adalah dengan mencari nilai terbesar. Cara ini tentu banyak kelemahannya, khususnya untuk warna komposit (gabungan) seperti kuning, ungu, orange, dan lain-lain. Namun, teknik ini tetap digunakan ketika menggunakan jarak Euclidean, tetapi menggunakan fungsi mencari nilai terkecil (kebalikannya). Kode berikut diletakan di Callback deteksi warna.

  • fR=handles.y(:,:,1);
  • fG=handles.y(:,:,2);
  • fB=handles.y(:,:,3);
  • fr=mean(mean(fR));
  • fg=mean(mean(fG));
  • fb=mean(mean(fB));
  • % mencari terbesar
  • warna=[fr fg fb]
  • strwarna={‘merah’ ‘hijau’ ‘biru’}
  • [maks,indeks]=max(warna)
  • outwarna=strwarna(indeks)
  • set(handles.edit4,’String’,outwarna)
  • set(handles.edit5,’String’,fr)
  • set(handles.edit6,’String’,fg)
  • set(handles.edit7,’String’,fb)

fR, fG dan fB adalah berturut-turut matriks citra merah, hijau dan biru. Sementara fr, fg, dan fb nilai rata-rata ekstrak warna dari citra. Perhatikan bagian % mencari nilai terbesar b di atas. Di sini digunakan fungsi max. Fungsi set di akhir fungsi mengirim jawaban yang merupakan warna yang ditebak oleh sistem ke edit text4 dalam contoh ini.

Menggunakan Jarak Euclidean

Jarak Euclidean lebih “ampuh” karena mampu mendeteksi warna komposit dengan menghitung jaraknya dari warna-warna yang jadi patokan/kelas. Sebagai latihan, patokannya misal dianggap sama yaitu merah, hijau dan biru. Pada prakteknya bisa saja merah, kuning dan hijau seperti lampu lalu-lintas.

Tambahkan satu tombol pushbutton “Deteksi Warna (Euclidean)” untuk membedakan dengan tombol sebelumnya yang hanya menggunakan nilai maksimal RGB.

Sebagai ilustrasi, nilai X tentu saja dengan nilai terbesar akan ditebak masuk kategori R. Tetapi di sini kita menghitung terlebih dahulu jaraknya terhadap R, G, dan B lalu dibandingkan mana jarak terkecilnya. Rumus Euclidean adalah mirip sisi miring Phytagoras:

Silahkan menggunakan rumus di atas, atau bisa menggunakan fasilitas fungsi norm pada Matlab yang artinya “normal Euclidean”. Berbeda dengan fungsi max untuk mencari nilai maksimum, untuk mencari nilai minimum dapat menggunakan fungsi min. Ok, masukan kode ini pada tombol “Deteksi Warna (Euclidean)”.

  • warna=[fr fg fb]
  • dR=norm(warna-[255 0 0])
  • dH=norm(warna-[0 255 0])
  • dB=norm(warna-[0 0 255])
  • hasil=[dR dH dB]
  • % mencari jarak terkecil
  • strwarna={‘merah’ ‘hijau’ ‘biru’}
  • [minimum,indeks]=min(hasil)
  • outwarna=strwarna(indeks)
  • set(handles.edit4,’String’,outwarna)
  • set(handles.edit5,’String’,fr)
  • set(handles.edit6,’String’,fg)
  • set(handles.edit7,’String’,fb)

Uji dengan me-run GUI yang baru saja diisi kode-nya. Pastikan sistem bisa menebak warna. Selamat Ber-praktikum.

Deteksi Tepi dengan Matlab

[peng.citra|t.kom|lab.hardware|pert.5]

Di antara deteksi lainnya, seperti titik dan garis, deteksi tepi sangat bermanfaat untuk mengetahui suatu objek secara pasti dan terpisah dari objek lainnya, misalnya background. Pertemuan kali ini sedikit membahas metode-metode deteksi tepi yang terkenal antara lain: sobel, prewitt, dan robert. Untuk itu lanjutkan proyek sederhana pertemuan yang lalu dengan menambahkan satu panel berisi tiga pushbutton: sobel, prewitt, dan robert.

Konversi ke Gray

Deteksi tepi bermain dengan intensitas brightness. Ketika langsung mengakses gambar berwarna RGB ada pesan kesalahan. Perlu merubah terlebih dahulu citra yang diambil dari pushbutton “Ambil Citra” menjadi gray. Copas saja kode pada tombol “Konversi ke Gray” dan masukan ke “Sobel”.

  • z=rgb2gray(handles.y);
  • [g,t]=edge(z,’sobel’)
  • axes(handles.axes2)
  • imshow(g)

Silahkan lihat tatacara penggunaan fungsi edge dengan mengetik “help edge” pada command window. Untuk metode Prewitt dan Robert, caranya sama hanya saja menggunakan parameter berturut-turut ‘prewitt’ dan ‘robert’.

Perhatikan ada noise yang tertangkap. Biasanya sebelum deteksi tepi beberapa manipulasi terhadap citra original-nya diperlukan, misalnya filter dengan fungsi imfilter. Selamat mencoba, semoga bermanfaat.

Menampilkan Matriks Pada GUI Matlab

Biasanya output ditampilkan pada GUI dengan memanfaatkan Edit Text. Namun jika data yang dihasilkan lebih dari satu maka pada Edit Text tersebut tidak muncul angka/hasil perhitungannya. Salah satu hasil perhitungan yang lebih dari satu angka adalah Matriks. Postingan ini sekedar menginformasikan bagaimana menampilkan matriks pada GUI yang kita buat.

Komponen Uitable

Misal kita memiliki satu matriks berukuran 2×2 yang akan ditampilkan dalam suatu GUI. Setelah sebuah matriks dimasukan, maka gunakan fungsi set untuk mengirimkan ke komponen uitable. Ketik kode berikut:

  • >> a=[1 2 ;3 4];
  • >> figure
  • >> t=uitable;
  • >> set(t,’Data’,a)

Akan dihasilkan sebuah matriks dalam GUI berikut ini:

    

Selanjutnya data yang ditampilkan pada Matriks di GUI bisa berupa hasil perhitungan Matlab. Sebagai contoh GUI di bawah ini menampilan matriks confusion saat testing. Semoga postingan singkat ini bermanfaat.

 

Melakukan Cropping Pada Citra

[peng.citra|t.komputer|lab.hardware|pert.4]

Terkadang untuk menangkap secara detil suatu permukaan diperlukan proses pemotongan/cropping. Sebagai contoh, lanjutan dari pertemuan 3 yang lalu, tambahkan satu tombol Crop Gambar.

Jika tombol “Crop Gambar” ditekan maka gambar hasil cropping akan ditampilkan pada axes2 di sebelah kanan. Dan jika tombol “Ekstrak Citra R-G-B” ditekan akan menghasilkan harga-harga R,G, dan B yang sudah ternormalisasi di tiga edit text di atasnya.

Cropping Image Pada Matlab

Pada Matlab, fungsi cropping dengan menggunakan fasilitas fungsi imcrop. Silahkan tekan “help imcrop” di command window untuk mengetahui format penulisan fungsi tersebut di kode yang akan dibuat.

  • x=uigetfile(‘*.jpg’);
  • data=imread(x);
  • size(data)
  • ans =
  • 423 644 3

Perhatikan ukuran data citra yang dibaca (lewat imread). Jika kita bayangkan dengan koordinat kartesians, maka panjangnya adalah 644 dan lebarnya adalah 423. Untuk panjang tidak masalah karena arahnya dari kiri ke kanan, hanya saja untuk lebar sedikit berbeda dengan koordinat kartesian. Di sini positif ke arah bawah. Jadi titik tengah gambar tersebut adalah panjang 322 dan lebar 211. Jika ingin mengambil lebar 50 dan panjang juga 50 maka region tersebut dari titik (297, 186) dan offset sebesar masing-masing 50 piksel. Masukan fungsi imcrop untuk memotong gambar.

  • >> data2=imcrop(data,[297 186 50 50]);
  • >> imshow(data2)

Perhatikan format penulisan cropping dimana dua angka terakhir merupakan offset dari titik dimana posisi awal crop dimulai. Untuk mengekstrak citra RGB silahkan gunakan kode di pertemuan 3 yang lalu. Selamat mencoba, semoga bermanfaat.

Menghitung Nilai RGB Sebuah Citra

[peng.citra.digital|tek.komputer|lab.software|pert.4]

Nilai RGB merupakan format pewarnaan yang paling banyak digunakan. Format ini menangkap warna merah (red), hijau (green) dan biru (blue) suatu citra. Dengan komposisi tiga warna tersebut dapat dibuat beragam spektrum warna lainnya. Postingan kali ini akan dibahas bagaimana mengekstrak nilai R, G, dan B suatu citra.

Format RGB

Letakan current directory pada folder di mana citra berada. Kemudian lanjutkan dengan menarik suatu gambar bertipe jpg, png, bmp dan lain-lain. Format RGB suatu citra dapat diketahui dengan fungsi size dan menghasilkan format:

(baris) (kolom) (rgb)

Untuk contoh penerapan dapat menggunakan instruksi berikut ini:

  • [1] x=uigetfile(‘*.jpg*’);
  • [2] data=imread(x);

Misalnya dengan mengetik instruksi size(data) diperoleh hasil:

1150         1427          3

Kolom ke-3 mengindikasikan tiga komposisi warna (merah, hijau, dan biru).

Mengekstrak R, G, dan B

Untuk mengetahui komposisi warna (RGB) dapat dengan cara mengakses data yang dibaca lewat fungsi imread mengikuti indeks kolom 3 apakah 1 (untuk red), 2 (untuk green) dan 3 (untuk blue).

  • [3] fR=data(:,:,1);
  • [4] fG=data(:,:,2);
  • [5] fB=data(:,:,3);

 

Tingkat R, G, dan B

Untuk mengetahui tingkat merah, hijau, dan biru secara total dapat mencari nilai rata-rata lewat fungsi mean. Line [6] – [8] bermaksud menghitung rata-rata masing-masing kelas warna. Dua buah fungsi mean dibutuhkan untuk menghitung total baris dan kolom. Line [9] – [11] bermaksud menormalkan tingkat warna dengan jangkauan 0 hingga 1.

  • [6] fr=mean(mean(fR));
  • [7] fb=mean(mean(fG));
  • [8] fc=mean(mean(fB));
  • [9] frr=fr/255;
  • [10]fbb=fb/255;
  • [11]fcc=fc/255;

Contoh GUI Menghitung Tingkat RGB

Untuk memudahkan, terkadang perlu dibuat GUI agar lebih mudah mencari nilai RGB suatu citra. Contohnya adalah rancangan berikut. Gunakan fungsi tambahan set untuk mengirim hasil perhitungan rgb (nilai RGB yang sudah dinormalkan).


  • [12] set(handles.edit1,‘String’,frr)
  • [13] set(handles.edit2,‘String’,fbb)
  • [14] set(handles.edit3,‘String’,fcc)

Jalankan dan lihat hasilnya seperti di bawah (nilai dari atas ke bawah menunjukkan masing-masing R, G, dan B). Padukan dengan fungsi lain seperti imcrop untuk memotong citra agar tidak masuk di dalamnya background, dibahas pada pertemuan yang lain. Semoga bermanfaat.

 

Kompilasi Matlab Menjadi Executable

[peng.citra.digital|tek.komputer|lab.hardware|pert.3]

Matlab biasanya berfungsi sebagai interpreter, yaitu mengeksekusi program mengikuti listing yang ada pada M-file satu persatu. Agar kode pada M-file dapat dijalankan tanpa membuka Matlab maka perlu kompilasi menjadi executable program. Misalnya program berikut ini:

GUI di atas dapat dijalankan hanya jika Matlab dibuka. Untuk menjalankan program di atas tanpa menggunakan Matlab, lakukan langkah kompilasi berikut ini:

Membuat Deployment Project

Masuk ke menu – File New Deployment Project. Pilih Windows Standalone Program karena kita akan membuat program berbasis Windows (bukan console). Walaupun bisa juga dipilih Standalone Application.

Setelah itu kita diminta memasukan file-file kode sumber. Pilih *.m file yang diperlukan untuk mengeksekusi program pada Main File. Karena berbasis GUI maka diperlukan file lain yaitu file GUI (*.fig).

Build The Project

Langkah berikutnya setelah memasukan kode sumber dan file tambahan lain adalah melakukan build. Tekan simbol di bagian atas. Setelah itu masuk ke command window untuk memasukan beberapa parameter yang dibutuhkan Matlab untuk membangun/build program. Tekan mbuild_setup di bawah command window.

Ketika muncul ‘Would you like mbuild to locate installed compilers [y]/n? >>’ tekan enter atau y. Dilanjutkan dengan memilih Compiler. Pilih no.1 karena tampak lokasinya di folder MATLAB:

  • Select a compiler:
  • [1] Lcc-win32 C 2.4.1 in C:\PROGRA~2\MATLAB\R2008b\sys\lcc
  • [0] None
  • Compiler: >>

Pastikan letak ada di program matlab, bukan di program lainnya. Tekan “y” jika sudah benar. Jika sudah maka Matlab sudah disetel Compiler-nya, hingga muncul “Done . . .”.

Tekan simbol dan pastikan muncul instruksi di bawah:

Tekan link berwarna hijau tersebut untuk melanjutkan proses kompilasi. Tunggu hingga selesai (pastikan muncul Compilation Completed di bagian bawah):

Membuat Paket Program

Untuk menguji program executable hasil kompilasi, buka di folder project-nya lanjutkan ke folder src. Jalankan folder *.exe yang merupakan program hasil kompilasi. File ini dapat dijalankan tanpa menggunakan Matlab.

Hanya saja tidak berjalan jika komputer target tidak terinstal Matlab. Maka perlu dibuat Paket yang berisi DLL yang secara gratis disediakan Matlab. Gunakan fasilitas Package dari Deployment project di Matlab. Tekan simbol “kardus”:

Tunggu proses Packaging hingga selesai (packaging completed). Hasilnya adalah file exe ditambah dengan satu fole installer (ratusan megabyte). Untuk dijalankan di komputer yang tidak terinstall Matlab, harus diinstall/menjalankan program exe paket tersebut.

Untuk uji coba, tutup program Matlab dan hanya jalankan program exe hasil kompilasi di atas. Berikut tampilan running program-nya, selamat mencoba.

Matrix Confusion pada Matlab

Matriks Confusion digunakan untuk mengukur akurasi dan memvalidasi model yang dibuat. Untuk menghitungnya dapat dilihat pada rumus yang disertakan pada pos terdahulu. Untuk mempermudah perhitungan, Matlab menyediakan fasilitas untuk menghitung matriks confusion ini.

Data Aktual Versus Data Prediksi

Untuk membuat matriks confusion diperlukan dua data yaitu data real/aktual dan data prediksi yang dihitung dari model. Berikut ini contoh data yang akan dibuat matriks confusion-nya. Buka command window dan masukan kode berikut (

  • yaktual=transpose([0 1 1 0 1 1 1 0]);
  • yprediksi=transpose([1 1 1 0 1 0 1 0]);

Untuk membuat matriks confusion, dibutuhkan fungsi confusionmat yang memerlukan dua data masukan tersebut di atas. Jalankan kode berikut:

  • [matriks,label]=confusionmat(yaktual,yprediksi)
  • matriks =
  • 2 1
  • 1 4
  • label =
  • 0
  • 1

Perhatikan matriks berwarna merah di atas, tampak matriks confusion sebagai berikut:

Jadi dapat diketahui a, b, c, dan d berturut-turut 2, 1, 1, dan 4. Jadi dapat dihitung recall, precision, false positive, false negative.

Recall atau dengan nama lain True Positif:

TP=4/(1+4)=4/5=0.8. Nilai lain dengan mudah dapat dihitung.

Kasus Lebih dari Dua Label

Matriks Confusion bisa juga untuk kasus lebih dari dua label. Misal ada dua data dengan tiga label, matriks confusion-nya adalah:

  • yaktual=transpose([0 1 1 2 1 2 1 0]);
  • yprediksi=transpose([0 1 2 2 1 2 1 0]);
  • [matriks,label]=confusionmat(yaktual,yprediksi)
  • matriks =
  • 2 0 0
  • 0 3 1
  • 0 0 2
  • label =
  • 0
  • 1
  • 2

Tampak pada matriks confusion label 2 ada satu error. Precision-nya = 2/(1+2) = 2/3 (lihat rumus di pos yang lalu). Semoga bermanfaat.

Merekam dan Memainkan Suara dengan Matlab (Versi Lama dan Baru)

Banyak aplikasi cerdas dengan Matlab yang membutuhkan pengolahan sinyal suara. Sebelum mengolah, salah satu fungsi penting adalah menangkap suara yang akan diolah. Postingan berikut ini membahas fungsi-fungsi yang diperlukan untuk menangkap suara, termasuk juga membunyikan hasil tangkapan suara tersebut (untuk menguji apakah fungsi perekaman berhasil).

Versi Lama

Matlab versi 2008 (versi 7.7) sedikit berbeda dengan versi terbaru. Versi lama ini menggunakan fungsi wavrecord, wavplay, dan wavwrite yang berfungsi berturut-turut untuk merekam, memainkan dan menulis. Kode singkat berikut ini bermaksud merekam, menyimpan dan memainkan suara. Tentu saja diperlukan fasilitas mic dan speaker (biasanya sudah ada pada setiap laptop).

  • clear all;
  • fs=8000;
  • y= wavrecord(5.0*fs, fs, ‘double’); %merekam suara
  • wavwrite(y,fs,‘aiueo.wav’);        %simpan rekaman ke hardisk
  • wavplay(y,fs);                %mainkan hasil rekaman
  • figure,plot(y);                %sinyal hasil rekaman di plot

Versi 2013 ke atas (Baru)

Sebenarnya kode sebelumnya bisa digunakan, hanya saja ada pesan (warning) dari Matlab bahwa wavrecord dan wavplay sebaiknya diganti dengan audiorecorder dan audioplayer untuk merekam dan memainkan.

Ganti kode sebelumnya dengan fungsi yang terbaru berikut ini, lihat referensinya di link resminya. Disini frekuensi sampling dan parameter lainnya standar 8000 Hz dan 8 bit.

  • % Record your voice for 5 seconds.
  • recObj = audiorecorder;
  • disp(‘Start speaking.’)
  • recordblocking(recObj, 5);
  • disp(‘End of Recording.’);
  • % Play back the recording.
  • play(recObj);
  • % Store data in double-precision array.
  • myRecording = getaudiodata(recObj);
  • % Plot the waveform.
  • plot(myRecording);

Jika fungsi menangkap bisa dijalankan, maka untuk mengolah lanjut dapat dilakukan dengan mudah. Banyak terapan-terapan yang menggunakan sinyal suara, antara lain:

  • Pengenalan suara
  • Deteksi kelainan detak jantung
  • Deteksi kerusakan mesin, dll

Suara yang terekam dapat dilihat grafiknya seperti di bawah ini. Sekian, semoga postingan singkat ini bermanfaat.

Menghitung Mean Absolute Percent Error (MAPE) dengan MATLAB

Bagi yang berkecimpung dengan dunia peramalan (forecast) pasti akan menjumpai besaran Mean Absolute Percent Error (MAPE). Besaran ini bermaksud mengukur keakuratan hasil peramalan. Sesuai dengan namanya, MAPE memiliki satuan persentase (pecahan). Kata “mean” sendiri digunakan ketika ada banyak data yang akan dibandingkan dengan data realnya. Rumusnya adalah sebagai berikut:

Dari rumus di atas, jika Actual sama dengan Forecast maka MAPE berharga nol, yang artinya sangat akurat. Perhatikan contoh berikut ini.

Ada empat bulan ramalan, dengan tiap bulan memiliki error. Totalnya dengan rumus MAPE di atas diperoleh 17,6%. Untuk memudahkan perhitungan terkadang diperlukan aplikasi, misalnya Matlab. Error sendiri dihitung dengan fungsi berikut.

  • errors = gsubtract(Actual,Forecast)
  • errors = gsubtract(112.3,124.7)
  • errors =
  • -12.4000

Sayangnya untuk MATLAB 2008b fungsi gsubtract tidak ada (gunakan versi terkini, 2013 ke atas). Jadi diperoleh percent error, misal untuk bulan pertama, sebesar:

  • absolutePercentError=abs(errors)/112.3
  • absolutePercentError =
  • 0.1104

Seperti terlihat pada tabel di atas (11.0%). Untuk menghitung MAPE dapat menggunakan fungsi mean untuk mencari rata-rata.

  • errors = gsubtract(actual,forecast)
  • errors =
  • -12.4000 4.7000 32.3000 38.9000
  • mape = mean(abs(errors./actual))
  • mape =
  • 0.1755

Untuk menggunakan metode NARXNET dalam meramal data yang akan datang silahkan buka postingan yang lalu. Sekian, semoga bermanfaat dan karena hari ini hari raya idul fitri, saya mengucapkan “MINAL AIDIN WALFAIDZIN, mohon maaf lahir batin”.

Referensi:

Link: https://www.forecastpro.com/Trends/forecasting101August2011.html

Penggunaan Bilangan Random Matlab dalam Aplikasi Permainan “Ular Tangga”

Bilangan random menggunakan fungsi rand pada Matlab. Fungsi yang membangkitkan sembarang bilangan dengan jangkauan nol hingga satu (pecahan) banyak diterapkan, salah satunya dalam optimisasi menggunakan algoritma genetika (GA).

Menghasilkan Output yang Tidak bisa Diprediksi

Kehidupan sehari-hari memang tidak bisa diprediksi, sehingga aplikasi permainan pun selayaknya mampu mensimulasikan kehidupan sehari-hari. Misalnya dalam game sepakbola, walaupun akurasi C. Ronaldo tinggi, tetapi karena adanya faktor ketidakpastian, maka belum tentu ketika pinalti selalu menghasilkan gol. Justru kalau gol terus, game tersebut tidak menyerupai aslinya. Sebagai contoh dalam postingan ini adalah permainan ular tangga sederhana.

Misal dua dadu dilempar beberapa kali dan harapannya tepat di titik finish (bernilai 10). Jika terlewat maka dihitung kekiri lebihannya. Mudah saja, kode berikut menggambarkan algoritmanya.

  • clc
  • sisa = 10;
  • step=0
  • history=[0 0 0 ];
  • while sisa ~= 0
    • random=2+floor(rand*10)
    • if sisa >= random
    • sisanew=sisa-random;
    • else
      • sisanew=abs(sisa-random);
    • end
    • sisa=sisanew
    • pause
    • clc
    • step=step+1
    • posisi=10-sisa
    • history=[history;[step random posisi]]
  • end
  • msgbox(‘FINISH’)

Fungsi di atas berisi pembangkitan bilangan random, melangkah dan mendeteksi apakah sudah mencapai FINISH. Offset “2” pada variabel random karena dua dadu minimal berharga “2”. Perulangan diterapkan dengan menggunakan instruksi while apakah sudah tepat di posisi 10. Berikut hasil runningnya:

Kolom tengah adalah bilangan random dan kolom ketiga menunjukan posisi terkini. Di akhir baris, yaitu lemparan ke-6, posisi tepat di angka 10 yang artinya FINISH.

Membuat Ular dan Tangga

Berikutnya ada dua lokasi ular, yaitu angka “4” yang akan memaksa balik ke nol, serta tangga pada angka “6” yang memaksa loncat ke “8”. Berikut tambahan kodenya:

  • clc
  • sisa = 10;
  • step=0
  • history=[0 0 0 ];
  • while sisa ~= 0
    • random=2+floor(rand*10)
    • if sisa >= random
    • sisanew=sisa-random;
    • else
      • sisanew=abs(sisa-random);
    • end
    • sisa=sisanew
    • pause
    • clc
    • step=step+1
    • posisi=10-sisa
    • if posisi==4
      • posisi=0;
      • sisa=10;
    • end
    • if posisi==6
      • posisi=8;
      • sisa=2;
    • end
    • history=[history;[step random posisi]]
  • end
  • msgbox(‘FINISH’)

Ada dua buah if-then untuk mengecek apakah tepat berada di titik ular atau tangga. Jika tepat maka diarahkan ke berturut-turut nol dan delapan. Hasil running di bawah tampak tidak ada angka 4 dan 6 karena akan diarahkan ke nol dan delapan. Sekian, semoga bermanfaat.

Konversi Kode String ke ASCII di Matlab

Iseng-iseng buka tulisan yang lalu tentang enkripsi karena materi mulai masuk ke pemrosesan teks, ternyata banyak yang lupa. Salah satunya adalah konversi dari string ke kode ASCII. Kode ini sangat diperlukan ketikan mengkonversi dari satu ASCII ke yang lainnya dalam rangka enkripsi.

Menambah dengan Nol

Dulu pernah belajar kode ASCII pada mata kuliah bahasa rakitan ketika membahas masalah interupt. Ternyata hingga saat ini tidak berubah.

Bagaimana mengetahui kode ASCII selain dengan tabel di atas jika menggunakan Matlab? Caranya mudah yaitu tambahkan saja string dengan nol, beres sudah. Misal huruf ‘A’ maka:

  • >> teks=’A’
  • teks =
  • A
  • >> ascii=teks+0
  • ascii =
  • 65

Di sini 65 merupakan kode HTML, yang berbeda dengan HEXA (41). Jika sudah, kita dengan mudah mengenkripsi suatu kata, misalnya “Rahmadya” dengan algoritma “tambahkan kode ASCII tiap huruf dengan satu”.

Mengenkripsi Kata

Fungsi yang diperlukan adalah CHAR untuk menampilkan kode ASCII ke string. Masukan ke command window instruksi berikut ini.

  • >> teks=’Rahmadya’
  • teks =
  • Rahmadya
  • >> enkripsi=teks+1
  • enkripsi =
  • 83 98 105 110 98 101 122 98
  • >> char(enkripsi)
  • ans =
  • Sbinbezb

Perhatikan Sbinbezb itu adalah kode enkripsi yang dihasilkan. Untuk mendekripsi caranya mudah, yaitu dengan mengurangkan satu kode tersebut.

  • >> dekripsi=ans-1
  • dekripsi =
  • 82 97 104 109 97 100 121 97
  • >> char(dekripsi)
  • ans =
  • Rahmadya

Perhatikan kode aneh “Sbinbezb” setelah dienkripsi adalah “Rahmadya”. Semoga hal sepele ini bermanfaat.

Menormalkan Data Untuk Range Sempit

Beberapa literatur, seperti (Hagan, M. T., Demuth, H. B., & Beale 1997) merekomendasikan penggunakan normal Euclidis (Euclidean) untuk menormalkan data agar hanya berada pada rang [0,1]. Alasannya adalah keortogonalan matriks konversi yang mempermudah Jaringan Syaraf Tiruan (JST) dalam proses pelatihan (Training). Postingan kali ini memperkenalkan teknik yang sering digunakan pada proses peramalan (Forecasting) dengan rentang data tertentu yang sempit, misalnya range [0.2,0.9]. Caranya adalah dengan menggunakan rumusan di bawah ini (Siang 2009):

dengan b dan a adalah data maksimum dan minimum. x’ adalah hasil konversi dari harga awal x. Perhatikan ketika x adalah data maksimum maka x’ akan berharga 0.7+0.2 sementara jika sebaliknya, x data minimum, maka 0 + 0.2 yang cocok dengan range dari 0.2 hingga 0.9. Tetapi ketika ingin dipresentasikan kembali hasil peramalan ke nilai real-nya perlu konversi kembali dengan formula:

Entah mengapa saya cenderung menggunakan normal Euclidis (fungsi normalize atau dengan memanfaatkan norm jika tidak ada fungsi normalize). Untuk versi 2013 sepertinya sudah ada fungsi normalize. Berikut tampilan Matlab jika ada fungsi yang bersangkutan. Semoga bermanfaat.

  • >> help normalize
  • — help for dfilt.normalize —
  • normalize Normalize coefficients between -1 and 1.
  • G = normalize(Hd) normalizes the feed-forward coefficients between -1
  • and 1 and returns the gain G due to normalization. Subsequent calls to
  • normalize will not change the feed-forward coefficients and G will
  • always return the gain used in the first normalization.

 

  • See also dfilt.denormalize.
  • Copyright 1988-2004 The MathWorks, Inc.

Referensi

Hagan, M. T., Demuth, H. B., & Beale, M., 1997. Neural Network Design, Boston: PWS Publishing Co.

Siang, J.J., 2009. Jaringan Syaraf Tiruan dan Pemrogramannya Menggunakan Matlab, Yogyakarta: Penerbit Andi.

 

Simulasi Membutuhkan Bilangan Random

Simulasi mencoba menjalankan suatu model seolah-olah mengikuti kenyataan yang ada. Simulasi banyak diterapkan dalam permainan. Misalnya pemain bola, C. Ronaldo, dalam game memiliki akurasi tinggi dalam mencetak gol, tetapi tentu saja tidak selalu tendangannya akurat, seperti kenyataan di lapangan sesungguhnya. Jadi ketika pemain tersebut mengeksekusi, program harus membangkitkan suatu bilangan acak dalam rentang akurasinya sehingga bisa saja tendangannya (misal pinalti) tidak berhasil.

Fungsi “rand” di Matlab

Salah satu fungsi di Matlab yang membangkitkan bilangan random adalah fungsi rand. Fungsi ini membangkitkan bilangan acak dari nol hingga satu dalam pecahan. Ketik saja “rand” pada command window maka akan dimunculkan bilangan pecahan yang dimaksud.

Silahkan ketik help rand di command window maka akan muncul tata cara penggunaannya. Bahkan ada varian lagi dari fungsi tersebut di bagian akhir help (suggestion). Untuk membuat bilangan random yang dalam rentang tertentu, misal 9 hingga 10 butuh trik kusus, misalnya rand*10 atau 9+rand.

Contoh Kasus

Program berikut mensimulasian fungsi tangga dari suatu rangkaian masa dan suspensi. Disimulasikan beberapa komposisi pegas dan peredam yang menghasilkan beberapa kemungkinan. Perlu pengetahuan fungsi alih (transfer function) dan juga penggunaan fungsi plot pada Matlab. Buku command window.

  • figure
  • hold

Dua instruksi di atas akan menyiapkan satu gambar yang akan digunakan untuk menangkap output tiap-tiap komposisi pegas peredam. Fungsi hold membuat grafik menangkap lebih dari satu komposisi.

  • m=100;
  • for i=1:4
  • c=rand*10;
  • k=rand*10;
  • model=tf([1],[m c k])
  • step(model)
  • end

Kemudian Matlab mengeksekusi kode di atas dengan jumlah loop sebanyak empat kali. Tiap loop mencetak (fungsi step) model yang dalam bentuk fungsi alih tersebut. Massa diset 100 karena memang tidak terlalu berubah (massa motor, mobil, dan sebagainya cenderung tetap). Di sini nilai hanya sebagai contoh saja (tanpa satuan, dan standar yang telah ditentukan dalam perancangan elemen mesin). Selamat mencoba.

Variabel Dinamis pada Fungsi Alih Simulink Matlab

[m.kul,ruang,dosen,jur:t-pemodelan-simulasi,software,rahmadya-phd,t-kom-d3]

Berbicara mengenai fungsi alih, mau tidak mau harus sedikit kilas balik ke materi pengenalan pengaturan (tek. Kendali). Untuk mudahnya ambil kasus sederhana suspensi kendaraan (post terdahulu). Fungsi alih suatu sistem suspensi adalah:

Fungsi Alih = 1/(ms^2+cs+k)

m, c dan k berturut-turut massa (Kg), peredam (N.s/m), dan konstanta pegas (N/m). Kemudian untuk memasukan variabel dinamis fungsi alih, buka simulink dengan mengetik simulink pada command window Matlab.

Memasukan Variabel Dinamis

Untuk mensimulasikan sistem suspensi pada model simulink masukan tiga diagram blok antara lain: masukan tangga, fungsi alih, dan keluaran yang ditangkap oleh scope. Masukan tangga berada di bagian SOURCE, fungsi alih di bagian CONTINUOUS, dan scope pada bagian SINK. Caranya adalah dengan mendrag ke lembar model.

 

Atur fungsi alih (transfer function) agar diperoleh persamaan di awal tulisan ini. Gunakan variabel m, c dan k yang mewakili massa, peredaman, dan kekakuan pegas.

Tekan ganda transfer function dan isikan sebagai berikut. NOTE: Nilai m, c dan k di sini berupa variabel yang jika langsung dijalankan akan memunculkan pesan kesalahan.

Mengisi Variabel lewat Command Window

Bagaimana memasukan m, c, dan k? Mudah saja, kembali ke command window, ketikan saja tiga variabel itu dengan bilangan.

>> m=100;

>> c=20;

>> k=5;

Kembali ke jendela model. Tekan tombol RUN pada jendela model yang berupa segitiga warna hijau. Pastikan tidak muncul error. Lanjutkan dengan mengklik ganda SCOPE untuk melihat grafiknya.

Atur komposisi c dan k agar diperoleh respon yang halus (smooth). Bagaimana terapan ke program GUI-nya? Sepertinya butuh postingan tersendiri karena ada sedikit masalah saat praktek tadi, yaitu data m, c, dan k tidak terkirim ke jendela model.