MATLAB, özellikle matematiksel modelleme, optimizasyon ve mühendislik uygulamalarında iki ve üç boyutlu grafikler oluşturmak için oldukça kullanışlı araçlar sunuyor.
Bu yazıda MATLAB kullanarak üç boyutlu (3D) fonksiyon grafiği nasıl çizilir? sorusuna basit bir örnek üzerinden cevap vereceğim.
Örnek olarak, optimizasyon problemlerinde ve özellikle optimizasyon algoritmalarının test edilmesinde sık kullanılan iki benchmark fonksiyonunu ele alacağız:
- Michalewicz fonksiyonu
- Rastrigin fonksiyonu
Her iki fonksiyonun da MATLAB kullanılarak üç boyutlu grafiklerini oluşturacağız.
Not: Aşağıdaki örnekler iki değişkenli fonksiyonlar üzerinden hazırlanmıştır. Dolayısıyla fonksiyonları
xveydeğişkenleriyle tanımlayıpz = f(x,y)şeklinde üç boyutlu olarak göstereceğiz.
Michalewicz Fonksiyonu
İlk olarak Michalewicz fonksiyonu ile başlayalım.
Michalewicz fonksiyonu, optimizasyon algoritmalarının performansını test etmek amacıyla kullanılan, çok sayıda yerel minimum içeren fonksiyonlardan biridir.
Fonksiyon hakkında daha ayrıntılı bilgiye Michalewicz fonksiyonu sayfasından ulaşabilirsiniz.
Fonksiyonun iki değişkenli hâlini MATLAB’de ifade etmek için aşağıdaki gösterimi kullanabiliriz:
fstr = '-sin(X)*(sin(2*X.^2/pi))^20 - sin(Y)*(sin(2*Y.^2/pi))^20';
Burada fonksiyonu doğrudan MATLAB kodu olarak değil, metin (string) şeklinde tanımlıyoruz. Birazdan bu ifadeyi kullanarak X ve Y değerlerine karşılık gelen Z değerlerini hesaplayacağız.
1. Değişkenlerin sınırlarını belirleyelim
Fonksiyonun grafiğini hangi aralıkta çizeceğimizi belirlememiz gerekiyor.
Bu örnekte alt ve üst sınırları sırasıyla -2.4 ve 2.4 olarak belirleyelim:
altLimit = -2.4;
ustLimit = 2.4;
Daha sonra bu aralık içerisinde 100 adet nokta oluşturalım:
x = linspace(altLimit, ustLimit, 100);
y = x;
linspace() fonksiyonu, belirlediğimiz iki sınır arasında eşit aralıklı noktalar oluşturur.
2. X ve Y koordinatlarını oluşturmak
Üç boyutlu grafiğimizde X ve Y koordinatlarının oluşturulması için meshgrid() fonksiyonunu kullanacağız:
[X,Y] = meshgrid(x,y);
meshgrid() fonksiyonu, iki boyutlu bir koordinat ağı oluşturur.
Bunu şu şekilde düşünebilirsiniz:
X: x eksenindeki değerlerin bulunduğu koordinat matrisiY: y eksenindeki değerlerin bulunduğu koordinat matrisiZ: her(X,Y)noktası için hesaplanacak fonksiyon değeri
Dolayısıyla sonunda elimizde:
Z = f(X,Y)
şeklinde bir yüzey oluşturabileceğiz.
3. Fonksiyon değerlerini hesaplamak
Eski MATLAB sürümlerinde fonksiyonu metinden çalıştırmak için inline() fonksiyonu kullanılabiliyordu:
fonk = inline(vectorize(fstr));
z = fonk(X,Y);
Ancak inline() artık önerilen bir yöntem değildir. Güncel MATLAB sürümlerinde bunun yerine anonymous function kullanmak daha doğru bir yaklaşımdır.
Örneğin Michalewicz fonksiyonunu doğrudan şöyle tanımlayabiliriz:
fonk = @(X,Y) -sin(X).*(sin(2.*X.^2./pi)).^20 ...
-sin(Y).*(sin(2.*Y.^2./pi)).^20;
z = fonk(X,Y);
Buradaki @ işareti MATLAB’de anonymous function tanımlamak için kullanılır.
Bu yöntemle fonksiyonu ayrı bir .m dosyasında tanımlamaya gerek kalmadan doğrudan kod içerisinde kullanabiliriz.
4. Üç boyutlu grafik alanını hazırlamak
Artık X, Y ve Z değerlerimiz hazır.
Şimdi grafiğimizi oluşturacağımız eksenleri hazırlayabiliriz.
Örneğin eksenlerin renklerini, perspektif görünümünü ve grafik kutusunun oranlarını belirlemek için:
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]);
Burada MATLAB’in RGB renk sistemini kullandığını da belirtelim.
Örneğin:
[1 0 0]
kırmızı,
[0 1 0]
yeşil,
[0 0 1]
ise mavi rengi ifade eder.
5. Grafik eksenlerinin sınırlarını belirlemek
X, Y ve Z eksenlerinin sınırlarını belirleyelim:
xlim(axes1,[min(x)*0.95 max(x)*1.05]);
ylim(axes1,[min(y)*0.95 max(y)*1.05]);
zlim(axes1,[min(z(:)) max(z(:))]);
Burada min(z(:)) ve max(z(:)) kullanmamızın nedeni, z değişkeninin bir matris olmasıdır. z(:) matrisi tek bir sütun hâline getirerek minimum ve maksimum değerin doğrudan bulunmasını sağlar.
6. Grafiğin bakış açısını belirlemek
Üç boyutlu grafiklerde bakış açısı oldukça önemlidir.
view() fonksiyonunu kullanarak grafiğe hangi açıdan bakacağımızı belirleyebiliriz:
view(axes1,[150 10]);
İlk değer yatay bakış açısını, ikinci değer ise dikey bakış açısını belirler.
Farklı açılar deneyerek grafiği farklı perspektiflerden inceleyebilirsiniz.
7. Kutu ve ızgara görünümünü açmak
Grafiğin çevresinde kutu görünmesini istiyorsak box() fonksiyonunu kullanabiliriz:
box(axes1,'on');
Izgara çizgilerini göstermek için ise:
grid(axes1,'on');
komutunu kullanıyoruz.
Bu iki seçenek özellikle matematiksel fonksiyonların yüzeylerini incelerken grafiğin okunabilirliğini artırabilir.
8. Surf() ile yüzeyi çizmek
Şimdi asıl önemli noktaya geldik.
X ve Y koordinatlarına karşılık gelen Z değerlerimiz hazır olduğuna göre artık yüzeyimizi oluşturabiliriz.
Bunun için MATLAB’in surf() fonksiyonunu kullanacağız:
surf(x,y,z,'LineStyle','none','LineWidth',0.005);
surf() fonksiyonu, verilen X, Y ve Z değerlerinden üç boyutlu bir yüzey grafiği oluşturur.
LineStyle parametresini none yaptığımız için yüzey üzerindeki çizgiler gösterilmez.
9. Grafik başlığını ve eksen isimlerini eklemek
Fonksiyonun kendisini grafik başlığı olarak gösterebiliriz:
title(fstr);
X, Y ve Z eksenlerini de isimlendirelim:
xlabel('X Ekseni','Color',[1 0 0]);
ylabel('Y Ekseni','Color',[0 1 0]);
zlabel('Z Ekseni','Color',[0 0 1]);
Burada eksen renklerini daha önce belirlediğimiz RGB değerleriyle eşleştirdik.
10. Grafiğe ışıklandırma eklemek
Son olarak üç boyutlu yüzeyin daha belirgin görünmesi için grafiğe ışık ekleyebiliriz:
light('Parent',axes1,'Position',[1 1 1]);
Bu işlem özellikle yüzeyin eğimlerini ve çukurlarını daha belirgin hâle getirir.
Sonuç olarak Michalewicz fonksiyonunun yaklaşık olarak aşağıdaki gibi bir üç boyutlu yüzey grafiğini elde etmemiz gerekir.
Michalewicz fonksiyonu:

MATLAB ile oluşturulan 3D grafik:

Rastrigin Fonksiyonu
Aynı yöntemi Rastrigin fonksiyonu için de kullanabiliriz.
Rastrigin fonksiyonu da optimizasyon algoritmalarının test edilmesinde oldukça sık kullanılan benchmark fonksiyonlarından biridir.
Fonksiyon hakkında daha fazla bilgi için Rastrigin fonksiyonu sayfasına bakabilirsiniz.
Fonksiyonun iki değişkenli hâlini MATLAB’de şu şekilde ifade edebiliriz:
fstr = 'X.^2 - 10*cos(2*pi.*X) + Y.^2 - 10*cos(2*pi.*Y)';
Bu fonksiyon için örnek olarak değişkenlerin sınırlarını şöyle belirleyelim:
altLimit = -pi/2;
ustLimit = pi/2;
Güncel MATLAB yaklaşımıyla fonksiyonu anonymous function olarak da tanımlayabiliriz:
fonk = @(X,Y) X.^2 - 10.*cos(2.*pi.*X) ...
+ Y.^2 - 10.*cos(2.*pi.*Y);
Ardından koordinatları ve Z değerlerini oluşturalım:
x = linspace(altLimit,ustLimit,100);
y = x;
[X,Y] = meshgrid(x,y);
z = fonk(X,Y);
Daha sonra bir önceki örnekte kullandığımız surf() komutuyla yüzeyi oluşturabiliriz:
surf(x,y,z,'LineStyle','none');
Sonuçta Rastrigin fonksiyonunun karakteristik dalgalı yüzey yapısını gösteren üç boyutlu bir grafik elde ederiz.
Rastrigin fonksiyonu:

MATLAB ile oluşturulan 3D grafik:

İki fonksiyonun karşılaştırılması
Michalewicz ve Rastrigin fonksiyonları, optimizasyon algoritmalarını test etmek için kullanılan klasik benchmark fonksiyonlarından yalnızca ikisidir.
Her iki fonksiyonun da ortak noktası, tek bir basit minimum noktası içeren düz yüzeylerden ziyade çok sayıda yerel minimum ve karmaşık bir yüzey yapısına sahip olmalarıdır.
Bu nedenle genetik algoritmalar, parçacık sürü optimizasyonu (PSO), diferansiyel evrim ve benzeri optimizasyon yöntemlerinin performansını karşılaştırırken bu tür fonksiyonlardan yararlanılabilir.
Üç boyutlu grafiklerini çizmek de fonksiyonların yapısını yalnızca matematiksel formüller üzerinden değil, görsel olarak da incelememizi sağlar.
Özellikle optimizasyon algoritmaları üzerinde çalışıyorsanız, algoritmanın yalnızca bir fonksiyon üzerindeki başarısını değerlendirmek yerine farklı karakteristiklere sahip benchmark fonksiyonları üzerinde test yapmak daha anlamlı sonuçlar verebilir.
Sonuç
MATLAB ile üç boyutlu matematiksel fonksiyon grafikleri çizmek ilk bakışta karmaşık görünse de temel olarak birkaç adımdan oluşuyor:
- Fonksiyonu tanımlamak
- X ve Y değerlerini oluşturmak
meshgrid()ile koordinat ağını oluşturmak- Z değerlerini hesaplamak
surf()ile üç boyutlu yüzeyi çizmek- Eksen, bakış açısı ve ışıklandırma gibi görsel özellikleri düzenlemek
Özellikle meshgrid() ve surf() fonksiyonlarının çalışma mantığını kavradığınızda MATLAB’de çok daha karmaşık üç boyutlu fonksiyonları da kolaylıkla görselleştirebilirsiniz.
Bu örnekte eski MATLAB kodlarında sık karşılaşılan inline() ve vectorize() yaklaşımından ziyade, güncel MATLAB sürümlerinde tercih edilen anonymous function kullanımını esas almak daha sağlıklı bir yöntemdir.