Dalam tulisan kali ini, saya akan mencoba menjelaskan sedikit mengenai bagaimana cara menambahkan kode latex ke dalam libre office. Mengapa latex, adalah karena di samping sudah merupakan sebuah standar dalam penulisan dokument, Latex juga memberikan sedikit fleksibilitas dalam penulisan rumus (formula) ke dalam dokument. Dalam artian ada banyak simbol-simbol dan teknik penulisan persamaan yang ada di Latex yang mungkin tidak dijumpai dalam sistem pemrosesan dokumen model lain.
Untuk keperluan itu, kita terlebih dahulu harus menggunakan sebuah addons yakni texmath, yang bisa di download di:
http://extensions.libreoffice.org/extension-center/texmaths-1
Untuk bisa menggunakannya, kita harus pastikan bahwa di komputer kita sudah terinstall miktex atau kompiler Latex yang lain. Kalo Sudah tinggal kita install dan konfigurasi agar libre office mengenali miktex pada komputer kita.
Untuk menginstall, gampang aja, yakni klik: menu->extension manager->add->pilih lokasi installer texmath
Jika sudah terinstall, restart dulu libre office, akan muncul icon seperti gambar berikut
Sekarang klik icon ketiga pada gambar tersebut, untuk melakukan konfigurasi agar libre office tahu di mana miktex (kompiler Latex) berada:
Dalam gambar tersebut, kita hanya perlu mengisi dua buah kotak, kotak ketiga hanya pilihan, sementara kotak yang paling atas wajib di isi karena merupakan lokasi bagi latex kompiler. Biasanya kalo miktex sudah terinstall (bukan portable), texmath akan dengan sendirinya mengenali lokasinya, namun karena kebetulan saya menggunakan miktex portable, maka harus dilakukan konfigurasi manual ketiga kotak tersebuut.
Selanjutnya kita tinggal klik icon berbentuk pi untuk memasukkan persamaan ke dalam dokument kita.
Lantas klik tombol Latex:
Untuk persamaan yang diberi nomor klik icon berbentuk pi yang di tengah (yang lebih kecil dengan tambahan angka 1 dalam kurung siku).
Selanjutnya kita bisa mengatur beberapa hal menyangkut resolusi persamaan dalam dokument kita beserta transparansinya. Yakni dengan mengklik kotak preference
Bagusnya kita jangan menggunakan transparansi, karena ketika persamaannya diletakkan dalam sebuah diagram, transparansi akan menyulitkan kita dalam memindah-mindahkan persamaannya. Namun ada kalanya kita meletakkan sebuah persamaan di atas sebuah kotak atau diagram yang berwarna sehingga jika tidak diberi transparansi akan kurang bagus seperti pada gambar berikut
Oleh karena itu kita harus mengatur preamble pada kode Latex yakni dengan mengklik kotak preamble
Yang perlu dilakukan adalah menghilangkan tanda comment (%) dari kode tersebut, lantas menset nilai fgcolor dan bgcolor sesuai dengan nilai warna (dalam RGB) dari kotak/diagram yang akan ditempati oleh persamaan tersebut. Untuk mengetahui nilai warna tersebut. fgcolor menyatakan warna text sementara bgcolor menyatakan warna latar belakang. Secara default nilai fgcolor adalah (0,0, 255) atau hitam, sementara bgcolor adalah (255,255,255) atau putih. Untuk mengetahui nilai RGB dari diagram kita caranya adalah klik kanan pada area diagram lantas pilih menu area->color:
SELAMAT MENCOBA.....
Sesungguhnya shalat itu mencegah dari (perbuatan-perbuatan) keji dan mungkar
Q.S. Al-'Ankabut Ayat 45
Monday, December 30, 2013
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
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
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 bPotongan 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:
dengan source-nya
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 endAdapun 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)
Wednesday, December 11, 2013
Tuesday, December 3, 2013
Convert List Generic ke list tipe tertentu di java
Berikut ini adalah contoh bagaimana mengconvert list generic ke list tipe tertentu di java
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 endadapaun 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 endAdapun 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:
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
Plot animasi sinusoidal di MATLAB
Berikut ini adalah contoh plot animasi sinusoidal di MATLAB
Adapun source codenya adalah
clc ; awal = 0; akhir = 2*pi ; f = figure; temp = awal + .1; step =0.05; while ishandle(f) && temp <= akhir x = awal:step:temp; plot(x,sin(2.*x),'-ro'); axis([0 akhir -1 1]); drawnow; temp = temp+ step; pause(0.02); end while ishandle(f) awal = awal + step; akhir = akhir + step; x = awal:.025:akhir; plot(x,sin(2.*x),'-ro'); axis([awal akhir -1 1]); drawnow; pause(0.02); end disp('program selesai');
Tuesday, October 29, 2013
Membuat 2 plot dalam satu figure di MATLAB
Berikut adalah source code membuat dua plot dalam satu figure di MATLAB.
function main f = figure('menubar', 'none', 'position', [200 100 780 500]); panel_plot = uipanel('title', 'plot area', ... 'units', 'pix', ... 'positioN', [10 50 750 400] , ... 'fontsize', 12); g0 =axes('units','pixels','position',[50 50 300 300], ... 'xlim', [0 (2*pi)], ... 'parent', panel_plot); g1 =axes('units','pixels','position',[400 50 300 300], ... 'xlim', [0 (2*pi)], ... 'parent', panel_plot); x = 0:.1:2*pi; plot(x, sin(x), 'parent', g1); plot(x,sin(x.^2), 'parent', g0);Dengan contoh plot
Wednesday, October 16, 2013
medan vektor konservatif dan simply-connected
Salah satu hal yang menarik dari kalkulus vektor adalah persoalan bagaimana menentukan apakah suatu medan vektor bersifat konservatif atau bukan. Suatu medan vektor dikatakan konservatif jika integral yang dilakukan terhadap suatu lintasan tertutup
yang berada di dalam domain medan vektor tersebut tidak bergantung pada lintasan yang diambil. Salah satu ciri dari medan vektor konservatif adalah curl yang diambil terhadap medan vektor tersebut sama dengan nol, atau bisa dikatakan medan vektor tersebut irotasional. Dengan demikian medan vektor tersebut dapat dinyatakan sebagai gradient suatu medan potensial skalar karena curl dari gradient potensial pasti nol. Contoh medan vektor konservatif adalah medan listrik dan medan gravitasi bumi.
Akan Tetapi pernyataan ini tidak bisa dibalik. Kita tidak bisa memastikan suatu medan vektor bersifat konservatif hanya dengan melihat apakah curl-nya nol atau bukan. Terdapat beberapa kasus di mana suatu medan vektor memiliki curl nol akan tetapi bukanlah medan vektor konservatif. Tinjau medan vektor dua dimensi berikut: \begin{equation} \vec{F} (x,y) = \left( \frac{-y}{x^2 + y^2}\right) \hat{i} + \left( \frac{x}{x^2 + y^2}\right)\hat{j} \end{equation} Yang curl-nya adalah $$ \begin{eqnarray} \nabla \times \vec{F} &=&\left[ \frac{\partial}{\partial x} \left( \frac{x}{x^2 + y^2}\right) + \frac{\partial }{\partial y} \left( \frac{-y}{x^2 + y^2}\right) \right] \hat{j} \\ &=& \left[ \frac{y^2 - x^2 }{\left( x^2 + y^2 \right)^2} + \frac{y^2 - x^2 }{\left( x^2 + y^2 \right)^2} \right] \hat{j} \\ &=& 0 \end{eqnarray} $$ Kita dapat memilih suatu kurva tertutup yang masih dalam domain medan vektor \(\vec{F}\) di mana integral yang diambil sepanjang kurva ini tidak sama dengan nol. Tinjau suatu kurva lingkaran \(C\) yang berpusat di titik \((0, 0)\) dan berjari-jari satu satuan yang dapat diparameterisasi sebagai $$ \begin{eqnarray} \vec{F }(c(t)) &= & \frac{-\sin t }{\cos^2 t + \sin^2 t} \, \hat{i} + \frac{\cos t }{\cos^2 t + \sin^2 t } \, \hat{j} \\ &=& -\sin t \, \hat{i} + \cos t \, \hat{j} \end{eqnarray} $$ dengan \( 0 <= t <= 2 \pi \). Integral yang dilakukan sepanjang kurva ini tidak sama dengan nol yakni $$ \begin{eqnarray} \int_C \vec{F} \cdot ds & = & \int_{a}^{b} \vec{F} (c(t)) \cdot c' (t) \, dt \\ &=& \int_{0}^{2 \pi} \left( -\sin t \, \hat{i} + \cos t \, \hat{j} \right) \cdot \left( - \sin t \, \hat{i} + \cos t \, \hat{j} \right) \\ &=& \int_{0}^{2\pi } 1 \, dt = 2 \pi \end{eqnarray} $$ Yang artinya terdapat suatu kurva yang mana integral \( \int_C \vec{F} \cdot ds \) tidak sama dengan nol yang mengindikasikan bahwa vektor \( \vec{F}\) bukanlah medan vektor konservatif.
Mengapa demikian adalah karena vektor \( \vec{F} \) memiliki titik singularitas yakni pada titik \((0,0)\). Artinya adanya titik singularitas ini mengakibatkan Teorema Stokes yang menghubungkan integral lintasan dengan curl vektor tidak bisa diterapkan pada medan vektor yang bersangkutan. Curl yang sama dengan nol baru bisa dipakai untuk menandai vektor konservatif jika vektor tersebut didefenisikan pada domain yang simply-connected. Adanya titik singularitas pada contoh di atas mengakibatkan domain tersebut tidak lagi simply-connected. Maksud simply connected sendiri adalah kita dapat mereduksi sembarang kurva dalam domain 2D atau permukaan dalam domain 3D menjadi sebuah titik dan masih tetap berada dalam domain tersebut. Untuk domain 2 dimensi simply connected mengharuskan bahwa seluruh domain terdefenisi secara utuh tanpa ada hole di dalam domain. Sementara untuk domain tiga dimensi sebuah hole pada domain bisa ditoleransi asalkan hole tersebut tidak menembus sampa ke luar domain. Syarat simply-connected ini merupakan syarat mutlak bagi teorema Stokes . Pada kasus dua dimensi adanya hole mengakibatkan kita tidak lagi bisa menghubungkan integral lintasan yang mengelilingi hole tersebut dengan integral permukaan pada keseluruhan hole, karena domainnya tidak terdefenisi pada hole. Sementara pada kasus tiga dimensi, walaupun terdapat suatu hole dalam daerah tertentu kita masih bisa mencari alternatif permukaan yang tidak melalui hole akan tetapi batasannya masih pada kurva yang sama dengan permukaan yang melalui hole tersebut.
Jadi kesimpulannya: suatu medan vektor bersifat konservatif jika curl yang dilakukan pada medan vektor tersebut sama dengan nol serta domain di mana medan vektor tersebut didefenisikan harus simply-connected.
Akan Tetapi pernyataan ini tidak bisa dibalik. Kita tidak bisa memastikan suatu medan vektor bersifat konservatif hanya dengan melihat apakah curl-nya nol atau bukan. Terdapat beberapa kasus di mana suatu medan vektor memiliki curl nol akan tetapi bukanlah medan vektor konservatif. Tinjau medan vektor dua dimensi berikut: \begin{equation} \vec{F} (x,y) = \left( \frac{-y}{x^2 + y^2}\right) \hat{i} + \left( \frac{x}{x^2 + y^2}\right)\hat{j} \end{equation} Yang curl-nya adalah $$ \begin{eqnarray} \nabla \times \vec{F} &=&\left[ \frac{\partial}{\partial x} \left( \frac{x}{x^2 + y^2}\right) + \frac{\partial }{\partial y} \left( \frac{-y}{x^2 + y^2}\right) \right] \hat{j} \\ &=& \left[ \frac{y^2 - x^2 }{\left( x^2 + y^2 \right)^2} + \frac{y^2 - x^2 }{\left( x^2 + y^2 \right)^2} \right] \hat{j} \\ &=& 0 \end{eqnarray} $$ Kita dapat memilih suatu kurva tertutup yang masih dalam domain medan vektor \(\vec{F}\) di mana integral yang diambil sepanjang kurva ini tidak sama dengan nol. Tinjau suatu kurva lingkaran \(C\) yang berpusat di titik \((0, 0)\) dan berjari-jari satu satuan yang dapat diparameterisasi sebagai $$ \begin{eqnarray} \vec{F }(c(t)) &= & \frac{-\sin t }{\cos^2 t + \sin^2 t} \, \hat{i} + \frac{\cos t }{\cos^2 t + \sin^2 t } \, \hat{j} \\ &=& -\sin t \, \hat{i} + \cos t \, \hat{j} \end{eqnarray} $$ dengan \( 0 <= t <= 2 \pi \). Integral yang dilakukan sepanjang kurva ini tidak sama dengan nol yakni $$ \begin{eqnarray} \int_C \vec{F} \cdot ds & = & \int_{a}^{b} \vec{F} (c(t)) \cdot c' (t) \, dt \\ &=& \int_{0}^{2 \pi} \left( -\sin t \, \hat{i} + \cos t \, \hat{j} \right) \cdot \left( - \sin t \, \hat{i} + \cos t \, \hat{j} \right) \\ &=& \int_{0}^{2\pi } 1 \, dt = 2 \pi \end{eqnarray} $$ Yang artinya terdapat suatu kurva yang mana integral \( \int_C \vec{F} \cdot ds \) tidak sama dengan nol yang mengindikasikan bahwa vektor \( \vec{F}\) bukanlah medan vektor konservatif.
Mengapa demikian adalah karena vektor \( \vec{F} \) memiliki titik singularitas yakni pada titik \((0,0)\). Artinya adanya titik singularitas ini mengakibatkan Teorema Stokes yang menghubungkan integral lintasan dengan curl vektor tidak bisa diterapkan pada medan vektor yang bersangkutan. Curl yang sama dengan nol baru bisa dipakai untuk menandai vektor konservatif jika vektor tersebut didefenisikan pada domain yang simply-connected. Adanya titik singularitas pada contoh di atas mengakibatkan domain tersebut tidak lagi simply-connected. Maksud simply connected sendiri adalah kita dapat mereduksi sembarang kurva dalam domain 2D atau permukaan dalam domain 3D menjadi sebuah titik dan masih tetap berada dalam domain tersebut. Untuk domain 2 dimensi simply connected mengharuskan bahwa seluruh domain terdefenisi secara utuh tanpa ada hole di dalam domain. Sementara untuk domain tiga dimensi sebuah hole pada domain bisa ditoleransi asalkan hole tersebut tidak menembus sampa ke luar domain. Syarat simply-connected ini merupakan syarat mutlak bagi teorema Stokes . Pada kasus dua dimensi adanya hole mengakibatkan kita tidak lagi bisa menghubungkan integral lintasan yang mengelilingi hole tersebut dengan integral permukaan pada keseluruhan hole, karena domainnya tidak terdefenisi pada hole. Sementara pada kasus tiga dimensi, walaupun terdapat suatu hole dalam daerah tertentu kita masih bisa mencari alternatif permukaan yang tidak melalui hole akan tetapi batasannya masih pada kurva yang sama dengan permukaan yang melalui hole tersebut.
Jadi kesimpulannya: suatu medan vektor bersifat konservatif jika curl yang dilakukan pada medan vektor tersebut sama dengan nol serta domain di mana medan vektor tersebut didefenisikan harus simply-connected.
Tuesday, October 15, 2013
Perbedaan operator divergensi dengan operator laplacian
Kata orang fisika itu lebih berat di filosofinya ketimbang di matematikanya. Seorang fisikawan adalah orang yang harus bisa menggambarkan realita dengan kuas matematika atau sebaliknya mampu menangkap makna fisis dari deskripsi matematika yang diberikan. Fisika lebih jauh dari matematika, karena fisika menyangkut hakikat kebendaan suatu benda sementara matematika hanya menyangkut hitung-hitungan tanpa perlu mempertanyakan sesuatu itu punya makna atau tidak. Menjadi fisikawan ibarat menjadi seorang filsuf tingkat tinggi. Ketika ada saudara yang bertanya apa maksud bilangan imajiner pada persamaan Schroodinger, seorang matematikawan tidak akan bisa menjawabnya, tapi seorang fisikawan mengatakan bahwa eksperimen mengharuskan seperti itu. Antara fisika dan matematika itu ibarat jeruk dan nutrisari. Kita mendapati realita fisika dan kita mencari simbol yang cocok dipakai untuk menuliskan fenomena itu.
\[\]
Demikian pula dengan operator divergensi dan operator laplacian. Kelihatannya keduanya sama padahal tidak sama. Seperti pada kasus medan listrik. Kita dapat menuliskan pernyataan semisal
\begin{equation}
\nabla \cdot \vec{E} = \frac{\rho}{\epsilon_0}
\end{equation}
sebagai
\begin{equation}
\nabla^2 V = \frac{\rho}{\epsilon_0}
\end{equation}
Padahal yang kedua merupakan konsekuensi yang pertama: ketika curl suatu vektor sama dengan nol otomatis vektor yang bersangkutan dapat dinyatakan sebagai gradient suatu skalar atau
\begin{equation}
\nabla \times \vec{E} = 0 \Rightarrow \vec{E} = \nabla V
\end{equation}
Jadi kita tidak mungkin menyatakan bahwa
\begin{equation}
\nabla \cdot \vec{B} = 0 \Rightarrow \nabla^2 W = 0
\end{equation}
dengan \(W\) suatu potensial. Hal ini karena
\begin{equation}
\nabla \times \vec{B} \ne 0
\end{equation}
Divergensi suatu (medan) vektor yang sama dengan nol menandakan tidak adanya source atau sink pada medan tersebut. Atau jika kita meninjau volume infinitesimal yang dialiri suatu medan, kita dapat mengatakan bahwa laju fluks yang masuk ke dalam volume infinitesimal sama dengan laju fluks yang keluar dari volume infinitesimal. Hal ini berbeda dengan operator Laplacian yang sama dengan nol yang maksudnya adalah keadaan kesetimbangan sistem yang mana nilai potensial pada suatu titik merupakan nilai rata-rata dari potensial pada titik-titik sekitarnya. Laplacian menyatakan curvature dari suatu potensial. Jika slope menyatakan perubahan suatu potensial terhadap jarak spasial pada ruang, maka laplacian menyatakan perubahan slope tersebut terhadap jarak spasial. Jadi jika nilainya sama dengan nol itu artinya nilai potensial dalam ruang tidak berubah atau berada dalam keadaan kesetimbangan.
Thursday, October 10, 2013
Soal Matriks 2
\( \textbf{Soal} \)
Tunjukkan bahwa tidak ada \( A \in M_2 (R ) \) yang memenuhi
\begin{equation}
A^{2004} = \left (
\begin{array}{cc}
-1 & 0 \\
0 & -2
\end{array}
\right )
\end{equation}
\( \textbf{Jawab} \)
Jika \( A^{2004} = \left(
\begin{array}{cc}
- 1 & 0 \\
0 & -2
\end{array}
\right) \)
Maka terdapat matriks real \( B = A^{1002} \) yang memenuhi
\begin{equation}
B^2 = \left(
\begin{array}{cc}
- 1 & 0 \\
0 & -2
\end{array}
\right)
\end{equation}
Akan kita tunjukkan bahwa matriks \(B\) ini tidak eksis yang yang dengan sendirinya membuktikan soal di atas.
\( \\ \)
Anggap
\begin{equation}
B = \left(
\begin{array}{cc}
a & b \\
c & d
\end{array}
\right)
\end{equation}
Maka
\begin{equation}
B^2 = \left(
\begin{array}{cc}
a^2 + bc & ab + bd \\
ac + cd & d^2 + bc
\end{array}
\right)
=
\left(
\begin{array}{cc}
-1 & 0 \\
0 & -2
\end{array}
\right)
\end{equation}
Tinjau elemen pada baris pertama kolom kedua pada matriks di atas. Yang mana menghasilkan
\begin{equation}
ab + bd = b (a - d) = 0
\end{equation}
Jika \( b\ne 0 \) maka \( a = -d \) yang mengakibatkan elemen diagonal matriks di atas akan sama yakni \( a^2 + bc = d^2 + bc \) padahal tidak, karena \( -1 \ne -2 \).
Sementara jika \( b \ne 0 \) maka dengan meninjau elemen pada baris pertama kolom pertama akan menghasilkan \( a^2 = -1 \) yang tidak mungkin mengingat \( a \) harus real berdasarkan soal. Jadi matriks \( A \) yang memenuhi pernyataan pada soal tidak eksis. QED
sumber: http://math.stackexchange.com/
sumber: http://math.stackexchange.com/
Tutorial matriks 1
\[
\textbf{Soal}
\]
Buktikan bahwa
\begin{equation}
\left(
\begin{array}{cc}
1 & 1 \\
0 & 1
\end{array}
\right)^n =
\left(
\begin{array}{cc}
1 & n \\
0 & 1
\end{array}
\right)
\end{equation}
\[
\textbf{Jawab}
\]
Untuk menjawab soal di atas kita dapat menggunakan induksi matematika, yakni yang pertama anggap bahwa pertanyaan tersebut benar untuk kasus dasar. Misalkan untuk kasus \(n = 2\) pernyataan tersebut benar yakni
\begin{equation}
\left(
\begin{array}{cc}
1 & 1 \\
0 & 1
\end{array}
\right)^2
=
\left(
\begin{array}{cc}
1 & 1\\
0 & 1
\end{array}
\right)
\cdot
\left(
\begin{array}{cc}
1 & 1\\
0 & 1
\end{array}
\right)
=
\left(
\begin{array}{cc}
1 & 2 \\
0 & 1
\end{array}
\right)
\end{equation}
Selanjutnya untuk \(n = k+1\) akan diperoleh
\begin{eqnarray}
\left(
\begin{array}{cc}
1 & 1 \\
0 & 1
\end{array}
\right)^{k + 1}
= \left(
\begin{array}{cc}
1 & 1 \\
0 & 1
\end{array}
\right)
\cdot
\left(
\begin{array}{cc}
1 & 1 \\
0 & 1
\end{array}
\right)^k \\
\equiv
\left(
\begin{array}{cc}
1 & 1 \\
0 & 1
\end{array}
\right)
\cdot
\left(
\begin{array}{cc}
1 & k \\
0 & 1
\end{array}
\right)
\\
= \left(
\begin{array}{cc}
1 & k + 1 \\
0 & 1
\end{array}
\right)
\end{eqnarray}
Pernyataan pada baris kedua dari persamaan di atas menandakan bahwa fakta tersebut sudah benar untuk beberapa kasus dasar misalnya \(n = 2\), QED.
Sumber: math.stackexchange.com
Sumber: math.stackexchange.com
Wednesday, October 9, 2013
Pembuktian Teorema Pi Leibnitz
Berikut ini adalah pembuktian teorema Leibnitz tentang nilai \(\pi \) yang dinyatakan dalam pernyataan
\[
\frac{\pi}{4} = 1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \cdots
\]
Pembuktian teorema di atas dapat dilakukan dengan menggunakan kalkulus sederhana, yakni dari teknik
pengintegralan diketahui bahwa
\[
\frac{d }{dx } (\tan^{-1} x) = \frac{1}{x^2 +1}
\]
dengan \(x^2 + 1\ne 0 \)
Karena \( \tan 0 = 0 \) dan \( \tan \frac{\pi}{4} = 1\) akan diperoleh
\[
\int_{0}^{1} \frac{dx }{x^2 + 1} = \tan^{-1} 1 - \tan^{-1} 0 = \frac{\pi}{4}
\]
Misalkan
\[
a = 1 - x^2 + x^4 - x^6 + x^8 + \cdots
\]
maka
\[
x^2 \cdot a = x^2 - x^4 + x^6 - x^8 + \cdots
\]
atau
\[
a + x^2 \cdot a = 1
\]
sehingga
\[
a = \frac{1}{1 + x^2 }
\]
yang menghasilkan
\[
\frac{1}{1 + x^2 } = 1 - x^2 + x^4 - x^6 + x^8 + \cdots
\]
Jadi
\begin{eqnarray}
\int_{0}^{1} \frac{dx }{x^2 + 1}& = \int_{0}^{1} (1) dx - \int_{0}^{1} (x^2) dx + \int_{0}^{1} (x^4) dx + \cdots \\
&= 1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \cdots
\end{eqnarray}
Yang mana menghasilkan
\[
\frac{\pi}{4} = 1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7 } + \cdots
\]
QED
Tuesday, October 8, 2013
Persamaan Schrodinger untuk partikel bebas
Dalam domain 3D, persamaan Schroodinger dapat dituliskan sebagai
\begin{eqnarray}
-\frac{\hbar^2}{2m } \nabla^2 \psi (\vec{r})= E \psi (\vec{r})
\\
\nabla^2 \psi (\vec{r} ) = - \frac{2m}{\hbar^2} E \psi
(\vec{r}) = -k^2 \psi (\vec{r})
\end{eqnarray}
Dengan melakukan separasi variabel kita dapat menganggap solusi persamaan di atas sebagai
\[
\psi (\vec{r}) = \psi (x, y ,z) = X(x)Y(y)Z(z)
\]
Sehingga persaman Shcroodinger dapat dituliskan menjadi
\[
\left ( \frac{\partial^2}{\partial x^2} + \frac{\partial^2}{\partial y^2} +
\frac{\partial^2}{\partial z^2}\right )
Z(x) Y(y) Z(z) = -k^2 X(x) Y(y)Z(z)
\]
atau jika dibagi dengan \( X(x)Y(y)Z(z)\) diperoleh
\[
\frac{1}{X(x)} \frac{\partial^2 X(x)}{\partial x^2} + \frac{1}{Y(y)} \frac{\partial^2 Y(y) }{\partial y^2}
+ \frac{1}{Z(z)} \frac{\partial^2 Z(z)}{\partial z^2} = - k^2
\]
Jika \(k^2\) dinyatakan sebagai
\[
k^2 = k_x^2 + k_y^2 + k_z^2
\]
Maka akan diperoleh
\[
\left [ \frac{1}{X(x)} \frac{\partial^2 X(x)}{\partial x^2} + k_x^2 \right] + \left[ \frac{1}{Y(y)} \frac{\partial^2 Y(y)}{\partial y^2} + k_y^2\right ] + \left[ \frac{1}{Z(z)} \frac{\partial^2 Z(z)}{\partial z^2} + k_z^2 \right] = 0
\]
Karena masing-masing suku pada persamaan di atas hanya bergantung pada satu variabel, sehingga agar secara simultan penjumlahan ketiga suku menghasilkan nilai nol untuk berapapun nilai \(x, y , z\) yang dimasukkan maka masing-masing suku haruslah sama dengan nol. Atau
\[
\frac{1}{X(x)} \frac{\partial^2 X(x)}{\partial x^2} + k_x^2 = 0 \Rightarrow X(x) = A_1 e^{i k_x x}
\]
\[
\frac{1}{Y(y)} \frac{\partial^2 Y(y)}{\partial y^2} + k_y^2 = 0 \Rightarrow Y(y) = A_2 e^{i k_y y}
\]
\[
\frac{1}{Z(z)} \frac{\partial^2 Z(z)}{\partial z^2} + k_z^2 = 0 \Rightarrow Z(z) = A_3 e^{i k_z z}
\]
Yang mana ketiganya merupakan fungsi harmonik. Jadi dengan mensubstitusikan hasil ini pada asumsi sebelumnya diperoleh penyelesaian persamaan Schroodinger untuk kasus partikel bebas dalam domain 3D yakni
\[
\psi (\vec{r}) = X(x) Y(y) Z(z) =\mathcal{A} e^{i (k_x x + k_y y + k_z z)} = \mathcal{A} e^{i \vec{k} \cdot \vec{r}}
\]
dengan
\[
|\vec{k}|^2 = k_x^2 + k_y^2 + k_z^2
\]
yang mana memberikan nilai energi sebagai
\[
E = \frac{\hbar^2 }{2m} \left ( k_x^2 + k_y^2 + k_z^2 \right )
\]
Sunday, September 22, 2013
Elegi penggunaan Latex part III
Kali ini saya ingin melanjutkan tulisan saya sebelumnya yang mencoba mengajak pada pembaca tentang betapa pentingnya menulis pake Latex.
Sebenarnya di internet sudah ada alat lain yang bisa digunakan untuk menulis latex selain menggunakan koding manual. Nama alat ini adalah Lyx. Sebelum saya mengenal Latex sudah terlebih dahulu saya mengenal Lyx, sayangnya saya g tau cara pakenya karena saya g familiar dengan sintax Latex. Sekarang pun walau saya udah tahu syntax Latex, tapi tetap aja saya bingung pake Lyx. Mungkin pembaca yang lebih berpengalaman sudah sangat familiar sehingga tidak kesulitan.
Masalahnya kemarin sampe kenapa saya tidak jadi beralih ke Lyx adalah karena saya pengen membuat cheatsheet untuk ujian. Saya bingung gimana ngaturnya biar bisa sekecil mungkin di Lyx. Akhirnya terpaksa saya koding manual pake Latex editor (tex studio) dan jadi deh yang bisa anda baca di sini:
https://docs.google.com/file/d/0B1irLqfPwjq0UWdwZ0hYR21DMk0/edit
Adapun source latex-nya anda bisa liat di sini:
https://gist.github.com/fjr66/6654227
Saya tidak katakan hal ini g bisa dilakukan di Lyx, cuman untuk pengalaman saya kemarin, saya g bisa. Makanya saya langsung koding aja di latex editor.
Di samping itu --- untuk coder tahap lanjut --- Lyx itu sudah terintegrasi antara editor dan compilernya. Jadi bagi yang biasa di Linux g akan bisa merasakan penggunaan editor-editor yang tersedia di Linux, semisal gnu Emacs atau vi editor yang punya fasilitas yang sangat keren untuk dilewatkan. Dan tentunya bisa juga digunakan untuk menulis Latex.
Sebenarnya di internet sudah ada alat lain yang bisa digunakan untuk menulis latex selain menggunakan koding manual. Nama alat ini adalah Lyx. Sebelum saya mengenal Latex sudah terlebih dahulu saya mengenal Lyx, sayangnya saya g tau cara pakenya karena saya g familiar dengan sintax Latex. Sekarang pun walau saya udah tahu syntax Latex, tapi tetap aja saya bingung pake Lyx. Mungkin pembaca yang lebih berpengalaman sudah sangat familiar sehingga tidak kesulitan.
Masalahnya kemarin sampe kenapa saya tidak jadi beralih ke Lyx adalah karena saya pengen membuat cheatsheet untuk ujian. Saya bingung gimana ngaturnya biar bisa sekecil mungkin di Lyx. Akhirnya terpaksa saya koding manual pake Latex editor (tex studio) dan jadi deh yang bisa anda baca di sini:
https://docs.google.com/file/d/0B1irLqfPwjq0UWdwZ0hYR21DMk0/edit
Adapun source latex-nya anda bisa liat di sini:
https://gist.github.com/fjr66/6654227
Saya tidak katakan hal ini g bisa dilakukan di Lyx, cuman untuk pengalaman saya kemarin, saya g bisa. Makanya saya langsung koding aja di latex editor.
Di samping itu --- untuk coder tahap lanjut --- Lyx itu sudah terintegrasi antara editor dan compilernya. Jadi bagi yang biasa di Linux g akan bisa merasakan penggunaan editor-editor yang tersedia di Linux, semisal gnu Emacs atau vi editor yang punya fasilitas yang sangat keren untuk dilewatkan. Dan tentunya bisa juga digunakan untuk menulis Latex.
Tuesday, September 17, 2013
Java Parallel fork/join
Dalam Tulisan kali ini saya ingin sedikit berbagi pengalaman tentang hal-hal terbaru yang nanti akan keluar di java 8. Seperti kita ketahui, nanti rencananya akan ada sedikit pembaruan terhadap rilis selanjutnya dari java, antara lain adanya lambda expression, bulk operation, method-reference, dan yang paling keren nanti adalah adanya optimasi parallel-computing dengan bantuan teknik fork/join.
Optimisasi dengan metode fork/join ini mengambil keuntungan dari kemampuan multicore processor. Sehingga multithread tidak dicoding secara manual, akan tetapi tinggal menerapkan implementasinya. Agar bisa menggunakan konsep fork/join ini, terlebih dahulu anda harus menyediakan jdk8 beserta IDE yang sesuai. Bagi pengguna eclipse petunjuknya bisa dilihat di link berikut:
http://www.oracle.com/technetwork/articles/java/lambda-1984522.html
Setelah saya mencoba mengimplementasikan teknik ini pada sebuah percobaan sederhana, yakni simulasi SPH, ternyata terdapat perbedaan yang cukup signifikan antara menggunakan teknik ini dengan tidak menggunakan teknik ini. Dalam simulasi SPH tersebut, partikel yang digunakan sejumlah 2500. Ketika tidak menggunakan teknik fork/join simulasi yang dilakukan agak tersendat-sendat. Hal ini dapat dilihat pada video berikut:
Sementara ketika teknik fork/join digunakan hasil simulasinya menjadi mulus, yang dapat dilihat pada video berikut:
Adapun sedikit potongan kode bagaimana mengimplementasikan konsep ini ke dalam project yang dibuat---disamping sudah dijelaskan pada tutorial di atas---dapat dilihat pada snippet berikut:
Optimisasi dengan metode fork/join ini mengambil keuntungan dari kemampuan multicore processor. Sehingga multithread tidak dicoding secara manual, akan tetapi tinggal menerapkan implementasinya. Agar bisa menggunakan konsep fork/join ini, terlebih dahulu anda harus menyediakan jdk8 beserta IDE yang sesuai. Bagi pengguna eclipse petunjuknya bisa dilihat di link berikut:
http://www.oracle.com/technetwork/articles/java/lambda-1984522.html
Setelah saya mencoba mengimplementasikan teknik ini pada sebuah percobaan sederhana, yakni simulasi SPH, ternyata terdapat perbedaan yang cukup signifikan antara menggunakan teknik ini dengan tidak menggunakan teknik ini. Dalam simulasi SPH tersebut, partikel yang digunakan sejumlah 2500. Ketika tidak menggunakan teknik fork/join simulasi yang dilakukan agak tersendat-sendat. Hal ini dapat dilihat pada video berikut:
Sementara ketika teknik fork/join digunakan hasil simulasinya menjadi mulus, yang dapat dilihat pada video berikut:
Adapun sedikit potongan kode bagaimana mengimplementasikan konsep ini ke dalam project yang dibuat---disamping sudah dijelaskan pada tutorial di atas---dapat dilihat pada snippet berikut:
Tuesday, September 3, 2013
Barnes-hut tree in JavaFX
Pada kesempatan kali ini saya akan membagikan sedikit pengalaman saya dalam javaFX kepada pembaca semua yang mungkin bisa mengambil manfaat. Sekaligus mempopulerkan blog saya ini.
Yang saya akan ungkapkan kali ini adalah algoritma barnes-hut yang merupakan algoritma yang biasa digunakan dalam software-software simulasi fisika (semisal molekular dinamik dan semisalnya) [1].
Kali ini saya belum membahas tentang bagaimana algoritma tersebut digunakan untuk menghitung interaksi dalam simulasi. Akan tetapi yang saya lakukan adalah memberi gambaran dasar bagaimana algoritma tersebut bekerja. Tepatnya saya akan melakukan penggambaran animasi barnes-hut tree yang merupakan elemen inti dari algoritma ini.
Mengapa algoritma ini digunakan, adalah karena efisiensinya yang lebih bagus ketimbang skema brute-force yang biasa kita gunakan. Di mana kalo pake brute-force itu kompleksitasnya sampe O(N^2) maka dalam barnes-hut ini, kompleksitasnya adalah O(N log N).
Untuk source-nya dapat anda download di link berikut:
https://docs.google.com/file/d/0B1irLqfPwjq0YXA0emt2WWMtNkU/edit?usp=sharing
Referensi:
1. http://arborjs.org/docs/barnes-hut
Yang saya akan ungkapkan kali ini adalah algoritma barnes-hut yang merupakan algoritma yang biasa digunakan dalam software-software simulasi fisika (semisal molekular dinamik dan semisalnya) [1].
Kali ini saya belum membahas tentang bagaimana algoritma tersebut digunakan untuk menghitung interaksi dalam simulasi. Akan tetapi yang saya lakukan adalah memberi gambaran dasar bagaimana algoritma tersebut bekerja. Tepatnya saya akan melakukan penggambaran animasi barnes-hut tree yang merupakan elemen inti dari algoritma ini.
Mengapa algoritma ini digunakan, adalah karena efisiensinya yang lebih bagus ketimbang skema brute-force yang biasa kita gunakan. Di mana kalo pake brute-force itu kompleksitasnya sampe O(N^2) maka dalam barnes-hut ini, kompleksitasnya adalah O(N log N).
Untuk source-nya dapat anda download di link berikut:
https://docs.google.com/file/d/0B1irLqfPwjq0YXA0emt2WWMtNkU/edit?usp=sharing
Referensi:
1. http://arborjs.org/docs/barnes-hut
Friday, August 23, 2013
Cara sortir di Java
Tanpa perlu basa-basi saya akan memberikan sedikit tutorial yakni bagaimana cara menyortir list di java. Seperti kita ketahui list itu sendiri merupakan suatu kumpulan objek. Untuk keperluan sortir sendiri, java sudah menyediakan fasilitas built-in ke kita. Yakni dengan menggunakan utilitas pada java Collections. Berdasarkan informasi yang saya peroleh, algoritma yang digunakan dalam java sorting ini adalah merge sort [1]. Tanpa perlu berbasa basi saudara tinggal menyalin contoh berikut dan langsung di running di komputer anda.
Jika sudah maka hasil yang akan ditampilkan adalah sebagai berikut:
1. http://www.coderanch.com/t/520171/java/java/Collections-sort-merge-sort-insteadof
Jika sudah maka hasil yang akan ditampilkan adalah sebagai berikut:
1. http://www.coderanch.com/t/520171/java/java/Collections-sort-merge-sort-insteadof
Tuesday, August 20, 2013
Animasi Bola Biliard dengan JavaFX
Kali ini saya akan memberikan sebuah tutorial mengenai bagaimana membuat animasi bola billiard dengan javaFX yang preview-nya dapat dilihat pada gambar berikut:
Adapun source codenya adalah sebagai berikut:
package fjr.collision; import java.util.ArrayList; import java.util.Random; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ButtonBuilder; import javafx.scene.shape.Circle; import javafx.scene.shape.CircleBuilder; import javafx.stage.Stage; import javafx.util.Duration; public class BilliardBallDetection extends Application { ArrayListlistParticle; ArrayList listCircle; double xwidth = 400; double ywidth = 400; double timeStep = 2.5; double numberParticle = 9; Random rand = new Random(); double dmin = 30.0; double xmax = xwidth; double xmin = 0.0; double ymax = ywidth; double ymin = 0.0; double size = 0.0; double dmax = 0.0; double vmax = 3.0; Timeline animation; Button buttonPause, buttonPlay; @Override public void start(Stage primarySrage) throws Exception { // TODO Auto-generated method stub generateParticle(); removeOverlap(listParticle); generateCircle(); Group root = new Group(); for(int i =0; i< listCircle.size(); i++){ Circle c = listCircle.get(i); root.getChildren().add(c); } animation = new Timeline(); animation.setCycleCount(Timeline.INDEFINITE); animation.setAutoReverse(false); KeyFrame kf = new KeyFrame(Duration.millis(20), new EventHandler (){ @Override public void handle(ActionEvent event) { // TODO Auto-generated method stub checkBoundary(); calculateCollision(); moveParticle(); redrawCircle(); } }); animation.getKeyFrames().add(kf); root.getChildren().addAll(buttonPlay = ButtonBuilder.create() .text("PLAY").onAction(new EventHandler () { @Override public void handle(ActionEvent arg0) { // TODO Auto-generated method stub animation.play(); } }).translateX(10).translateY(10) .build(), buttonPause = ButtonBuilder.create() .text("PAUSE").translateX(80).translateY(10) .onAction(new EventHandler () { @Override public void handle(ActionEvent arg0) { // TODO Auto-generated method stub animation.pause(); } }) .build() ); primarySrage.setScene(new Scene(root, xwidth, ywidth)); primarySrage.show(); } private void redrawCircle(){ for(int i=0; i< listCircle.size(); i++){ Circle c = listCircle.get(i); Particle p = listParticle.get(i); c.setCenterX(p.x); c.setCenterY(p.y); } } private void generateCircle(){ listCircle = new ArrayList<>(); for(int i=0; i< listParticle.size(); i++){ Particle p = listParticle.get(i); Circle c = CircleBuilder.create() .centerX(p.x).centerY(p.y).radius(dmin) .build(); listCircle.add(c); } } private void generateParticle() { listParticle = new ArrayList<>(); for (int i = 0; i < numberParticle; i++) { Particle particle = new Particle(rand.nextDouble() * xwidth, rand.nextDouble() * ywidth, rand.nextDouble() * vmax, rand.nextDouble() * vmax); listParticle.add(particle); } } private void calculateCollision(){ for(int i=0; i< listParticle.size(); i++){ Particle p1 = listParticle.get(i); for(int j= i+1; j< listParticle.size(); j++ ){ Particle p2 = listParticle.get(j); chekCollision(p1, p2); } } } public void chekCollision(Particle p1, Particle p2) { if (isOverlap(p1, p2)) { double deltaX = p1.x - p2.x; double deltaY = p1.y - p2.y; double distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); deltaX = deltaX/ distance; deltaY = deltaY/distance; double aci = p1.vx * deltaX + p1.vy * deltaY; double bci = p2.vx * deltaX + p2.vy * deltaY; double acf = bci; double bcf = aci; p1.vx = p1.vx + (acf - aci) * deltaX; p1.vy = p1.vy + (acf - aci) * deltaY; p2.vx = p2.vx + (bcf - bci) * deltaX; p2.vy = p2.vy + (bcf - bci) * deltaY; } } private void moveParticle() { for (int i = 0; i < listParticle.size(); i++) { Particle p = listParticle.get(i); p.x += p.vx * timeStep; p.y += p.vy * timeStep; } } public void removeOverlap(ArrayList list) { for (int i = 0; i < list.size(); i++) { Particle p1 = list.get(i); for (int j = list.size() - 1; j > i; j--) { Particle p2 = list.get(j); if(isOverlap(p1, p2)) list.remove(j); } } } public void checkBoundary(){ for(int i =0; i< listParticle.size() ;i++){ Particle p = listParticle.get(i); if(p.x > xmax - dmin) p.vx = -Math.abs(p.vx) ; if(p.x < xmin + dmin) p.vx = Math.abs(p.vx); if(p.y > ymax - dmin) p.vy = - Math.abs(p.vy); if(p.y < ymin + dmin) p.vy = Math.abs(p.vy); } } private boolean isOverlap(Particle p1, Particle p2){ double deltax = p1.x - p2.x; double deltay = p1.y - p2.y; if(deltax * deltax + deltay * deltay < 4 * dmin * dmin) return true; return false; } public static void main(String[] args) { launch(args); } private class Particle { double x = 0.0; double y = 0.0; double vx = 0.0; double vy = 0.0; public Particle(double x, double y , double vx , double vy ) { this.x = x; this.y = y; this.vx = vx ; this.vy = vy; } } }
Monday, August 19, 2013
Deteksi tumbukan dengan javaFX
Pada tutorial ini saya akan memberikan bagaimana cara mendeteksti tumbukan dengan javaFX yang previewnya dapat dilihat pada gambar berikut:
Adapaun source codenya adalah:
package fjr.collision; import java.util.Random; import javafx.application.Application; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ButtonBuilder; import javafx.scene.shape.Circle; import javafx.scene.shape.CircleBuilder; import javafx.stage.Stage; public class TestCollision extends Application { double r = 14.0; Random rand = new Random(); double xwidth = 400; double ywidth = 400; int numberParticle = 100; // uji tumbukan public boolean testCol(Circle p1, Circle p2) { double dx = p1.getCenterX() - p2.getCenterX(); double dy = p1.getCenterY() - p2.getCenterY(); if (dx * dx + dy * dy < 4 * r * r) { return true; } return false; } public void removeOverlap(ObservableListlist) { for (int i = 0 ; i< list.size() ; i++ ) { if (list.get(i) instanceof Circle) { Circle p1 = (Circle) list.get(i); for (int j = list.size()- 1 ; j > i ; j-- ) { if (list.get(j) instanceof Circle) { Circle p2 = (Circle) list.get(j); if (testCol(p1, p2)) { list.remove(j); } } } } } } public static void main(String[] args) { launch(args); } Button button, button1; boolean state = true; @Override public void start(Stage primaryStage) throws Exception { final Group root = new Group(); primaryStage.setScene(new Scene(root, xwidth, ywidth)); for (int i = 0; i < numberParticle; i++) { root.getChildren().add( CircleBuilder.create().centerX(rand.nextDouble() * xwidth) .centerY(rand.nextDouble() * ywidth).radius(r) .build()); } button = ButtonBuilder.create().text("ORGANIZE").translateX(10) .translateY(10).build(); button1 = ButtonBuilder.create().text("RESET").translateX(100) .translateY(10).build(); root.getChildren().addAll(button, button1); button.setOnAction(new EventHandler () { @Override public void handle(ActionEvent arg0) { if (state) { removeOverlap(root.getChildren()); } state = false; } }); button1.setOnAction(new EventHandler () { @Override public void handle(ActionEvent arg0) { for (int i = root.getChildren().size() - 1; i >= 0; i--) { root.getChildren().remove(i); } for (int i = 0; i < numberParticle; i++) { root.getChildren().add( CircleBuilder.create() .centerX(rand.nextDouble() * xwidth) .centerY(rand.nextDouble() * ywidth) .radius(r).build()); } root.getChildren().addAll(button, button1); state = true; } }); primaryStage.show(); } }
Sunday, August 18, 2013
Export gambar ke kode Latex
Seperti kita ketahui bahwa menggambar di Latex itu biasanya menggunakan beberapa library, di mana dua di antaranya yang paling populer adalah tikZ dan pstrick. Dalam menggunakan kedua librari ini otomatis kita harus menuliskan kode-kodenya. Masalahnya adalah kode-kode ini tidak mudah dihapal, sehingga sangat menyulitkan bagi kita yang tidak punya banyak waktu untuk keperluan ini.
Oleh karena itu beberapa developer sudah menyediakan fasilitas untuk mengeksport gambar yang dibuat tool-tool gui yang ada ke kode Latex. Beberapa software yang punya kapasitas ini antara lain, adalah:
1. Dia http://dia-installer.de/ : mempunyai banyak fasilitas dan built-in library untuk menggambar diagram atau sirkuit elektronik. Dan hasilnya bisa dieksport ke kode Latex:
2. Inkscape, http://inkscape.org/ :
Akan tetapi untuk inkscape ini, yang versi 0.48 hanya tersedia untuk pstrick. Masalahnya adalah pstrick sendiri kurang portable jika dibandingkan dengan tikZ.
3. MatplotLib (http://matplotlib.org/users/whats_new.html#pgf-tikz-backend). Yang terakhir ini merupakan library dari python untuk keperluan plot.
Wednesday, July 17, 2013
Jawaban soal nomor dua pelatihan MATLAB
Bagi teman-teman sekalian yang mungkin belum mengetahui bagaimana jawaban soal nomor dua, berikut saya berikan listingnya. Silakan dicoba sendiri di rumah. Semoga bermanfaat
% jawaban nomor dua function plot_bolak_balik clc; f = figure('menubar', 'none'); x = linspace(45 ,405,100); y1 = cosd(x); y2 = sind(x); plot(x, y1, 'b.- ', x, y2, 'g.-'); % untuk menjaga sumbunya konstan hold on ; i = 1; state = true; while ishandle(f), if state p = plot(x(i), y1(i), 'r.' , 'Markersize' ,30); if(i == numel(x) ), state = false; i = i - 1; end i = i+ 1; pause(0.02); if ishandle(p),delete(p); end else p = plot(x(i), y2(i), 'r.' , 'Markersize' ,30); if(i == 1 ), state = true ; i = i+ 1; end i = i- 1; pause(0.02); if ishandle(p),delete(p); end end endAdapun hasil cuplikan animasinya adalah sebagai berikut
Hubungan ukuran array dengan performa indeks di MATLAB
Posting kali ini masih berhubungan dengan posting saya sebelumnya. Cuma pada bagian ini saya akan memperlihatkan bagaimana hubungan antara ukuran array dengan lama eksekusi dengan metode indeks. Ternyata hasil yang diperoleh meunjukkan bahwa dengan menggunakan looping di MATLAB, waktu eksekusi yang diberikan bertambah secara signifikan dan cenderung eksponensial. Sementara dengan bantuan indeks, waktu eksekusi datar-datar saja. Adapun codenya bisa dilihat pada listing berikut
function indeks1 clear all ; clc; step = 100:50:700; cara1 = zeros(length(step),1); cara2 = zeros(length(step),1); for ii=1:numel(step) % first way, iterate trough looping dim = step(ii); Y = zeros(dim,dim) ; tic ; for i=1:length(Y), for j=1:length(Y(1,:)), if mod(i+j, 2) == 0 Y(i,j) = 2; else Y(i,j) = 1; end end end cara1(ii) = toc; % second way, using MATLAB index X = zeros(dim,dim) ; tic; [a,b] = ind2sub(size(X), 1:numel(X)) ; X((mod(a+b, 2) ==0)) = 2; X((mod(a+b, 2) > 0)) = 1; cara2(ii) = toc; end plot(step, cara1, 'r.-', step, cara2, 'g.-' ) disp('Is the first get the same output with the second?') indeks = find(Y(:,:) ~= X(:,:)); xlabel('ukuran array'); ylabel('lama eksekusi dalam detik'); if(numel(indeks) == 0), disp('oh... yes.. '); endDi mana saya sudah melakukan perubahan time step dalam rentang yang berbeda-beda. Pada hasilnya juga diperlihatkan bahwa penggunaan indeks ini sangat terasa ketika ukuran array semakin besar.
Anda bisa mengetes sendiri untuk selang waktu yang lain. Tentunya MATLAB membatasi kita dalam mengalokasikan array, mengingat kapasitas memori yang terbatas. Untuk mengetahui kapasitas memori di komputer anda, matlab menyediakan perintah
memory
yang bisa digunakan untuk memperkirakan kapasitas array yang bisa anda alokasikan. Performa indeks di MATLAB bagian 2
Pada kesempatan kali ini sekali lagi saya menekankan pentingnya menghindari looping dalam pemrograman MATLAB. Kebetulan ini merupakan soal yang saya berikan dalam pelatihan MATLAB kemarin kepada teman-teman. Saya g tau apa ini bisa dikerjakan atau tidak, yang jelas saya kasikan aja jawabannya, sekalian berbagi pengetahuan. Semoga bisa diambil manfaatnya.
Soalnya adalah diberikan sebuah matriks yang ukurannya 1000 x 1000. Kenapa 1000 x 1000, karena biar kita terbiasa dengan perhitungan sesungguhnya di lapangan. Pada matriks ini, sederhana saja yang dilakukan yakni, jika penjumlahan baris dan kolom genap, isi matriks tersebut dengan angka dua, sementara jika ganjil, isi dengan 1. Adapaun hasil codingnya adalah sebagai berikut.
Jadi terlihat jelas bahwa performa indeks 10 kali lipat lebih cepat ketimbang pake looping.
Soalnya adalah diberikan sebuah matriks yang ukurannya 1000 x 1000. Kenapa 1000 x 1000, karena biar kita terbiasa dengan perhitungan sesungguhnya di lapangan. Pada matriks ini, sederhana saja yang dilakukan yakni, jika penjumlahan baris dan kolom genap, isi matriks tersebut dengan angka dua, sementara jika ganjil, isi dengan 1. Adapaun hasil codingnya adalah sebagai berikut.
Jadi terlihat jelas bahwa performa indeks 10 kali lipat lebih cepat ketimbang pake looping.
Sunday, July 14, 2013
Rut-etra-izer versi JavaFX
Pada tutorial kali ini saya akan mendemonstrasikan salah satu kegunaan dari JavaFX yakni dalam melakukan translate terhadap salah satu aplikasi berbasis javascript yakni Rut-etra-izer kedalam bahasa java. Kebetulan saya agak penasaran dengan kecanggihan aplikasi ini. Saya baru tahu soalnya dan saya harap pembaca bisa mengambil manfaat dari tutorial ini. Adapun hasil mentahnya dapat dilihat pada gambar berikut:
Maksud saya adalah saya pengen berbagi tutorial aja. Semoga bermanfaat!
package fjr.main.rutte.traizer; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.image.PixelReader; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.shape.LineTo; import javafx.scene.shape.MoveTo; import javafx.scene.shape.Path; import javafx.scene.shape.PathBuilder; import javafx.scene.shape.QuadCurve; import javafx.scene.transform.Affine; import javafx.scene.transform.Rotate; import javafx.stage.Stage; public class Rutte extends Application { static String main = Rutte.class.getResource("mami.jpg").toExternalForm(); int step = 5; int stepY = 50; double depth = 56; double width = 0 ; double height = 0; @Override public void start(Stage primaryStage) throws Exception { Group root = getEsembel(); primaryStage.setScene(new Scene(root)); primaryStage.setTitle("TUT WURI HANDAYANI"); primaryStage.show(); } public Group getEsembel() { Group root = new Group(); Image image = new Image(main); width = image.getWidth(); height = image.getHeight(); PixelReader pixel = image.getPixelReader(); double originX = 0; double destinyX = 0; double originY = 100; double destinyY = 0.0; Canvas canvas = new Canvas(width+50,height+50); GraphicsContext gc = canvas.getGraphicsContext2D(); double shifty =0; for(int y = 0 ; y < height; y+= step){ for(int x = 0; x < width-step ;x+= step){ Color color = pixel.getColor(x, y); Color color1 = pixel.getColor(x+step, y); double brightness = color.getBrightness(); double brightness1 = color1.getBrightness(); originX = x ; destinyX = x+step; originY = - brightness*depth+brightness/2 + shifty; destinyY = - brightness1*depth+brightness1/2+ shifty; gc.setStroke(color); this.rotateX(gc, -30); gc.strokeLine(originX,originY, destinyX, destinyY ); originX = destinyX ; originY = destinyY; } shifty+= 5; } root.setTranslateX(20); root.setTranslateY(20); root.getChildren().add(canvas); return root; } /* * I'm not found the way to rotate GraphicContext with simple way like other node */ static void rotateX(GraphicsContext gc , double angle){ Affine affine = new Affine(); double angleRadi = Math.toRadians(angle); double sinus = Math.sin(angleRadi); double cosinus = Math.cos(angleRadi); affine.setMxx(1); affine.setMxy(0); affine.setMxz(0); affine.setTx(0); affine.setMyx(0); affine.setMyy(cosinus); affine.setMyz(-sinus); affine.setTy(0); affine.setMzx(0); affine.setMzy(sinus); affine.setMzz(cosinus); affine.setTz(0); gc.setTransform(affine); } static void rotateY(GraphicsContext gc , double angle){ Affine affine = new Affine(); double angleRadi = Math.toRadians(angle); double sinus = Math.sin(angleRadi); double cosinus = Math.cos(angleRadi); affine.setMxx(cosinus); affine.setMxy(0); affine.setMxz(sinus); affine.setTx(0); affine.setMyx(0); affine.setMyy(1); affine.setMyz(0); affine.setTy(0); affine.setMzx(-sinus); affine.setMzy(0); affine.setMzz(-cosinus); affine.setTz(0); gc.setTransform(affine); } static void rotateZ(GraphicsContext gc , double angle){ Affine affine = new Affine(); double angleRadi = Math.toRadians(angle); double sinus = Math.sin(angleRadi); double cosinus = Math.cos(angleRadi); affine.setMxx(cosinus); affine.setMxy(-sinus); affine.setMxz(0); affine.setTx(0); affine.setMyx(sinus); affine.setMyy(cosinus); affine.setMyz(0); affine.setTy(0); affine.setMzx(0); affine.setMzy(0); affine.setMzz(1); affine.setTz(0); gc.setTransform(affine); } public Group getLine(double y) { Group root = new Group(); return root; } public static void main(String[] args) { launch(args); } }Sebenarnya masih ada beberapa bagian yang ingin saya sempurnakan, misalnya respon terhadap mouse, drag n drop terhadap foto serta menyimpan hasil ke dalam gambar JPEG. Tapi biar g terlalu basi, mendingan dipublish aja versi BETA-nya. Itupun kalo layak disebut BETA.
Maksud saya adalah saya pengen berbagi tutorial aja. Semoga bermanfaat!
Tuesday, July 9, 2013
Performa indeks dalam mengganti logika if di MATLAB
Posting ini berkaitan dengan posting saya sebelumnya yakni tentang vektorisasi molekular dinamik di MATLAB:
yang sampai saat ini masih menyisakan pertanyaan besar di kepala saya. Antara lain, mengapa vektorisasi justru membutuhkan waktu lebih lama, serta yang kedua, entah kenapa simulasinya g sesuai dengan yang diharapkan: terjadi kolaps setelah waktu tertentu dan perpindahan posisi yang cukup lambat ketimbang companion-nya yang dibuat di java [1]. Dalam menyelidiki masalah ini saya sekali lagi pengen menunjukin kenapa vektorisasi itu penting di MATLAB dan sebisa mungkin kita harus menghindari loop dalam menulis program di MATLAB.
Oleh karena itu saudara bisa menyimak listing berikut
Terlihat jelas bahwa penggunaan indeks di MATLAB bisa digunakan untuk mengganti logika if pada looping. Lantas bagaimana dengan performanya. Pada listing berikut ini telah saya ukur bagaimana performa dari indeks sendiri.
Yang mana menunjukkan bahwa dengan menggunakan indeks kita bisa mengurangi waktu eksekusi program hingga sampai setengahnya. Hal ini jelas disebabkan oleh perintah indeks sendiri ditangani secara 'native' oleh MATLAB interpreter.
Fakta kedua yang bisa digaris bawahi adalah ternyata dua fungsi dalam satu file pada MATLAB alokasi eksekusinya ditempatkan pada core processor yang berbeda seperti sudah saya komentari pada listing di atas.
Oleh karena itu saudara bisa menyimak listing berikut
Terlihat jelas bahwa penggunaan indeks di MATLAB bisa digunakan untuk mengganti logika if pada looping. Lantas bagaimana dengan performanya. Pada listing berikut ini telah saya ukur bagaimana performa dari indeks sendiri.
Yang mana menunjukkan bahwa dengan menggunakan indeks kita bisa mengurangi waktu eksekusi program hingga sampai setengahnya. Hal ini jelas disebabkan oleh perintah indeks sendiri ditangani secara 'native' oleh MATLAB interpreter.
Fakta kedua yang bisa digaris bawahi adalah ternyata dua fungsi dalam satu file pada MATLAB alokasi eksekusinya ditempatkan pada core processor yang berbeda seperti sudah saya komentari pada listing di atas.
1. Ternyata perintah
axis manual
di MATLAB hanya berlaku ketika ada perintah hold on
.Sunday, July 7, 2013
Vektorisasi loop molekular dinamik di MATLAB
Hal ini berlaku pula dalam dunia pemrograman. Dalam dokumentasi resmi MATLAB yang saya ambil di link http://www.mathworks.com/help/matlab/matlab_prog/techniques-for-improving-performance.html disebutkan bahwa agar program MATLAB bisa berjalan dengan lebih cepat maka salah satu cara yang bisa digunakan adalah menggunakan pre-alocating array dan menghindari penggunaan looping:
http://stackoverflow.com/questions/12074373/matlab-vectorization-how-to-avoid-this-for-loop
http://stackoverflow.com/questions/16214891/how-to-avoid-a-for-loop-in-matlab-when-performing-a-operation-on-each-row-in-a
Akan tetapi baru-baru ini saya mencoba mengetes dugaan tersebut dalam simulasi molekular dinamik. Dan ternyata hasilnya tidak sesuai yang ada pada buku. Rupanya pengembangan MATLAB akhir-akhir ini cenderung melakukan optimisasi pada looping ketimbang prosedur standar (yakni operasi matriks) yang merupakan brand dari MATLAB.
Simulasi molekular dinamik sendiri saya translate dari sumber di
http://www.personal.psu.edu/auk183/MolDynamics/Molecular%20Dynamics%20Simulations.html
Yang aslinya dikembangkan dengan bahasa java. Setelah melakukan debugging yang susah payah, akhirnya saya berhasil mengembangkan versi MATLAB nya: menggunakan teknik vektorisasi yang menjadi brand MATLAB ketimbang menggunakan looping yang katanya mengurangi performa. Berikut merupakan kode hasil vektorisasi tersebut
Adapun kode hasil translate secara 'mentah' adalah sebagai berikut
Setelah dieksekusi terlihat bahwa hasil penggunaan loop bukannya memperlambat performa, malah mempercepat performa dari program MATLAB sendiri. Rata-rata waktu eksekusi looping berada di sekitar 0.03 detik, sementara hasil vektorisasi ternyata membutuhkan waktu 3 kali lebih lama yani berada di sekitar 0.1 detik.
Saturday, July 6, 2013
Belajar Monte Carlo di MATLAB
Berikut saya berikan contoh program tentang bagaimana menghitung luas poligon dengan metode monte carlo. Saya harap dengan pemahaman ini, teman-teman semua bisa memahami hakikat dari monte carlo. Sehingga bisa menggunakannya untuk keperluan-keperluan lainnya.
Plot gerak jatuh bebas di MATLAB
Buat teman-teman sekalian yang ingin belajar plot gerak jatuh bebas di MATLAB berikut saya berikan sedikit tutorial. Semoga bermanfaat:
Thursday, July 4, 2013
Belajar Latex
Bagi teman-teman sekalian yang pengen belajar Latex, saya akan memberikan buku ala kadarnya yang jauh dari kesempurnaan. Semoga bisa dinikmati
Untuk downloadnya di:
Tuesday, July 2, 2013
Berkenalan dengan bahasa python
Pada kesempatan kali ini saya akan mencoba sedikit membahas tentang salah satu bahasa pemrograman yang cukup populer di dunia, yakni bahasa pemrograman python. Mengapa python, karena bahasa python merupakan salah satu bahasa yang bisa menghadirkan banyak fleksibilitas dengan kehandalan yang sudah diakui. Bagi saya python itu bahasa yang sangat fleksibel. Mungkin anda pernah punya pengalaman dengan bahasa semisal MATLAB atau sejenisnya. Tapi menurut saya bahasa tersebut terlalu kaku. Memang untuk para enggineer, MATLAB sudah menyediakan beberapa fitur built-in yang sangat membantu. Tapi jika dipikir-pikir dari sekian banyak fitur-fitur tersebut hanya sedikit saja yang benar-benar kita butuhkan. Yang lainnya merupakan fitur hasil abstraksi tingkat tinggi yang sebenarnya kurang begitu kita perlukan, atau bahkan sama sekali tidak sesuai dengan kebutuhan kita sehingga harus dimodifikasi lebih lanjut atau dicarikan alternatifnya.
Misalnya saja financial toolbox atau medical toolbox. Saya yakin kalo orang berkecimpung di dunia medis atau ekonomi, tentu sudah ada alat default yang biasa mereka gunakan yang spesifik untuk kebutuhan mereka ketimbang harus menggunakan MATLAB yang kurang populer di kalangan mereka. Bayangkan harga MATLAB berapa kemudian ukuran file instalasinya berapa, sementara yang kita butuhkan hanya operasi-operasi dasar matriks yang dalam bahasa lain pun sudah tersedia dengan gratis.
Python sendiri sebagai bahasa pemrograman punya domain penggunaan yang sangat luas di samping komunitasnya sangat aktif. Komunitas inilah yang menjadi penentu dalam pengembangan bahasa pemrograman. Kalo komunitasnya mandek otomatis bahasanya juga ikutan stagnan. Sementara kalo kita sudah sangat mahir di MATLAB atau beberapa bahasa pemrograman lainnya---kecuali kita seorang developer yang dihire untuk mempekerjakan proyek-proyek berbasis MATLAB---tentu lebih tertarik menggunakan bahasa-bahasa lain yang lebih interaktif dan free. Jika menguasai python, kecakapan tersebut bisa digunakan untuk kebutuhan lain misalnya untuk membangun aplikasi database atau aplikasi berbasis web. Sementara jika cuma tahu MATLAB, g ada yang bisa dilakukan (setidaknya di Indonesia ini). Bahkan di laboratorium fisika di seluruh dunia bahasa yang dipakai pun bukan MATLAB melainkan fortran atau C. Sementara untuk tahu bahasa fortran dan C, sebagai langkah awal kita harus belajar dulu bahasa yang konsepnya mudah dipahami semacam python.
Tapi ini perspektif pribadi. Anda boleh saja punya pendapat lain yang mungkin saja lebih shahih. Yang jelas untuk perkenalan saya akan memberikan sebuah potongan operasi dasar pada python. Kebetulan python sendiri merupakan bahasa yang sedikit banyak terinspirasi dengan bahasa Lisp---yakn penyerapan konsep List ke dalam struktur bahasanya----maka saya akan menggunakan konsep list tersebut yang kebetulan juga baru-baru ini saya pelajari:D.
Untuk mulai menggunakan python, terlebih dahulu kita mesti mendownload file instalasinya di https://code.google.com/p/winpython/. Sebagai perkenalan, berikut saya berikan sebuah listing tentang operasi perkalian matrix di python. Kebetulan saya sedang membuat buku (dalam bahasa Indonesia) untuk pemrograman di python---Masalahanya kalo dalam bahasa Inggris sangat melimpah di internet. Jadi penjelasannya menyusul di belakang.
Subscribe to:
Posts (Atom)