Bu yazıda MATLAB kullanıcılarının çok bilmediği fonksiyon tutucular (function handle) ve anonim fonksiyonlara bakalım. İlk örneğimiz integral almak olsun ve şöyle basit bir fonksiyonumuz olsun:

$$h(x) = 10x$$

Bu fonksiyonun [1,10] aralığında integralini analitik olarak alalım:

\begin{align}\int_1^{10} h(x) \, dx &= 10 \frac{x^2}{2}\bigg|_{1}^{10}\\&= 500 - 5 \\&= 495\end{align}

Şimdi bunu MATLAB ile nasıl yapacağımıza bakalım. İlk olarak $h(x)$ fonksiyonunu anonim bir fonksiyon olarak yazalım:

h = @(x) 10*x;

Üstte girdi olarak x alan ve çıktı olarak 10*x döndüren bir anonim fonksiyon var. Bu anonim fonksiyonu h değişkenine atayarak h'yi bu fonksiyonu çağırmak için kullanabileceğiz. Çağırmayı deneyelim:

h(3)

ans =

    30

Bunu yeni bir "h.m" dosyası yaratarak şöyle de yapabilirdik:

function y = h(x)
    y = 10*x;
end

Bunun yerine tek satırda yaptık ve de yeni bir dosya yaratmaya gerek kalmadı. Diyebilirsiniz ki "neden doğrudan h = 10*x yazmadık?" Öyle yapsaydık, h fonksiyon tipinde değil de sayı tipinde olacaktı ve içinde nümerik değerler saklayacaktı. Biz ise ilerde bu fonksiyonu başka fonksiyonlara girdi olarak vereceğiz ve fonksiyona erişildiği an x'in değerleri ne ise ona bağımlı bir sonuç dönecek. Çalışma ortamına bakarsak değişkenin sınıfının function_handle olduğunu görebiliriz:

Şimdi bir fonksiyon daha düşünelim:

$$f(x) = \sin(\alpha x)$$

Bunu MATLAB'de tanımlayalım:

alpha = 0.9;
f = @(x) sin(alpha*x);

ve $[0,\pi]$ aralığında alan olarak çizdirelim:

x = linspace(0,pi,100);
area(x,f(x))


Çizdiğimiz alan ne kadar acaba? Sayısal olarak integral hesaplamaya yarayan quad
fonksiyonuna tanımladığımız fonksiyonu ve sınırları vererek bunu hesaplayabiliriz.

quad(f,0,pi)

ans =

    2.1678

Yani $\int_0^\pi sin(0.9 x) \approx 2.1678$ imiş. İlk örnekteki h fonksiyonunu kullanarak quad(h,1,10) yazarsanız 495 değerini göreceksiniz. Elle hesapladığımız değerle aynı.

Şimdi de integral dışında bir örneğe bakalım. Yeni problemimiz bir eniyileme problemi: Belli bir aralıktaki en küçük değeri istiyoruz. Fonksiyonumuz şöyle olsun:

$$f(x) = x^2 - 2x + 1$$

Yani MATLAB diliyle konuşursak:

f = @(x) (x.^2 * 2*x + 1);
ezplot(f)

Şimdi fminbnd fonksiyonu ile belli bir aralıktaki en küçük değeri veren x'i bulalım ve grafikte yıldız işaretiyle onu da gösterelim:

hold on
minimum = fminbnd(f, -2, 2);
plot(minimum, f(minimum), '*')
hold off

Bir eğrinin üstündeki minimum nokta nasıl bulunur sorusunu fonksiyon tutucu kullanarak cevaplamış olduk. Kendi yazdığımız bir fonksiyon yerine doğrudan MATLAB'ın fonksiyonları için de buna bakabilirdik. Örneğin fminbnd(@sin,0,2*pi) ile sin fonksiyonunun en düşük değerini veren açıyı radyan cinsinden bulabiliriz. Dikkat etmeniz gereken şey fminbnd'ye ilk parametre olarak bir fonksiyon tutucu yollamak. Doğrudan sin yazarsanız hata verecektir.

Şimdi iki boyutta nasıl kullanabileceğimize bakalım. İki değişkenli bir fonksiyon tanımlayalım ve çizelim:

a = 1.4;
b = 0.9;
f = @(x,y) (a*sin(x) + b*cos(y));
ezsurf(f)

Görüldüğü üzere anonim fonksiyonları tek bir girdi parametresi ile değil, birden çok girdi ile kullanabiliyoruz.

Yazıyı uzatmak mümkün ama temel bilgiyi içerdiğini düşünüyorum ve burada bırakıyorum. Konu ile ilgili daha ayrıntılı görsel bilgiye Açık Ders'ten ulaşabilirsiniz.