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)') 

No comments: