Showing posts with label Matlab Tutorial. Show all posts
Showing posts with label Matlab Tutorial. Show all posts

Friday, 22 May 2020

Kode Matlab, Script atau M-file Matlab Metode Newton Midpoint Halley (NMH): Metode Numerik

Sistem persamaan non-linier dapat diselesaikan dengan metode numerik salah satunya metode Newton. Selanjutnya, Metode Newton dimodifikasi menjadi beberapa metode baru dengan tujuan dapat mereduksi jumlah iterasi dalam menyelesaikan sistem persamaan non-linier tersebut. Salah satunya Midpoint Newton dan Halley. Penyelesaian sistem persamaan nonlinier dengan kombinasi beberapa metode ini diawali dengan mencari solusi sistem persamaan non-linier melalui metode Newton, kemudian nilai solusi tersebut disubstitusikan ke dalam metode Midpoint Newton. Selanjutnya nilai solusi dari metode Midpoint Newton disubstitusikan ke dalam metode Halley sebagai solusi akhir.

Adapun Scribs atau M-File metode NMH sebagai berikut.

clear; clc;
disp('--------------------------------')
disp('program   : Metode Newton Midpoint Halley')
disp('programer : SYAHARUDDIN ')
disp('--------------------------------')
f=input ('f(x) = ');
f_diff1=input ('df1(x) = ');
f_diff2=input ('df2(x) = ');
x1=input('x0 = ');
imax=input('Iterasi = ');
galat1=input('Error = ');
iter=0;
fprintf('\n     Iterasi      Akar           f(Akar)            Galat\n');
for k=1:imax
    iter=iter+1;
    %Rumus NMH
    xnn=x1-(feval(f,x1)/feval(f_diff1,x1));
    xnb=x1-(feval(f,x1)/feval(f_diff1,0.5*(xnn+x1))); 
    x2=xnb-((2*feval(f,xnb)*feval(f_diff1,xnb))/(2*feval(f_diff1,xnb)^2-feval(f,xnb)*feval(f_diff2,xnb)));
    galat=abs((x2-x1)/x2);
    x1=x2;
    y=feval(f,x1);
    fprintf('%10.0f     %6.10f      %6.10f      %6.10f\n',[iter;x1;y;galat]);
    if (galat<galat1 || (iter>imax)),break,end
end
fprintf('Akarnya adalah = %6.10f\n',x1);

Sedangkan contoh output simulasinya:
--------------------------------
program   : Metode Newton Midpoint Halley
programer : SYAHARUDDIN 
--------------------------------
f(x) = inline('x^20 - 210*x^19 + 20615*x^18 - 1256850*x^17 + 53327946*x^16 - 1672280820*x^15 + 40171771630*x^14 - 756111184500*x^13 + 11310276995381*x^12 - 135585182899530*x^11 + 1307535010540395*x^10 - 10142299865511450*x^9 + 63030812099294896*x^8 - 311333643161390640*x^7 + 1206647803780373360*x^6 - 3599979517947607200*x^5 + 8037811822645051776*x^4 - 12870931245150988800*x^3 + 13803759753640704000*x^2 - 8752948036761600000*x + 2432902008176640000','x')
df1(x) = inline('20*x^19 - 3990*x^18 + 371070*x^17 - 21366450*x^16 + 853247136*x^15 - 25084212300*x^14 + 562404802820*x^13 - 9829445398500*x^12 + 135723323944572*x^11 - 1491437011894830*x^10 + 13075350105403950*x^9 - 91280698789603050*x^8 + 504246496794359168*x^7 - 2179335502129734480*x^6 + 7239886822682240160*x^5 - 17999897589738036000*x^4 + 32151247290580207104*x^3 - 38612793735452966400*x^2 + 27607519507281408000*x - 8752948036761600000','x')
df2(x) = inline('380*x^18 - 71820*x^17 + 6308190*x^16 - 341863200*x^15 + 12798707040*x^14 - 351178972200*x^13 + 7311262436660*x^12 - 117953344782000*x^11 + 1492956563390292*x^10 - 14914370118948300*x^9 + 117678150948635550*x^8 - 730245590316824448*x^7 + 3529725477560514176*x^6 - 13076013012778406400*x^5 + 36199434113411200000*x^4 - 71999590358952140800*x^3 + 96453741871740616704*x^2 - 77225587470905933824*x + 27607519507281408000','x')
x0 = 0.5
Iterasi = 20
Error = 0.0001

     Iterasi      Akar           f(Akar)            Galat
         1     0.9762803294      3137308780849152.0000000000      0.4878520186
         2     1.0000000000      1938432.0000000000      0.0237196705
         3     1.0000000000      0.0000000000      0.0000000000
Akarnya adalah = 1.0000000000
>> 

Wednesday, 10 July 2019

Scribs / Rumus / Sintaksis Cara Hapus Data di GUI Matlab

Ketika kita membuat program aplikasi, terkadang ada proses baru atau input data baru. Jika berbentuk edit, mungkin bisa kita input data baru secara langsung, namun bagaimana jika di GUI yang kita bangun juga ada tabel, sehingga perlu m-file / sintaksis / scribs cara menghapus data di GUI Matlab tersebut. Coba perhatikan tampilan GUI Back Propagation ini. Ini adalah scribs yang digunakan untuk menghapus data di GUI tersebut.

function pushbutton2_Callback(hObject, eventdata, handles)
M1=get(handles.uitable1,'Data');
[m,n]=size(M1);
M2=get(handles.uitable2,'Data');
[m1,n1]=size(M2)
M1=zeros(m,n);
M2=zeros(m1,n1)
set(handles.uitable1,'data','')
set(handles.uitable2,'data','')
set(handles.listbox1,'string',' ')
set(handles.edit1,'string',' ')
set(handles.edit2,'string',' ')
set(handles.edit3,'string',' ')
set(handles.edit4,'string',' ')
set(handles.edit5,'string',' ')
set(handles.edit6,'string',' ')
set(handles.edit7,'string',' ')
set(handles.edit8,'string',' ')
set(handles.edit9,'string',' ')
set(handles.edit10,'string',' ')
set(handles.edit11,'string',' ')
set(handles.edit12,'string',' ')

Sederhananya adalah jika ingin menghapus data di edit atau listbox, maka ditutup dengan kata "string". String artinya huruf. Sedangkan untuk tabel, digunakan kata "data".


Part8# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi 'logsig', 'tansig', logsig', 'tansig'

Salah satu cabang dari Articfiial Intelligence (AI) adalah Artificial Neural Network (ANN) atau Jaringan Syaraf Tiruan (JST). Kemudian salah satu metode dari ANN adalah Back Propagation. Metode ini merupakan multilayer inputan data dengan ukuran matrik m x n. Di Matlab sudah disediakan NNTools untuk ANN sebagai media prediksi data (training dan testing). Berikut adalah scribs atau sintaksis yang digunakan untuk prediksi data time series menggunakan Back Propagation.

Catatan: 
  • Arsitektur ini menggunakan 4 layer: layer input, layar hidden 1, layar hidden 2, dan layar output. 
  • Fungsi aktivasi: 'logsig', 'tansig', logsig', 'tansig'

        a1=str2double(get(handles.edit1,'String'));
        a2=str2double(get(handles.edit2,'String'));
        a3=str2double(get(handles.edit3,'String'));
        a4=str2double(get(handles.edit4,'String'));
        a5=str2double(get(handles.edit6,'String'));
        a6=str2double(get(handles.edit7,'String'));
        a7=str2double(get(handles.edit8,'String'));
        a8=str2double(get(handles.edit9,'String'));
        a9=get(handles.edit5,'String');
        a=get(handles.uitable1,'Data');
        [m,n]=size(a)
        b=a(1,:);
        for i=2:m
            b=[b a(i,:)];
        end
        [r,s]=size(b)
        set(handles.listbox1,'UserData',b);
        set(handles.listbox1,'string',num2str(b));
        %Menyusun Data 
        pola=b(1:n+1);
        for i=2:(m-1).*n
            pola=[pola;b(i:i+n)];
        end
        %Normalisasi Data
        c=((0.8.*(pola-min(b)))./(max(b)-min(b)))+0.1;
        %Data Pembelajaran
        x=c(1:(m-1).*n,1:n);
        %Target Data
        t=c(:,n+1);
        %Membangun jaringan syaraf feedforwd
        net=newff(minmax(x'),[a1 a2 a3 a4],{'logsig' 'tansig' 'logsig' 'tansig'},a9)
        %Set max epoch, goal, learning rate, show step
        net.trainParam.epochs=a5;
        net.trainParam.goal=a6;
        %net.trainParam.max_perf_inc=1.04;
        net.trainParam.lr=a7;
        net.trainParam.lr_inc=1.05;
        net.trainParam.lr_dec=0.7;
        net.trainParam.mc=0.9;
        net.trainParam.show=a8;
        %melakukan peembelajaran
        net=train(net,x',t')
        %melihat bobot-bobot awal input,lapisan, dan bias
        [k,l]=size(x)
        W1=[net.IW{1,1} net.b{1,1}];
        Z1=1./(1+exp(-([x ones(k,1)]*W1')));
        W2=[net.LW{2,1} net.b{2,1}];
        Z2=1./(1+exp(-([Z1 ones(k,1)]*W2')));
        W3=[net.LW{3,2} net.b{3,1}];
        Z3=1./(1+exp(-([Z2 ones(k,1)]*W3')));
        W4=[net.LW{4,3} net.b{4,1}];
        Z4=1./(1+exp(-([Z3 ones(k,1)]*W4'))) %Z4 merupakan data pembelajaran terhadap data aktual
        %prediksi
        for i=1:n
            [p,q]=size(c)
            y0=c(p,2:q)
            y1=logsig([y0 1]*W1');
            y2=logsig([y1 1]*W2');
            y3=logsig([y2 1]*W3');
            y4=logsig([y3 1]*W4');
            Z4=[Z4;y4];  % data pembelajaran dan prediksi
            c=[c;[y0 y4]];
        end
        Z4
        %Normalisasi data Prediksi
        H=((Z4-0.1).*(max(b)-min(b))./0.8)+min(b)
        [u,v]=size(H);
        b1=b';
        [a4,b4]=size(b1);
        %Data prediksi
        P=H((((m-1).*n)+1):u,1)
        %Evaluasi Jaringan
        ME=sum((b1(n+1:(m.*n))-H(1:((m-1).*n)))./((m-1).*n));
        MSE=sum(((b1(n+1:(m.*n))-H(1:((m-1).*n))).^2)./((m-1).*n));
        MDA=sum((abs(b1(n+1:(m.*n))-H(1:((m-1).*n))))./((m-1).*n));
        RMSE=sqrt(MSE);
        PE=((b1(n+1:(m.*n))-H(1:((m-1).*n)))./b1(n+1:(m.*n)))*100 
        MPE=sum(PE./(m-1).*n);
        MAPE=sum(abs(PE./((m-1).*n)));
        set(handles.uitable2,'Data',P)
        set(handles.edit10,'string',ME)
        set(handles.edit11,'string',MSE)
        set(handles.edit12,'string',MDA)
        set(handles.edit13,'string',RMSE)
        set(handles.edit14,'string',MPE)
        set(handles.edit15,'string',MAPE)
        figure(7)
        title('Grafik Prediksi Curah Hujan')
        plot([1:((m.*n))],b(1,1:(r.*s)),'-o')
        hold on
        plot([n+1:((m.*n)+n)],H(1:(u.*v),1),'-*r')
        title('Forecasting Charts, Actual Data (o), Approach Data and Prediction (*)');
        grid on;


Part7# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi 'tansig', 'tansig', 'logsig', 'logsig'

Salah satu cabang dari Articfiial Intelligence (AI) adalah Artificial Neural Network (ANN) atau Jaringan Syaraf Tiruan (JST). Kemudian salah satu metode dari ANN adalah Back Propagation. Metode ini merupakan multilayer inputan data dengan ukuran matrik m x n. Di Matlab sudah disediakan NNTools untuk ANN sebagai media prediksi data (training dan testing). Berikut adalah scribs atau sintaksis yang digunakan untuk prediksi data time series menggunakan Back Propagation.

Catatan: 
  • Arsitektur ini menggunakan 4 layer: layer input, layar hidden 1, layar hidden 2, dan layar output. 
  • Fungsi aktivasi: 'tansig', 'tansig', 'logsig', 'logsig'
        a1=str2double(get(handles.edit1,'String'));
        a2=str2double(get(handles.edit2,'String'));
        a3=str2double(get(handles.edit3,'String'));
        a4=str2double(get(handles.edit4,'String'));
        a5=str2double(get(handles.edit6,'String'));
        a6=str2double(get(handles.edit7,'String'));
        a7=str2double(get(handles.edit8,'String'));
        a8=str2double(get(handles.edit9,'String'));
        a9=get(handles.edit5,'String');
        a=get(handles.uitable1,'Data');
        [m,n]=size(a)
        b=a(1,:);
        for i=2:m
            b=[b a(i,:)];
        end
        [r,s]=size(b)
        set(handles.listbox1,'UserData',b);
        set(handles.listbox1,'string',num2str(b));
        %Menyusun Data 
        pola=b(1:n+1);
        for i=2:(m-1).*n
            pola=[pola;b(i:i+n)];
        end
        %Normalisasi Data
        c=((0.8.*(pola-min(b)))./(max(b)-min(b)))+0.1;
        %Data Pembelajaran
        x=c(1:(m-1).*n,1:n);
        %Target Data
        t=c(:,n+1);
        %Membangun jaringan syaraf feedforwd
        net=newff(minmax(x'),[a1 a2 a3 a4],{'tansig' 'tansig' 'logsig' 'logsig'},a9)
        %Set max epoch, goal, learning rate, show step
        net.trainParam.epochs=a5;
        net.trainParam.goal=a6;
        %net.trainParam.max_perf_inc=1.04;
        net.trainParam.lr=a7;
        net.trainParam.lr_inc=1.05;
        net.trainParam.lr_dec=0.7;
        net.trainParam.mc=0.9;
        net.trainParam.show=a8;
        %melakukan peembelajaran
        net=train(net,x',t')
        %melihat bobot-bobot awal input,lapisan, dan bias
        [k,l]=size(x)
        W1=[net.IW{1,1} net.b{1,1}];
        Z1=1./(1+exp(-([x ones(k,1)]*W1')));
        W2=[net.LW{2,1} net.b{2,1}];
        Z2=1./(1+exp(-([Z1 ones(k,1)]*W2')));
        W3=[net.LW{3,2} net.b{3,1}];
        Z3=1./(1+exp(-([Z2 ones(k,1)]*W3')));
        W4=[net.LW{4,3} net.b{4,1}];
        Z4=1./(1+exp(-([Z3 ones(k,1)]*W4'))) %Z4 merupakan data pembelajaran terhadap data aktual
        %prediksi
        for i=1:n
            [p,q]=size(c)
            y0=c(p,2:q)
            y1=logsig([y0 1]*W1');
            y2=logsig([y1 1]*W2');
            y3=logsig([y2 1]*W3');
            y4=logsig([y3 1]*W4');
            Z4=[Z4;y4];  % data pembelajaran dan prediksi
            c=[c;[y0 y4]];
        end
        Z4
        %Normalisasi data Prediksi
        H=((Z4-0.1).*(max(b)-min(b))./0.8)+min(b)
        [u,v]=size(H);
        b1=b';
        [a4,b4]=size(b1);
        %Data prediksi
        P=H((((m-1).*n)+1):u,1)
        %Evaluasi Jaringan
        ME=sum((b1(n+1:(m.*n))-H(1:((m-1).*n)))./((m-1).*n));
        MSE=sum(((b1(n+1:(m.*n))-H(1:((m-1).*n))).^2)./((m-1).*n));
        MDA=sum((abs(b1(n+1:(m.*n))-H(1:((m-1).*n))))./((m-1).*n));
        RMSE=sqrt(MSE);
        PE=((b1(n+1:(m.*n))-H(1:((m-1).*n)))./b1(n+1:(m.*n)))*100 
        MPE=sum(PE./(m-1).*n);
        MAPE=sum(abs(PE./((m-1).*n)));
        set(handles.uitable2,'Data',P)
        set(handles.edit10,'string',ME)
        set(handles.edit11,'string',MSE)
        set(handles.edit12,'string',MDA)
        set(handles.edit13,'string',RMSE)
        set(handles.edit14,'string',MPE)
        set(handles.edit15,'string',MAPE)
        figure(6)
        title('Grafik Prediksi Curah Hujan')
        plot([1:((m.*n))],b(1,1:(r.*s)),'-o')
        hold on
        plot([n+1:((m.*n)+n)],H(1:(u.*v),1),'-*r')
        title('Forecasting Charts, Actual Data (o), Approach Data and Prediction (*)');
        grid on;

Part6# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi 'logsig', 'logsig', 'tansig', 'tansig'

Salah satu cabang dari Articfiial Intelligence (AI) adalah Artificial Neural Network (ANN) atau Jaringan Syaraf Tiruan (JST). Kemudian salah satu metode dari ANN adalah Back Propagation. Metode ini merupakan multilayer inputan data dengan ukuran matrik m x n. Di Matlab sudah disediakan NNTools untuk ANN sebagai media prediksi data (training dan testing). Berikut adalah scribs atau sintaksis yang digunakan untuk prediksi data time series menggunakan Back Propagation.

Catatan: 
  • Arsitektur ini menggunakan 4 layer: layer input, layar hidden 1, layar hidden 2, dan layar output. 
  • Fungsi aktivasi: 'logsig', 'logsig', 'tansig', 'tansig'
a1=str2double(get(handles.edit1,'String'));
        a2=str2double(get(handles.edit2,'String'));
        a3=str2double(get(handles.edit3,'String'));
        a4=str2double(get(handles.edit4,'String'));
        a5=str2double(get(handles.edit6,'String'));
        a6=str2double(get(handles.edit7,'String'));
        a7=str2double(get(handles.edit8,'String'));
        a8=str2double(get(handles.edit9,'String'));
        a9=get(handles.edit5,'String');
        a=get(handles.uitable1,'Data');
        [m,n]=size(a)
        b=a(1,:);
        for i=2:m
            b=[b a(i,:)];
        end
        [r,s]=size(b)
        set(handles.listbox1,'UserData',b);
        set(handles.listbox1,'string',num2str(b));
        %Menyusun Data 
        pola=b(1:n+1);
        for i=2:(m-1).*n
            pola=[pola;b(i:i+n)];
        end
        %Normalisasi Data
        c=((0.8.*(pola-min(b)))./(max(b)-min(b)))+0.1;
        %Data Pembelajaran
        x=c(1:(m-1).*n,1:n);
        %Target Data
        t=c(:,n+1);
        %Membangun jaringan syaraf feedforwd
        net=newff(minmax(x'),[a1 a2 a3 a4],{'logsig' 'logsig' 'tansig' 'tansig'},a9)
        %Set max epoch, goal, learning rate, show step
        net.trainParam.epochs=a5;
        net.trainParam.goal=a6;
        %net.trainParam.max_perf_inc=1.04;
        net.trainParam.lr=a7;
        net.trainParam.lr_inc=1.05;
        net.trainParam.lr_dec=0.7;
        net.trainParam.mc=0.9;
        net.trainParam.show=a8;
        %melakukan peembelajaran
        net=train(net,x',t')
        %melihat bobot-bobot awal input,lapisan, dan bias
        [k,l]=size(x)
        W1=[net.IW{1,1} net.b{1,1}];
        Z1=1./(1+exp(-([x ones(k,1)]*W1')));
        W2=[net.LW{2,1} net.b{2,1}];
        Z2=1./(1+exp(-([Z1 ones(k,1)]*W2')));
        W3=[net.LW{3,2} net.b{3,1}];
        Z3=1./(1+exp(-([Z2 ones(k,1)]*W3')));
        W4=[net.LW{4,3} net.b{4,1}];
        Z4=1./(1+exp(-([Z3 ones(k,1)]*W4'))) %Z4 merupakan data pembelajaran terhadap data aktual
        %prediksi
        for i=1:n
            [p,q]=size(c)
            y0=c(p,2:q)
            y1=logsig([y0 1]*W1');
            y2=logsig([y1 1]*W2');
            y3=logsig([y2 1]*W3');
            y4=logsig([y3 1]*W4');
            Z4=[Z4;y4];  % data pembelajaran dan prediksi
            c=[c;[y0 y4]];
        end
        Z4
        %Normalisasi data Prediksi
        H=((Z4-0.1).*(max(b)-min(b))./0.8)+min(b)
        [u,v]=size(H);
        b1=b';
        [a4,b4]=size(b1);
        %Data prediksi
        P=H((((m-1).*n)+1):u,1)
        %Evaluasi Jaringan
        ME=sum((b1(n+1:(m.*n))-H(1:((m-1).*n)))./((m-1).*n));
        MSE=sum(((b1(n+1:(m.*n))-H(1:((m-1).*n))).^2)./((m-1).*n));
        MDA=sum((abs(b1(n+1:(m.*n))-H(1:((m-1).*n))))./((m-1).*n));
        RMSE=sqrt(MSE);
        PE=((b1(n+1:(m.*n))-H(1:((m-1).*n)))./b1(n+1:(m.*n)))*100 
        MPE=sum(PE./(m-1).*n);
        MAPE=sum(abs(PE./((m-1).*n)));
        set(handles.uitable2,'Data',P)
        set(handles.edit10,'string',ME)
        set(handles.edit11,'string',MSE)
        set(handles.edit12,'string',MDA)
        set(handles.edit13,'string',RMSE)
        set(handles.edit14,'string',MPE)
        set(handles.edit15,'string',MAPE)
        figure(5)
        title('Grafik Prediksi Curah Hujan')
        plot([1:((m.*n))],b(1,1:(r.*s)),'-o')
        hold on
        plot([n+1:((m.*n)+n)],H(1:(u.*v),1),'-*r')
        title('Forecasting Charts, Actual Data (o), Approach Data and Prediction (*)');
        grid on;


Part5# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi 'tansig', 'tansig', 'tansig', 'purelin'

Salah satu cabang dari Articfiial Intelligence (AI) adalah Artificial Neural Network (ANN) atau Jaringan Syaraf Tiruan (JST). Kemudian salah satu metode dari ANN adalah Back Propagation. Metode ini merupakan multilayer inputan data dengan ukuran matrik m x n. Di Matlab sudah disediakan NNTools untuk ANN sebagai media prediksi data (training dan testing). Berikut adalah scribs atau sintaksis yang digunakan untuk prediksi data time series menggunakan Back Propagation.

Catatan: 
  • Arsitektur ini menggunakan 4 layer: layer input, layar hidden 1, layar hidden 2, dan layar output. 
  • Fungsi aktivasi: 'tansig', 'tansig', 'tansig', 'tansig'
        a1=str2double(get(handles.edit1,'String'));
        a2=str2double(get(handles.edit2,'String'));
        a3=str2double(get(handles.edit3,'String'));
        a4=str2double(get(handles.edit4,'String'));
        a5=str2double(get(handles.edit6,'String'));
        a6=str2double(get(handles.edit7,'String'));
        a7=str2double(get(handles.edit8,'String'));
        a8=str2double(get(handles.edit9,'String'));
        a9=get(handles.edit5,'String');
        a=get(handles.uitable1,'Data');
        [m,n]=size(a)
        b=a(1,:);
        for i=2:m
            b=[b a(i,:)];
        end
        [r,s]=size(b)
        set(handles.listbox1,'UserData',b);
        set(handles.listbox1,'string',num2str(b));
        %Menyusun Data 
        pola=b(1:n+1);
        for i=2:(m-1).*n
            pola=[pola;b(i:i+n)];
        end
        %Normalisasi Data
        c=((0.8.*(pola-min(b)))./(max(b)-min(b)))+0.1;
        %Data Pembelajaran
        x=c(1:(m-1).*n,1:n);
        %Target Data
        t=c(:,n+1);
        %Membangun jaringan syaraf feedforwd
        net=newff(minmax(x'),[a1 a2 a3 a4],{'tansig' 'tansig' 'tansig' 'purelin'},a9)
        %Set max epoch, goal, learning rate, show step
        net.trainParam.epochs=a5;
        net.trainParam.goal=a6;
        %net.trainParam.max_perf_inc=1.04;
        net.trainParam.lr=a7;
        net.trainParam.lr_inc=1.05;
        net.trainParam.lr_dec=0.7;
        net.trainParam.mc=0.9;
        net.trainParam.show=a8;
        %melakukan peembelajaran
        net=train(net,x',t')
        %melihat bobot-bobot awal input,lapisan, dan bias
        [k,l]=size(x)
        W1=[net.IW{1,1} net.b{1,1}];
        Z1=1./(1+exp(-([x ones(k,1)]*W1')));
        W2=[net.LW{2,1} net.b{2,1}];
        Z2=1./(1+exp(-([Z1 ones(k,1)]*W2')));
        W3=[net.LW{3,2} net.b{3,1}];
        Z3=1./(1+exp(-([Z2 ones(k,1)]*W3')));
        W4=[net.LW{4,3} net.b{4,1}];
        Z4=1./(1+exp(-([Z3 ones(k,1)]*W4'))) %Z4 merupakan data pembelajaran terhadap data aktual
        %prediksi
        for i=1:n
            [p,q]=size(c)
            y0=c(p,2:q)
            y1=logsig([y0 1]*W1');
            y2=logsig([y1 1]*W2');
            y3=logsig([y2 1]*W3');
            y4=logsig([y3 1]*W4');
            Z4=[Z4;y4];  % data pembelajaran dan prediksi
            c=[c;[y0 y4]];
        end
        Z4
        %Normalisasi data Prediksi
        H=((Z4-0.1).*(max(b)-min(b))./0.8)+min(b)
        [u,v]=size(H);
        b1=b';
        [a4,b4]=size(b1);
        %Data prediksi
        P=H((((m-1).*n)+1):u,1)
        %Evaluasi Jaringan
        ME=sum((b1(n+1:(m.*n))-H(1:((m-1).*n)))./((m-1).*n));
        MSE=sum(((b1(n+1:(m.*n))-H(1:((m-1).*n))).^2)./((m-1).*n));
        MDA=sum((abs(b1(n+1:(m.*n))-H(1:((m-1).*n))))./((m-1).*n));
        RMSE=sqrt(MSE);
        PE=((b1(n+1:(m.*n))-H(1:((m-1).*n)))./b1(n+1:(m.*n)))*100 
        MPE=sum(PE./(m-1).*n);
        MAPE=sum(abs(PE./((m-1).*n)));
        set(handles.uitable2,'Data',P)
        set(handles.edit10,'string',ME)
        set(handles.edit11,'string',MSE)
        set(handles.edit12,'string',MDA)
        set(handles.edit13,'string',RMSE)
        set(handles.edit14,'string',MPE)
        set(handles.edit15,'string',MAPE)
        figure(4)
        title('Grafik Prediksi Curah Hujan')
        plot([1:((m.*n))],b(1,1:(r.*s)),'-o')
        hold on
        plot([n+1:((m.*n)+n)],H(1:(u.*v),1),'-*r')
        title('Forecasting Charts, Actual Data (o), Approach Data and Prediction (*)');
        grid on;

Part4# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi 'logsig', 'logsig', logsig', 'purelin'

Salah satu cabang dari Articfiial Intelligence (AI) adalah Artificial Neural Network (ANN) atau Jaringan Syaraf Tiruan (JST). Kemudian salah satu metode dari ANN adalah Back Propagation. Metode ini merupakan multilayer inputan data dengan ukuran matrik m x n. Di Matlab sudah disediakan NNTools untuk ANN sebagai media prediksi data (training dan testing). Berikut adalah scribs atau sintaksis yang digunakan untuk prediksi data time series menggunakan Back Propagation.

Catatan: 
  • Arsitektur ini menggunakan 4 layer: layer input, layar hidden 1, layar hidden 2, dan layar output. 
  • Fungsi aktivasi: 'logsig', 'logsig', logsig', 'purelin'

        a1=str2double(get(handles.edit1,'String'));
        a2=str2double(get(handles.edit2,'String'));
        a3=str2double(get(handles.edit3,'String'));
        a4=str2double(get(handles.edit4,'String'));
        a5=str2double(get(handles.edit6,'String'));
        a6=str2double(get(handles.edit7,'String'));
        a7=str2double(get(handles.edit8,'String'));
        a8=str2double(get(handles.edit9,'String'));
        a9=get(handles.edit5,'String');
        a=get(handles.uitable1,'Data');
        [m,n]=size(a)
        b=a(1,:);
        for i=2:m
            b=[b a(i,:)];
        end
        [r,s]=size(b)
        set(handles.listbox1,'UserData',b);
        set(handles.listbox1,'string',num2str(b));
        %Menyusun Data
        pola=b(1:n+1);
        for i=2:(m-1).*n
            pola=[pola;b(i:i+n)];
        end
        %Normalisasi Data
        c=((0.8.*(pola-min(b)))./(max(b)-min(b)))+0.1;
        %Data Pembelajaran
        x=c(1:(m-1).*n,1:n);
        %Target Data
        t=c(:,n+1);
        %Membangun jaringan syaraf feedforwd
        net=newff(minmax(x'),[a1 a2 a3 a4],{'logsig' 'logsig' 'logsig' 'purelin'},a9)
        %Set max epoch, goal, learning rate, show step
        net.trainParam.epochs=a5;
        net.trainParam.goal=a6;
        %net.trainParam.max_perf_inc=1.04;
        net.trainParam.lr=a7;
        net.trainParam.lr_inc=1.05;
        net.trainParam.lr_dec=0.7;
        net.trainParam.mc=0.9;
        net.trainParam.show=a8;
        %melakukan peembelajaran
        net=train(net,x',t')
        %melihat bobot-bobot awal input,lapisan, dan bias
        [k,l]=size(x)
        W1=[net.IW{1,1} net.b{1,1}];
        Z1=1./(1+exp(-([x ones(k,1)]*W1')));
        W2=[net.LW{2,1} net.b{2,1}];
        Z2=1./(1+exp(-([Z1 ones(k,1)]*W2')));
        W3=[net.LW{3,2} net.b{3,1}];
        Z3=1./(1+exp(-([Z2 ones(k,1)]*W3')));
        W4=[net.LW{4,3} net.b{4,1}];
        Z4=1./(1+exp(-([Z3 ones(k,1)]*W4'))) %Z4 merupakan data pembelajaran terhadap data aktual
        %prediksi
        for i=1:n
            [p,q]=size(c)
            y0=c(p,2:q)
            y1=logsig([y0 1]*W1');
            y2=logsig([y1 1]*W2');
            y3=logsig([y2 1]*W3');
            y4=logsig([y3 1]*W4');
            Z4=[Z4;y4];  % data pembelajaran dan prediksi
            c=[c;[y0 y4]];
        end
        Z4
        %Normalisasi data Prediksi
        H=((Z4-0.1).*(max(b)-min(b))./0.8)+min(b)
        [u,v]=size(H);
        b1=b';
        [a4,b4]=size(b1);
        %Data prediksi
        P=H((((m-1).*n)+1):u,1)
        %Evaluasi Jaringan
        ME=sum((b1(n+1:(m.*n))-H(1:((m-1).*n)))./((m-1).*n));
        MSE=sum(((b1(n+1:(m.*n))-H(1:((m-1).*n))).^2)./((m-1).*n));
        MDA=sum((abs(b1(n+1:(m.*n))-H(1:((m-1).*n))))./((m-1).*n));
        RMSE=sqrt(MSE);
        PE=((b1(n+1:(m.*n))-H(1:((m-1).*n)))./b1(n+1:(m.*n)))*100
        MPE=sum(PE./(m-1).*n);
        MAPE=sum(abs(PE./((m-1).*n)));
        set(handles.uitable2,'Data',P)
        set(handles.edit10,'string',ME)
        set(handles.edit11,'string',MSE)
        set(handles.edit12,'string',MDA)
        set(handles.edit13,'string',RMSE)
        set(handles.edit14,'string',MPE)
        set(handles.edit15,'string',MAPE)
        figure(3)
        title('Grafik Prediksi Curah Hujan')
        plot([1:((m.*n))],b(1,1:(r.*s)),'-o')
        hold on
        plot([n+1:((m.*n)+n)],H(1:(u.*v),1),'-*r')
        title('Forecasting Charts, Actual Data (o), Approach Data and Prediction (*)');
        grid on;

Semoga bermanfaat.

Scribs / Rumus / Sintaksis Cara Load Data dari Ms Excell ke Tabel GUI Matlab

Sering kita membuat GUI Matlab, kemudian jika data sederhana atau tunggal mungkin bisa kita input manual ke tabel GUI Matlab. Lantas bagaimana jika data tersebut terlalu banyak, jadi akan memakan waktu yang banyak serta tenaga yang terkuras jika kita menginputnya secara manual, sehingga perlu cara untuk load data dari Ms Excel tempat data kita disimpan ke GUI Matlab. Berikut scribs atau m-file cara load data dari Ms Excel ke Tabel di GUI Matlab.

Caranya:
Buatlah tombol Load Data menggunakan Button atau Panel, kemudian klik kanan, pilih CallBack, kemudian ketikkan scribs berikut:

function pushbutton1_Callback(hObject, eventdata, handles)
format bank
[namafile direktori]=uigetfile('*.xls','Ambil Data');
M=xlsread([namafile],-1);
set(handles.uitable1,'Data',M);

Semoga bermanfaat. Jangan lupa ketikkan email Anda di kolom Subscribe

Scribs / Rumus / Sintaksis Cara Menyimpan Data dari Matlab ke Ms Excell

Berikut rumus, scribs, sintaksis atau m-file cara menyimpan data dari tabel GUI Matlab ke Ms Excell.

function pushbutton4_Callback(hObject, eventdata, handles)
[namafile, direktori] = uiputfile('*.xls', 'Simpan Hasil Sebagai')
eval(['cd ''' direktori ''';']);
namafile=[namafile]
b=get(handles.uitable2,'Data')
out=fopen(namafile,'w');
fwrite(out,b)

Semoga bermanfaat

Part1# Membuat GUI Matlab Metode Back Propagation

Salah satu cabang dari Articfiial Intelligence (AI) adalah Artificial Neural Network (ANN) atau Jaringan Syaraf Tiruan (JST). Kemudian salah satu metode dari ANN adalah Back Propagation. Metode ini merupakan multilayer inputan data dengan ukuran matrik m x n. Di Matlab sudah disediakan NNTools untuk ANN sebagai media prediksi data (training dan testing). Berikut adalah scribs atau sintaksis yang digunakan untuk prediksi data time series menggunakan Back Propagation.

Catatan: 
  • Arsitektur ini menggunakan 4 layer: layer input, layar hidden 1, layar hidden 2, dan layar output. 
  • Fungsi aktivasi adalah kombinasi: logsig, tansig, purelin
  • Metode Training: traingda, taingdx, trainrp


Adapun desain yang bisa digunakan seperti gambar berikut:


Langkah#1
Desainlah GUI seperti gambar di atas.

Langkah#2
Pada "Fungsi Aktivasi", inputkan string berikut:
Pilih Fungsi Aktivasi
'logsig', 'logsig', 'logsig', 'logsig'
'tansig', 'tansig', 'tansig', 'tansig'
'logsig', 'logsig', logsig', 'purelin'
'tansig', 'tansig', 'tansig', 'purelin'
'logsig', 'logsig', 'tansig', 'tansig'
'tansig', 'tansig', 'logsig', 'logsig'
'logsig', 'tansig', logsig', 'tansig'

Langkah#3
Pada tombol Load Data ketikkan scribs ini.

Langkah#4
Pada tombol New Data ketikkan scribs ini.

Langkah#5
Pada tombol Simpan ketikkan scribs ini.

Langkah#6
Pada tombol Proses ketikkan scribs berikut:

function pushbutton3_Callback(hObject, eventdata, handles)
p=get(handles.popupmenu1,'Value');
switch p
    case 1
    case 2
            Ketikkan scribs dari Part2#
    case 3
            Ketikkan scribs dari Part3#
    case 4
            Ketikkan scribs dari Part4#
    case 5
            Ketikkan scribs dari Part5#
    case 6
            Ketikkan scribs dari Part6#
    case 7
            Ketikkan scribs dari Part7#
    case 8
            Ketikkan scribs dari Part8#


Selajutnya, baca:

  1. Part2# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi 'logsig', 'logsig', 'logsig', 'logsig'
  2. Part3# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi 'tansig', 'tansig', 'tansig', 'tansig'
  3. Part4# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi 'logsig', 'logsig', logsig', 'purelin'
  4. Part5# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi 'tansig', 'tansig', 'tansig', 'purelin'
  5. Part6# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi 'logsig', 'logsig', 'tansig', 'tansig'
  6. Part7# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi 'tansig', 'tansig', 'logsig', 'logsig'
  7. Part8# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi  'logsig', 'tansig', logsig', 'tansig'

Semoga bermanfaat. 

Part3# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi: 'tansig', 'tansig', 'tansig', 'tansig'

Salah satu cabang dari Articfiial Intelligence (AI) adalah Artificial Neural Network (ANN) atau Jaringan Syaraf Tiruan (JST). Kemudian salah satu metode dari ANN adalah Back Propagation. Metode ini merupakan multilayer inputan data dengan ukuran matrik m x n. Di Matlab sudah disediakan NNTools untuk ANN sebagai media prediksi data (training dan testing). Berikut adalah scribs atau sintaksis yang digunakan untuk prediksi data time series menggunakan Back Propagation.

Catatan: 
  • Arsitektur ini menggunakan 4 layer: layer input, layar hidden 1, layar hidden 2, dan layar output. 
  • Fungsi aktivasi: 'tansig', 'tansig', 'tansig', 'tansig'
        a1=str2double(get(handles.edit1,'String'));
        a2=str2double(get(handles.edit2,'String'));
        a3=str2double(get(handles.edit3,'String'));
        a4=str2double(get(handles.edit4,'String'));
        a5=str2double(get(handles.edit6,'String'));
        a6=str2double(get(handles.edit7,'String'));
        a7=str2double(get(handles.edit8,'String'));
        a8=str2double(get(handles.edit9,'String'));
        a9=get(handles.edit5,'String');
        a=get(handles.uitable1,'Data');
        [m,n]=size(a)
        b=a(1,:);
        for i=2:m
            b=[b a(i,:)];
        end
        [r,s]=size(b)
        set(handles.listbox1,'UserData',b);
        set(handles.listbox1,'string',num2str(b));
        %Menyusun Data
        pola=b(1:n+1);
        for i=2:(m-1).*n
            pola=[pola;b(i:i+n)];
        end
        %Normalisasi Data
        c=((0.8.*(pola-min(b)))./(max(b)-min(b)))+0.1;
        %Data Pembelajaran
        x=c(1:(m-1).*n,1:n);
        %Target Data
        t=c(:,n+1);
        %Membangun jaringan syaraf feedforwd
        net=newff(minmax(x'),[a1 a2 a3 a4],{'tansig' 'tansig' 'tansig' 'tansig'},a9)
        %Set max epoch, goal, learning rate, show step
        net.trainParam.epochs=a5;
        net.trainParam.goal=a6;
        %net.trainParam.max_perf_inc=1.04;
        net.trainParam.lr=a7;
        net.trainParam.lr_inc=1.05;
        net.trainParam.lr_dec=0.7;
        net.trainParam.mc=0.9;
        net.trainParam.show=a8;
        %melakukan peembelajaran
        net=train(net,x',t')
        %melihat bobot-bobot awal input,lapisan, dan bias
        [k,l]=size(x)
        W1=[net.IW{1,1} net.b{1,1}];
        Z1=1./(1+exp(-([x ones(k,1)]*W1')));
        W2=[net.LW{2,1} net.b{2,1}];
        Z2=1./(1+exp(-([Z1 ones(k,1)]*W2')));
        W3=[net.LW{3,2} net.b{3,1}];
        Z3=1./(1+exp(-([Z2 ones(k,1)]*W3')));
        W4=[net.LW{4,3} net.b{4,1}];
        Z4=1./(1+exp(-([Z3 ones(k,1)]*W4'))) %Z4 merupakan data pembelajaran terhadap data aktual
        %prediksi
        for i=1:n
            [p,q]=size(c)
            y0=c(p,2:q)
            y1=logsig([y0 1]*W1');
            y2=logsig([y1 1]*W2');
            y3=logsig([y2 1]*W3');
            y4=logsig([y3 1]*W4');
            Z4=[Z4;y4];  % data pembelajaran dan prediksi
            c=[c;[y0 y4]];
        end
        Z4
        %Normalisasi data Prediksi
        H=((Z4-0.1).*(max(b)-min(b))./0.8)+min(b)
        [u,v]=size(H);
        b1=b';
        [a4,b4]=size(b1);
        %Data prediksi
        P=H((((m-1).*n)+1):u,1)
        %Evaluasi Jaringan
        ME=sum((b1(n+1:(m.*n))-H(1:((m-1).*n)))./((m-1).*n));
        MSE=sum(((b1(n+1:(m.*n))-H(1:((m-1).*n))).^2)./((m-1).*n));
        MDA=sum((abs(b1(n+1:(m.*n))-H(1:((m-1).*n))))./((m-1).*n));
        RMSE=sqrt(MSE);
        PE=((b1(n+1:(m.*n))-H(1:((m-1).*n)))./b1(n+1:(m.*n)))*100
        MPE=sum(PE./(m-1).*n);
        MAPE=sum(abs(PE./((m-1).*n)));
        set(handles.uitable2,'Data',P)
        set(handles.edit10,'string',ME)
        set(handles.edit11,'string',MSE)
        set(handles.edit12,'string',MDA)
        set(handles.edit13,'string',RMSE)
        set(handles.edit14,'string',MPE)
        set(handles.edit15,'string',MAPE)
        figure(2)
        title('Grafik Prediksi Curah Hujan')
        plot([1:((m.*n))],b(1,1:(r.*s)),'-o')
        hold on
        plot([n+1:((m.*n)+n)],H(1:(u.*v),1),'-*r')
        title('Forecasting Charts, Actual Data (o), Approach Data and Prediction (*)');
        grid on;


Semoga bermanfaat. 

Part2# Scribs / Sintaksis Matlab Metode Back Propagation: Fungsi Aktivasi Logsig, Logsig, Logsig, Logsig

Salah satu cabang dari Articfiial Intelligence (AI) adalah Artificial Neural Network (ANN) atau Jaringan Syaraf Tiruan (JST). Kemudian salah satu metode dari ANN adalah Back Propagation. Metode ini merupakan multilayer inputan data dengan ukuran matrik m x n. Di Matlab sudah disediakan NNTools untuk ANN sebagai media prediksi data (training dan testing). Berikut adalah scribs atau sintaksis yang digunakan untuk prediksi data time series menggunakan Back Propagation.

Catatan: 
  • Arsitektur ini menggunakan 4 layer: layer input, layar hidden 1, layar hidden 2, dan layar output. 
  • Fungsi aktivasi: logsig, logsig, logsig, logsig



            a1=str2double(get(handles.edit1,'String'));
        a2=str2double(get(handles.edit2,'String'));
        a3=str2double(get(handles.edit3,'String'));
        a4=str2double(get(handles.edit4,'String'));
        a5=str2double(get(handles.edit6,'String'));
        a6=str2double(get(handles.edit7,'String'));
        a7=str2double(get(handles.edit8,'String'));
        a8=str2double(get(handles.edit9,'String'));
        a9=get(handles.edit5,'String');
        a=get(handles.uitable1,'Data');
        [m,n]=size(a)
        b=a(1,:);
        for i=2:m
            b=[b a(i,:)];
        end
        [r,s]=size(b)
        set(handles.listbox1,'UserData',b);
        set(handles.listbox1,'string',num2str(b));
        %Menyusun Data 
        pola=b(1:n+1);
        for i=2:(m-1).*n
            pola=[pola;b(i:i+n)];
        end
        %Normalisasi Data
        c=((0.8.*(pola-min(b)))./(max(b)-min(b)))+0.1;
        %Data Pembelajaran
        x=c(1:(m-1).*n,1:n);
        %Target Data
        t=c(:,n+1);
        %Membangun jaringan syaraf feedforwd
        net=newff(minmax(x'),[a1 a2 a3 a4],{'logsig' 'logsig' 'logsig' 'logsig'},a9)
        %Set max epoch, goal, learning rate, show step
        net.trainParam.epochs=a5;
        net.trainParam.goal=a6;
        %net.trainParam.max_perf_inc=1.04;
        net.trainParam.lr=a7;
        net.trainParam.lr_inc=1.05;
        net.trainParam.lr_dec=0.7;
        net.trainParam.mc=0.9;
        net.trainParam.show=a8;
        %melakukan peembelajaran
        net=train(net,x',t')
        %melihat bobot-bobot awal input,lapisan, dan bias
        [k,l]=size(x);
        W1=[net.IW{1,1} net.b{1,1}];
        Z1=1./(1+exp(-([x ones(k,1)]*W1')));
        W2=[net.LW{2,1} net.b{2,1}];
        Z2=1./(1+exp(-([Z1 ones(k,1)]*W2')));
        W3=[net.LW{3,2} net.b{3,1}];
        Z3=1./(1+exp(-([Z2 ones(k,1)]*W3')));
        W4=[net.LW{4,3} net.b{4,1}];
        Z4=1./(1+exp(-([Z3 ones(k,1)]*W4'))) %Z4 merupakan data pembelajaran terhadap data aktual
        %prediksi
        for i=1:n
            [p,q]=size(c)
            y0=c(p,2:q);
            y1=logsig([y0 1]*W1');
            y2=logsig([y1 1]*W2');
            y3=logsig([y2 1]*W3');
            y4=logsig([y3 1]*W4');
            Z4=[Z4;y4];  % data pembelajaran dan prediksi
            c=[c;[y0 y4]];
        end
        Z4
        %Normalisasi data Prediksi
        H=((Z4-0.1).*(max(b)-min(b))./0.8)+min(b)
        [u,v]=size(H)
        b1=b';
        [a4,b4]=size(b1)
        %Data prediksi
        P=H((((m-1).*n)+1):u,1)
        %Evaluasi Jaringan
        ME=sum((b1(n+1:(m.*n))-H(1:((m-1).*n)))./((m-1).*n));
        MSE=sum(((b1(n+1:(m.*n))-H(1:((m-1).*n))).^2)./((m-1).*n));
        MDA=sum((abs(b1(n+1:(m.*n))-H(1:((m-1).*n))))./((m-1).*n));
        RMSE=sqrt(MSE);
        PE=((b1(n+1:(m.*n))-H(1:((m-1).*n)))./b1(n+1:(m.*n)))*100 
        MPE=sum(PE./(m-1).*n);
        MAPE=sum(abs(PE./((m-1).*n)));
        set(handles.uitable2,'Data',P)
        set(handles.edit10,'string',ME)
        set(handles.edit11,'string',MSE)
        set(handles.edit12,'string',MDA)
        set(handles.edit13,'string',RMSE)
        set(handles.edit14,'string',MPE)
        set(handles.edit15,'string',MAPE)
        figure(1)
        title('Grafik Prediksi Curah Hujan')
        plot([1:((m.*n))],b(1,1:(r.*s)),'-o')
        hold on
        plot([n+1:((m.*n)+n)],H(1:(u.*v),1),'-*r')
        title('Forecasting Charts, Actual Data (o), Approach Data and Prediction (*)');
        grid on;

Adapun desain yang bisa digunakan seperti gambar berikut:

Semoga bermanfaat. 

Thursday, 23 May 2019

Cara Menambah, Menghapus, Mengurangi, dan Menyisipkan Tabel di GUI Matlab

Misalkan kita punya GUI seperti di bawah ini.


Seperti biasa silahkan klik kanan pada masing-masing tombol, pilih CallBack, kemudian ketikkan scribs berikut pada masing-masing tombol.

TAMBAH
x=get(handles.uitable1,'Data'); 
x=[x;{'','','','',''}];
set(handles.uitable1,'Data',x)

KURANGI
x=get(handles.uitable1,'Data');
x(end,:)=[];
set(handles.uitable1,'Data',x)

INSERT
n=str2num(char(inputdlg('Baris ke-')));
x=get(handles.uitable1,'Data');
x=[x(1:n,:);{'','','','',''};x(n+1:end,:)];
set(handles.uitable1,'Data',x)

HAPUS
n=str2num(char(inputdlg('Baris ke-')));
x=get(handles.uitable1,'Data');
x(n,:)=[];
set(handles.uitable1,'Data',x)

SEMOGA BERMANFAAT. JANGAN LUPA LIKE DAN SUBCRIBE. TERIMA KASIH


Syaharuddin. Theme images by MichaelJay. Powered by Blogger.

KOMENTAR ANDA