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 θ dapat dinyatakan sebagai fungsi x yakni θ=180otan1(2x)tan1(53x)
yang nilai maksimumnya dapat dinyatakan sebagai dθdx=0+2x211+4x25(3x)211+25(3x)2=2x2+45(3x)2+25=0
atau 3x2+12x12=0
yang akarnya adalah x=6±62. Di mana yang memenuhi adalah x=6+62=6(21)2.4 Untuk mengilustrasikan jawaban tersebut, saya sudah membuat sebuah program sederhana dalam bahasa MATLAB yang sourcenya pembaca bisa coba di rumah, ditulis dengan menggunakan MATLAB 2009. Adapun sourcenya adalah:
% jawaban soal nomor 57 BAB 4.7 dari buku James Stewart kalkulus
% edisi 5
% author: Mohammad Fajar
function soal57
clc; 
f = figure('menubar', 'none', 'resize', 'off', ... 
    'position', [200, 100, 800, 450]); 
ax1 = axes('units', 'pix', 'position', [50 50 340 270]... 
   ,  'xlim', [0 2*pi], 'ylim', [-1.5, 1.5]); 

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

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

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