Ünite 5 / 11

Sayısal Hesap, Python ve Kod Üretimi

Kazanimlar:

  • Sembolik ve sayısal hesabı ayırt edip her problem için doğru aracı (SymPy veya NumPy/SciPy) seçebilme
  • Yapay zekanın ürettiği sayısal kodu okuyup anlayarak kendisi çalıştırabilme ve bilinen bir girdiyle sağduyu testi yaparak doğrulayabilme
  • Kayan noktalı sayı hassasiyetinin sınırlarını kavrayarak kesin eşitlik yerine tolerans kullanabilme ve başlangıç tahmininin sayısal yöntemlere etkisini yönetebilme

Sembolik hesap bir integralin ya da denklemin tam formülünü verir; ama matematiğin çoğu pratik problemi kapalı bir formülle çözülemez. İşte burada sayısal hesap (numerical computation) devreye girer: kesin formül yerine, istenen hassasiyette yaklaşık bir sayısal sonuç üretmek. Bir integralin değerini 0.001 hassasiyetle bulmak, bir denklemin kökünü ondalıklı yaklaşımla hesaplamak, bir veri setinin istatistiğini çıkarmak — bunların hepsi sayısal hesaptır. Python'da bunun araçları NumPy (sayısal diziler ve matematik) ve SciPy (bilimsel hesaplama) kütüphaneleridir. Bu ünitede YZ'yi sayısal hesap için Python kodu üreten bir asistan olarak kullanmayı ve kodun doğruluğunu denetlemeyi öğreneceksiniz.

Kritik bir tanım: kayan noktalı sayı (floating-point number), bilgisayarın ondalıklı sayıları sınırlı hassasiyetle sakladığı biçimdir. Bu yüzden bilgisayar aritmetiğinde 0.1 + 0.2 tam olarak 0.3 değil, 0.30000000000000004 çıkabilir. Bu bir hata değil, sayısal hesabın doğasıdır — ama farkında olmazsanız yanlış sonuçlara yol açar. Sayısal hesapta "kesin eşitlik" yerine "yeterince yakın" ile çalışılır.

Sembolik mi, sayısal mı? Doğru aracı seçmek

Durum

Sembolik (SymPy)

Sayısal (NumPy/SciPy)

Kapalı formül var

Tercih edilir

Gerekmez

Formül yok / çok karmaşık

Çözemez

Tercih edilir

Tam kesinlik gerekli

Evet

Yaklaşık

Büyük veri / çok işlem

Yavaş

Çok hızlı

Ondalıklı sonuç yeterli

Uygun

İyi bir uygulayıcı ikisini birlikte kullanır: mümkünse sembolik çöz, değilse sayısala geç, ve mümkün olduğunda birini diğeriyle çapraz kontrol et.

Adım adım: YZ ile güvenli sayısal hesap

1. Problemi ve hassasiyeti belirle. "Kaç ondalık basamak?" ve "hangi aralıkta?" sorularını netleştirin.

2. YZ'ye kod yazdır, çıktıyı değil. 4. üniteden hatırlayın: YZ'ye kod çıktısını tahmin ettirmeyin. Kodu siz çalıştırın.

3. Kodu oku ve anla. Üretilen kodu satır satır anlayın. Doğru kütüphane, doğru fonksiyon, doğru parametreler mi? Anlamadığınız kodu çalıştırmayın.

4. Bilinen bir durumla test et. Kodu, cevabını zaten bildiğiniz basit bir girdiyle deneyin. Örneğin sin(0)=0, bilinen bir integralin değeri gibi. Kod bunu doğru veriyorsa daha çok güvenirsiniz.

5. Sembolikle veya elle çapraz kontrol et. Mümkünse aynı sonucu SymPy ile ya da elle bir yaklaşımla teyit edin.

6. Kayan nokta tuzaklarına dikkat et. == ile kesin eşitlik yerine abs(a - b) < 1e-9 gibi tolerans kullanın.

İpucu: Bir sayısal kodu her zaman "bildiğiniz bir cevapla" test edin. Bir kök bulucu yazdıysanız, önce x²−4=0 gibi kökü belli (x=±2) bir denkleme uygulayın. Kod bunu doğru buluyorsa, bilmediğiniz denklemde de güvenilir olma olasılığı artar. Bu "sağduyu testi" (sanity check) en ucuz doğrulamadır.

Sayısal hesabın gizli tuzağı: yakınsama ve hata birikimi

Sayısal yöntemlerin çoğu yinelemeli (iterative) çalışır: bir başlangıç tahmininden başlayıp adım adım gerçek cevaba yaklaşır. Bu yaklaşma sürecine yakınsama (convergence) denir. Ama her yinelemeli yöntem her zaman yakınsamaz; bazıları ıraksar (sonuçtan uzaklaşır) ya da yanlış bir değere yakınsar. Yapay zekanın ürettiği bir kod, yöntemin yakınsayıp yakınsamadığını kontrol etmiyorsa, size sessizce yanlış bir sayı verebilir. Bu yüzden sayısal bir sonucun yalnızca "bir sayı üretmiş olması" onu doğru yapmaz; o sayının gerçekten aranan çözüme yakınsadığını da teyit etmek gerekir.

İkinci bir incelik hata birikimidir (error accumulation). Uzun bir hesap zincirinde her adımdaki küçük kayan nokta yuvarlama hataları birikerek büyüyebilir; özellikle birbirine çok yakın iki büyük sayının farkını aldığınızda (buna "yıkıcı sadeleşme" — catastrophic cancellation denir) sonucun anlamlı basamakları kaybolabilir. Yapay zeka bu tür sayısal kararlılık (numerical stability) sorunlarını her zaman öngörmez. Kritik hesaplarda, sonucu farklı bir yöntemle ya da daha yüksek hassasiyetle tekrar hesaplayıp karşılaştırmak, gizli hata birikimini ortaya çıkarır.

Dikkat: Bir sayısal yöntemin "bir sonuç vermesi" ile "doğru sonuca yakınsaması" farklı şeylerdir. Kodun yakınsama kontrolü (ör. iki ardışık adım arasındaki farkın yeterince küçülmesi) içerdiğinden emin olun; içermiyorsa yapay zekaya bu kontrolü ekletin.

Üç mini vaka

Vaka 1 — Yanlış fonksiyon seçimi. Bir öğrenci, bir fonksiyonun kökünü bulmak için YZ'den kod istedi. YZ scipy.optimize.fsolve kullandı ama başlangıç tahminini (initial guess) kötü seçince yanlış köke yakınsadı. Öğrenci fonksiyonu önce grafik çizerek inceledi (bkz. görselleştirme ünitesi), doğru başlangıç tahminini verdi ve gerçek kökü buldu. Ders: sayısal kök bulucular başlangıç noktasına duyarlıdır.

Vaka 2 — Kayan nokta tuzağı. Bir mühendis, if 0.1 + 0.2 == 0.3: yazan bir YZ kodunu çalıştırdı ve koşulun asla doğru olmadığını fark etti. YZ, kayan nokta hassasiyetini göz ardı etmişti. Kod abs((0.1+0.2) - 0.3) < 1e-9 ile düzeltildi. 1e-9, "on üzeri eksi dokuz" yani çok küçük bir tolerans anlamına gelir.

Vaka 3 — Sağduyu testi hatayı yakaladı. Bir öğretmen, bir belirli integrali sayısal hesaplayan scipy.integrate.quad kodu aldı. Önce ∫₀¹ x dx = 0.5 gibi bilinen bir integralle test etti; kod 0.5 verdi. Sonra asıl integrali hesapladı ve sonucu SymPy ile de teyit etti. İki bağımsız yol aynı sonucu verince güvendi. Toplam süre: 6 dakika.

Dört kopyalanabilir şablon

1) Sayısal hesap kodu isteme:

Şu problemi SAYISAL olarak çözen bir Python kodu yaz: [problem].NumPy/SciPy kullan. Hassasiyet: [ör. 6 ondalık]. Kodu bençalıştıracağım; çıktıyı tahmin etme. Hangi fonksiyonu nedenseçtiğini kısaca yorum satırıyla açıkla.

2) Sağduyu testi ekletme:

Bu koda, çalıştırmadan önce DOĞRULUĞUNU test edecek bir sağduyukontrolü ekle: cevabı zaten bilinen basit bir girdiyle (ör.x²-4=0 için kök ±2) deneyip beklenen sonucu verdiğini kontrol et.Kod: [buraya]

3) Sembolik-sayısal çapraz kontrol:

Şu integrali/denklemi HEM SymPy (sembolik) HEM SciPy (sayısal)ile çözen bir kod yaz: [problem]. İki sonucu yazdır kikarşılaştırabileyim. Farkları abs() ile kontrol eden bir satır ekle.

4) Kayan nokta güvenliği:

Bu kodda kayan noktalı sayı karşılaştırmalarını gözden geçir.Kesin '==' eşitlikleri varsa, bunları uygun bir tolerans(abs(a-b) < 1e-9) ile değiştir ve nedenini açıkla. Kod: [buraya]

Zayıf prompt / Güçlü prompt

Zayıf: "Bu denklemin kökünü bul: x³ − 2x − 5 = 0. Cevabı yaz."
Sonuç: YZ bir ondalık sayı uydurur (ör. "2.0946..."). Doğru olabilir de olmayabilir de; çalıştırılmadığı için doğrulanmamıştır.
Güçlü: "x³ − 2x − 5 = 0 denkleminin reel kökünü SciPy ile bulan bir kod yaz. Başlangıç tahmini için önce fonksiyonun işaret değiştirdiği aralığı belirt. Kökü yerine koyup sonucun ~0 olduğunu kontrol eden bir satır ekle. Çıktıyı ben göreceğim."
Sonuç: Çalıştırılabilir kod, doğru başlangıç tahmini, yerleşik sağlama. Kökün geçerliliği kanıtlanır.

Sık yapılan hatalar

  • Kodu çalıştırmadan sonuca güvenmek. YZ'nin "tahmin ettiği" sayısal çıktı doğrulama değildir.
  • Kayan nokta eşitliğini `==` ile test etmek. Neredeyse hep hatalıdır; tolerans kullanın.
  • Kötü başlangıç tahmini. Sayısal kök/optimizasyon yöntemleri başlangıç noktasına duyarlıdır; yanlış köke yakınsayabilir.
  • Hassasiyeti belirtmemek. "Kaç basamak?" sorulmazsa sonuç ihtiyaca uymayabilir.
  • Sağduyu testi yapmamak. Bilinen bir girdiyle test etmeden kodu gerçek probleme uygulamak risklidir.
  • Kodu anlamadan çalıştırmak. Anlamadığınız bir kod yanlış fonksiyon kullanıyor olabilir; her satırı anlayın.
Dikkat: Sayısal sonuçlar her zaman yaklaşıktır. "Sonuç tam olarak şudur" demek yerine "şu hassasiyette şudur" deyin. Bir mühendislik ya da bilimsel raporda, kullanılan yöntemi ve hassasiyeti belirtmek doğruluğun bir parçasıdır. Yaklaşık bir sonucu kesinmiş gibi sunmak yanıltıcıdır.

Özetle

Sayısal hesap, kapalı formülle çözülemeyen problemler için yaklaşık ama pratik sonuçlar verir; Python'da araçları NumPy ve SciPy'dir. YZ bu kütüphaneler için hızlıca kod üretir, ama kodu siz çalıştırmalı, okuyup anlamalı ve bilinen bir girdiyle test etmelisiniz. Kayan nokta hassasiyetine dikkat edin: kesin eşitlik yerine tolerans kullanın. Mümkünse sembolik ve sayısal yöntemleri çapraz kontrol edin. Sağduyu testi ve yerine koyma, en ucuz ve en etkili doğrulamalardır.

Uygulama görevi

Kapalı formülle çözmesi zor bir problem seçin (ör. x³ − 2x − 5 = 0 kökü, ya da elemanter olmayan bir integralin belirli değeri). YZ'ye 1. ve 3. şablonlarla hem sayısal kod hem mümkünse sembolik-sayısal çapraz kontrol kodu yazdırın. Kodu gerçek bir Python ortamında çalıştırın. Önce bilinen bir girdiyle sağduyu testi yapın, sonra asıl problemi çözün. Kayan nokta karşılaştırması varsa tolerans kullandığınızdan emin olun. Sonucu hassasiyetiyle birlikte not edin.

Kontrol listesi

  • [ ] Problemi ve gereken hassasiyeti belirledim.
  • [ ] YZ'nin ürettiği kodu satır satır okuyup anladım.
  • [ ] Kodu gerçek bir Python ortamında ben çalıştırdım.
  • [ ] Bilinen bir girdiyle sağduyu testi yaptım.
  • [ ] Mümkünse sembolik/elle bir çapraz kontrol ekledim.
  • [ ] Kayan nokta karşılaştırmalarında tolerans kullandım.