MATLAB ile 3 boyutlu grafik çizimi


MATLAB ile üç boyutlu grafikler çizmek için basit bir örnek göstereceğim. Optimizasyon problemlerinde çok sık kullanılan amaç fonksiyonlarından Michalewicz ve Rastrigin fonksiyonlarının nasıl çizildiklerini örnek kodlarla anlatacağım.

Michalewicz ile başlayalım…

michalewicz-func

MATLAB ile bu fonksiyonu yazmak kafa karıştırıcı gelebilir ama  aslında o kadar zor değil.

Fonksiyonu şu şekilde ifade edebiliriz:

fstr = '-sin(X)*(sin(2*X.^2/pi))^20 - sin(Y)*(sin(2*Y.^2/pi))^20';

Fonksiyonun alt ve üst limitleri -2.4 ve +2.4 olarak belirleyelim.

altLimit = -2.4;    ustLimit = 2.4;

Fonksiyona ait eksenleri oluşturalım:

x = linspace(altLimit,ustLimit,100);
y = x;

Fonksiyon çizimi 3 boyutlu olması için grafiği içine oturacağı bir kutu çizmek gerekiyor. Bunun için meshgrid() fonksiyonundan faydalanacağız.

[X,Y] = meshgrid(x,y);

Fonksiyonun metin halini vectorize() fonksiyonunu kullanarak vektörize ediyoruz. Evet pek açık bir ifade olmadı. Vektörize edilen metni inline() fonksiyonu ile fonksiyonun her (x, y) noktasına karşılık gelen z değerlerini hesaplatıyoruz. inline() fonksiyonu yerine anonymous() fonksiyonunun kullanılması tavsiye ediliyor.

fonk = inline(vectorize(fstr));
z = fonk(X,Y);

Gelelim grafiği çizmeye…

Grafiği çizmeden önce eksenlerle ilgili olarak renk, açı, ızgara çizgisi stili, ortam aydınlatması vd. ayrıntıları belirliyoruz.

    axes1 = axes(
    'ZColor',[0 0 1],
    'YColor',[0 1 0],...
    'XColor',[1 0 0],...
    'Units','pixels',...
    'Projection','perspective',...
    'PlotBoxAspectRatio',[1 1 1],...
    'OuterPosition',[5 -5 1300 700],...
    'Layer','top',...
    'GridLineStyle','-',...
    'AmbientLightColor',[1 1 0]);

x, y ve z eksenlerinin sınır değerlerini belirleyelim.

    xlim(axes1,[min(x)*0.95 max(x)*1.05]);
    ylim(axes1,[min(y)*0.95 max(y)*1.05]);
    zlim(axes1,[min(min(z)) max(max(z))]);

Bakış açısını belirleyelim

    view(axes1,[150 10]);

Kutu formunda bir eksen elde etmek için box() fonksiyonunu uygulayalım:

    box(axes1,'on');

Izgara görünümü için grid() fonksiyonunu kullanalım:

   grid(axes1,'on');

Grafiğe yeni çizimler yapılırsa önceki çizilen herşeyin kalması için hold() fonksiyonunu kullanalım:

    hold(axes1,'all');

Gelelim işin can alıcı noktasına…

Artık ortam hazır, veriler hazır, eksenler hazır…

surf() fonksiyonu ile her x,y için karşılık gelen z noktasını çizdirelim.. Fonksiyon içindeki diğer parametreler basit şeyler. Açıklamaya gerek duymuyorum.

surf(x,y,z, 'LineStyle','none','LineWidth',0.005);

Fonksiyonun metin halini grafiğin başlığı olarak ekleyelim.

title(fstr);

x, y ve z eksenlerine etiketlerini ve renklerini ekleyelim. Renk değerleri 0 ile 1 arasında [R G B] şeklinde belirlenebilir.

    xlabel('X Ekseni','Color',[1 0 0]);
    ylabel('Y Ekseni','Color',[0 1 0]);
    zlabel('Z Ekseni' ,'Color',[0 0 1]);

Bir de son olarak grafiğe şöyle güzel bir ışıklandırma yapalım.

light('Parent',axes1,'Position',[1 1 1]);

michalewicz-graph

Şöyle bir görüntü elde edilmelidir.

Rastrigin fonksiyonunu çizmek için de aynı yöntem kullanılabilir.

rastrigin-func

Bu fonksiyon için aşağıdaki değişiklikleri uygulamak gerekiyor.

altLimit = -pi/2;    ustLimit = pi/2;
fstr = 'X.^2 - 10*cos(2*pi.* X) + Y.^2 - 10 * cos(2*pi.*Y)';

Fonksiyonu çizdirdiğinizde aşağıdaki gibi bir görüntü elde edilir.

rastrigin-graph

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s