İçeriğe geç

Lineer Cebir: Skalerler, Vektörler ve Temel İşlemlerle Tanışma

Şimdi bu lineer cebir denen şeye bir giriş yapalım bakalım. Hani böyle ilk duyduğumda biraz ürkütücü gelmişti ama aslında o kadar da korkulacak bir şey değilmiş, bana göre. Hani bazen bir konuda ilk defa karşılaştığımızda bir ön yargımız olur ya, işte ben de öyleydim. Ama sonra bir başladım, baktım ki aslında hep bildiğimiz şeylerin biraz daha matematiksel ve düzenli hali.

Öncelikle, bu işin temelinde ne var onu konuşalım. Skalerler! Bunlar bildiğimiz sayılar işte. Uzunluk, sıcaklık, ağırlık gibi tek bir sayı ile ifade edilebilen şeyler. Mesela bir elmanın ağırlığı 500 gramdır, ya da odanın sıcaklığı 22 derece Celsius. Basit, değil mi? Zaten hayatımızda kullandığımız çoğu nicelik skaler.

Fakat işte işler burada biraz renkleniyor. Vektörler! Vektörler sadece bir büyüklük değil, aynı zamanda bir yönü de olan niceliklerdir. Hani bazen bir yere giderken sadece \”5 kilometre ilerle\” demek yetmez ya, \”5 kilometre kuzeye doğru ilerle\” demeniz gerekir. İşte o \”kuzeye doğru\” kısmı vektörün yönünü belirliyor. Bunu bir ok gibi düşünebilirsiniz. Okun uzunluğu büyüklüğünü, okun gösterdiği yön de yönünü ifade ediyor.

Neden vektörlerle uğraşıyoruz peki? Mesela bir arabanın hızını düşünün. Sadece 100 km/saat demek yetmez. Arabanın hangi yöne gittiğini de bilmemiz lazım. İşte bu hız vektörü oluyor. Ya da bir kuvveti düşünün. Bir yere ittiğinizde sadece ne kadar kuvvet uyguladığınız değil, hangi yöne uyguladığınız da önemli. Bunlar genelde mühendislikte, fizikte ve bilgisayar grafiklerinde karşımıza bolca çıkıyor. Hatta oyun geliştirirken karakterlerin hareketini veya kameraların yönünü belirlemek için vektörleri bolca kullanıyoruz. Hani bazen oyunlarda karakter olduğu yerden fırlayıp gidiyor ya, işte orada vektörler devreye giriyor.

Peki, bu vektörlerle neler yapabiliyoruz? En temel işlemlerden biri toplama. İki vektörü toplamak demek, aslında bir vektörün ucuna diğerini ekleyip, baştan sona birleştirerek yeni bir vektör elde etmek demek. Bunu şöyle düşünebilirsiniz: Önce A noktasından B noktasına gittiniz, sonra B noktasından C noktasına gittiniz. Bu iki hareketin toplamı, aslında A noktasından C noktasına tek bir hareket gibi düşünülebilir. İşte bu yeni hareket vektörü, önceki iki vektörün toplamı oluyor. Ne güzel değil mi?

Bir de skalerle vektör çarpımı var. Bu da bir vektörü bir sayıyla çarpıp büyüklüğünü değiştirmek demek. Sayı pozitifse yön aynı kalır, büyüklük değişir. Negatifse hem büyüklük değişir hem de yön tam tersine döner. Hani bir lastik bant gibi düşünebilirsiniz. Onu uzattığınızda daha uzun olur, ters yöne çektiğinizde ise kısalır ve yön değiştirir.

Bu arada, vektörleri bir koordinat sisteminde ifade etmek de çok işimize yarıyor. Genelde 2 boyutlu (x, y) veya 3 boyutlu (x, y, z) sistemler kullanırız. Bir vektörü bu şekilde yazdığımızda, aslında bileşenlerini görmüş oluruz. Mesela (3, 4) vektörü, x ekseninde 3 birim, y ekseninde 4 birim ilerleyip ulaştığımız noktayı temsil ediyor. Hani bazen haritada bir yere gitmek için “3 adım sağa, 4 adım yukarı” deriz ya, işte bu vektörün bileşenleri gibi.

Basit bir örnek yapalım mı? Diyelim ki iki vektörümüz var: Vektör A = (2, 1) ve Vektör B = (1, 3). Bu ikisini toplarsak, bileşenlerini ayrı ayrı toplarız: A + B = (2+1, 1+3) = (3, 4).

Şimdi bir de skaler çarpım deneyelim. Diyelim ki Vektör C = (2, 5) ve çarpmak istediğimiz skaler de 3 olsun. O zaman 3 * C = (3*2, 3*5) = (6, 15) olur. Vektörün büyüklüğü 3 katına çıktı, yönü aynı kaldı.

Peki ya skaler -2 ile çarparsak? Vektör D = (1, -2) olsun. -2 * D = (-2*1, -2*-2) = (-2, 4). Gördüğünüz gibi hem büyüklük değişti hem de yön tam tersine döndü. Garip değil mi?

Bu temel işlemler, lineer cebirin yapı taşları aslında. Bu kavramları anladığınızda, daha karmaşık konulara geçmek çok daha kolay olacaktır. Hani ilk başta zor gibi gelse de, biraz pratik yapınca insan alışıyor. Tabii bu işin teorik kısmı, bir de bunun kodla nasıl yapıldığı var. Mesela Python’da numpy kütüphanesi gibi araçlar bu vektör işlemlerini çok kolaylaştırıyor. Amaç bu bilgiyi daha da pekiştirmek için gelin basit bir C# örneğine bakalım.

Şöyle bir senaryo düşünelim: Bir oyun programlıyorsunuz ve karakterinizin hareketini belirliyoruz. Bir başlangıç konumu var ve bu konuma bir hareket vektörü ekleyerek yeni konumunu bulacağız. Basit bir vektör sınıfı yazalım:

“`csharp public class Vektor { public double X { get; set; } public double Y { get; set; }

public Vektor(double x, double y) { X = x; Y = y; }

// Vektör Toplama public static Vektor operator +(Vektor v1, Vektor v2) { return new Vektor(v1.X + v2.X, v1.Y + v2.Y); }

// Skaler Çarpma public static Vektor operator *(double skaler, Vektor v) { return new Vektor(skaler * v.X, skaler * v.Y); }

public override string ToString() { return $\”({X}, {Y})\”; } } “`

Şimdi bu sınıfı kullanarak bir örnek yapalım. Diyelim ki karakterimizin başlangıç konumu (5, 3) ve biz onu (2, -1) vektörü kadar hareket ettirmek istiyoruz. Sonra da bu hareketin 3 katı kadar bir etki daha uygulayalım. İşte burada biraz karmaşıklık oluyor galiba. Önce bir hareket vektörü tanımlayalım, sonra onu başlangıç konumuyla toplayalım. Sonra da o hareket vektörünü bir skalerle çarpıp ekleyelim.

İlk başta şöyle bir kod yazmıştım:

// YANLIŞ KOD ÖRNEĞİ “`csharp Vektor baslangicKonum = new Vektor(5, 3); Vektor hareket = new Vektor(2, -1);

Vektor yeniKonum = baslangicKonum + hareket; // Yeni konum (7, 2)

// Şimdi bu hareketin 3 katı kadar bir etki daha ekleyelim. Vektor ekEtki = 3 * hareket;

// Bu ek etkiyi de yeni konuma ekleyelim. // Fakat burada bir hata var, ekEtkiyi doğrudan eklemeye çalışıyorum. Vektor sonKonum = yeniKonum + ekEtki; // Hata: yeniKonum zaten başlangıç + hareket, tekrar hareket ekleniyor gibi.

Console.WriteLine($\”Son Konum: {sonKonum}\”); // Bu sanırım (10, -1) çıkacak, beklediğim gibi değil. “`

Burada yaptığım hata şu: Ben aslında başlangıç konumuna iki kere hareket vektörünü eklemiş oluyorum. Yani ilk önce (5,3)’e (2,-1) ekleyip (7,2) buluyorum, sonra da bu (7,2)’ye tekrar 3*(2,-1)=(6,-3) ekleyip (13,-1) gibi bir sonuca gidiyorum. Ama benim istediğim, başlangıç konumuna toplamda (2,-1) + 3*(2,-1) kadar bir hareket uygulamaktı. Yani (5,3) + (2,-1) + (6,-3) gibi bir şey. Ne desem ki… İşte ilk başta böyle karıştırabiliyorsun.

Doğrusu şöyle olmalıydı:

// DOĞRU KOD ÖRNEĞİ “`csharp Vektor baslangicKonum = new Vektor(5, 3); Vektor ilkHareket = new Vektor(2, -1); Vektor ekEtki = 3 * ilkHareket; // İlk hareketin 3 katı

Vektor toplamHareket = ilkHareket + ekEtki; // Toplam hareket vektörü

Vektor sonKonum = baslangicKonum + toplamHareket;

Console.WriteLine($\”Son Konum: {sonKonum}\”); // Bu sonuç (13, -1) olmalı. “`

Şimdi, bu daha mantıklı oldu. Başlangıç konumuna, uygulayacağımız tüm hareketlerin toplamını eklemiş olduk. Yani (5,3) + (2,-1) + (6,-3) = (5+2+6, 3-1-3) = (13, -1). İnanın ki bu tür basit hatalar ilk başlarda çok can sıkıcı olabiliyor ama işte öğrenme süreci böyle ilerliyor sanırım.

Bu arada, bu vektörlerin ne kadar önemli olduğunu anlatmak için şöyle bir örnek vereyim: Mesela bir 3D modelleme yazılımında bir nesneyi döndüreceksiniz. Döndürme işlemi aslında bir dizi vektör dönüşümünden ibaret. Ya da bir fizik simülasyonunda parçacıkların hareketini izlemek… Hepsinin temelinde bu vektör matematiği yatıyor. Hani bir yerlerde okumuştum, artık çoğu grafik kartının içinde bile milyonlarca vektör işlemcisi varmış. Düşünsenize, ne kadar güçlü bir araç!

Sonuç olarak, skalerler ve vektörler, lineer cebirin en temel yapı taşları. Basit gibi görünen bu kavramlar, aslında matematiğin ve bilgisayar bilimlerinin birçok alanında karşımıza çıkıyor. Bu yüzden, ilk başta biraz zaman ayırıp bu temelleri sağlam atmak, ileride işinizi çok kolaylaştıracaktır. Hani derler ya, sağlam temel üzerine inşa edilen her şey daha kalıcı olur, işte bu da öyle bir şey.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.