SCIENTIFIC COMPUTING

Deniz Balcı
5 min readJun 26, 2022

--

GİRİŞ

Bu yazımda amacım scientific computing (bilimsel hesaplama) ile uğraşan insanlar için naçizane başlangıç niyetine kaynak hazırlamaktır.

Artık bu işler için kütüphaneler kullanılsa da en azından neyin nasıl yapıldığını temel seviyede bilmenin gerek olduğunu düşünüyorum. Öncelikle beni bu alanla beni tanıştıran “İLKER MANAP” hocama teşekkürlerimi sunuyorum. Tezimde de istatistiksel hesaplamalar üzerinde araçlar geliştirirken ve karşıma çıkan başka kişilerin sorunlarında da, zorlandığım kısımlarda sizler zorlanmayın diye bu blog yazısını yazıyorum.

SCIENTIFIC COMPUTING(BİLİMSEL HESAPLAMA,HESAPLAMALI BİLİM,COMPUTATIONAL SCIENCE): Matematik ve bilgisayar bilimlerinin mühendislik ve diğer bilimlerde kullanımını içeren bir alandır.

Kısacası işin özü şu: Elle veya geleneksel yollarla çözülemeyen sorunları bilgisayar bilimlerini kullanarak çözmektir ve doğadaki olayları bilgisayar ortamında taklit ederek, belli başları şeyleri anlamamızı sağlamaktır.

NEDEN BİLMELİYİZ?

Bizler kütüphane kullanmayalım mı?, Veri bilimciler veya bilgisayar bilimleri ile uğraşan insanlar her şeyi 0 dan mı yapsın?

YANIT

Her şeyi sıfırdan kendiniz oluşturmayın ama kullandığınız sistemler nasıl çalışıyor onu bilin. Yarın öbür gün Google veya başka bir kurum, bir servisini kullanımdan çıkardığı vakit ortada kalmayın.

Kullandığınız yapıların nasıl çalıştığını bilin,Örneğin R programlama yaparken bir matrisin tersini alacağınız vakit “solve()” fonksiyonunu çağırıyorsunuz ama onu nasıl programlayabileceğinizide düşünün.

R’da lineer cebir işlemlerini yapıyorsunuz değil mi? Hayır R’ı kullanarak LaPacaktaki o fonksiyonu kullanıyorsunuz. Yani iş gene c/c++ tarafında dönüyor. R dilini arayüz olarak kullanıyorsunuz.

https://rdrr.io/r/base/La_library.html

https://www.netlib.org/lapack/

Aynı şekilde pythonda numpy’ın çekirdek kodlarına baktığımızda pyobject nesnesini c++ nesnesine çeviriyor.

https://github.com/numpy/numpy/tree/main/numpy/core/include/numpy

https://github.com/numpy/numpy/blob/main/numpy/core/src/umath/_rational_tests.c

Başka yapıları da inceleyerek neyin nasıl çalıştığını bilmek daha iyidir.

Not:pyobject nesnesini c++ nesnesine çevirmek daha hızlı hesap yapmamızı sağlıyor. (Pythonla o fonksiyonu yazsalardı. Python derlenip çalışıp output verme süresi daha uzun sürüyor, bu sebeple bu işlem yapılıyor. Yoksa python veya R gibi diller hızlı değil, kolay kullanıldığı için kullanılıyor. Aşağıdaki linki sizin için bıraktım :D

Bu konuyla ilgili yazılar işinize yarayacaktı.

https://blog.ictr.club/computation/

https://physicspython.wordpress.com/2020/11/11/using-c-functions-in-python/

Ayaküstü 2 şehir efsanesini yıktığımıza göre işimize bakalım, neyin ne olduğunu bilmek bu sebeple mühim. Yarın öbür gün bir ihtiyaç olduğunda sizler de kendinizde c++ ile veya go ile bir formül bir hesap yapabilin.

TEORİK BÖLÜM

TEMEL MATEMATİK BİLGİSİ

Bu konu üniversitelerde yüksek lisans, doktora seviyesinde işleniyor ancak bir geliştirici olarak karşınıza bu tip sorunlar çıktığı vakit bazı şeyleri hızlı öğrenmemiz gerekiyor. Ancak matematik bilgisi olmadan bu alanda uğraşamazsınız. Uğraşılacak spesifik teorik matematik bölümü veya uygulamalı matematik konuları dışında bence bilinmesi en temel konular şunlar olmalıdır.

  1. Temel Kavramlar(Mantık,4 işlem ,karekök,mutlak değer,çarpım ve toplam sembolü vb konular)
  2. Limit
  3. Türev
  4. İntegral
  5. Dizi-Seriler

Örnek Sorun

Örnek olarak e^x değerini bulmak istiyoruz.Exponent fonksiyonunu bilgisayara nasıl tanıtacağız.Taylor serisi açılımları ile bunu programlanabilir hale getireceğiz.

e^x taylor serisi açılımı

Yukarıda e^x fonksiyonunu taylor serisi kullanarak bir modele aktardık. Faktöriyel fonksiyonunu da programlamamız gerekli.

x!=x-1.x-2……..1 e kadar çarpan bir fonksiyon programlayacağız .

Not: Tutup 2ex³ integralini kafadan yapın veya ln(2x³) ‘ın türevini elle alın demiyorum. Ne işe yarıyor bilin, hesaplama işini bilgisayar yapacak ancak bunun nasıl yapıldığını hangi kitaba bakarak bulabileceğiniz biliniz.

Bu konuyla ilgili önerebileceğim kaynaklar

  1. https://www.youtube.com/c/Buders/playlists
  2. http://math2.org/
  3. Calculus a complete Course -Christopher Essex and Robert A. Adams

TEMEL ALAN BİLGİSİ

Çalıştığınız alanın terminolojisini biliniz.Örneğin ses üzerinde çalışacaksanız, ses nedir? , ses dalgaları nedir? Gibi temel soruları bilin. Mutlaka giriş seviyesinde bir makale vardır, onu okuyun.

https://www.mathsisfun.com/physics/waves-sound.html

Fizik tabanlı bir şey öğrenmek isterseniz, şu listedeki siteler oldukça işinize mutlaka yarayacaktır.

  1. https://www.mathsisfun.com/physics/index.html
  2. https://www.ams.jhu.edu/dan-mathofmusic/sound-waves/

Eğer fizik, kimya biyoloji değil de istatistik ile ilgileniyorsanız.

  1. STATISTICS James Mcclave ,Terry Sınch
  2. https://www.statlect.com/fundamentals-of-statistics/
  3. https://www.itl.nist.gov/div898/handbook/eda/eda.htm

NOT: Kısacası çalışacağınız konuyla ilgili temel kavramları bilin. İstatistik mezunuyum ve zamanında az buçuk ses ve görüntü ile temel seviyede uğraştığım için bu konuları örnek verebildim.

UYGULAMA BÖLÜMÜ

PROGRAMLAMA-MATEMATİK

Bu konuyla uğraşacak birisi hali hazırda zaten programlama biliyordur.Ancak çeşitli denklemlerin en kestirme ve en hızlı yoldan programlamak için gerçekten programlama bilmek gerekiyor.

UYGULAMA-1

Mean Absolute Error

Örneğin yukarıda taraftaki ortalama mutlak hatayı programlayabilin. Payda tahmin değeri — gerçek değerlerinin farkının toplamının ortalaması alınmış.

R ile pay kısmını hem for ile hem while döngüsü ile kodlayalım.Aşağıdaki gist üzerinden kodlara erişebilirsiniz.

WHİLE DÖNGÜSÜ İLE KODLANMIŞ HALİ

FOR DÖNGÜSÜ İLE KODLANMIŞ HALİ

For döngüsü ile çalışan kod : 0.008654833 saniyede,

While döngüsü ile çalışan kod :Time difference of 0.009809256 saniyede çıktımızı verdi.

Fakat For döngüsündeki fark şu 1: n ‘e kadar seri oluşturduk,While döngüsünde ise i değişkenini 1 arttırdık. Verimiz büyüdüğünde işler değişecektir. Ayrıca 10 tane veri için bu kadar hızlı hesap yapabilmesi normal falan yüz binlerce veriniz olduğu vakit performansın önemi artacaktır.

UYGULAMA-2

Bu uygulamada ise istatistiksel dağılımlardan normal dağılıma ait bir sorunu ele alalım. İlk başta şöyle bir özet geçeyim. İstatistiksel dağılımlar olayların matematiksel belirli kriterlere göre açıklamamızı sağlayan fonksiyonlar, modellerdir.

Normal dağılım dediğimiz (Gauss dağılımda deniliyor) model doğada sık karşımıza çıkan bir matematiksel modeldir.

Normal dağılım grafiği

Amacımız yukarıdaki mavi renkli alanın miktarını hesaplamaktır.Bu grafikteki veriler ise standart normal dağılıma ait (aşağıdaki formülden üretilmiş verilerdir)

standart normal dağılımın olasılık yoğunluk fonksiyonu

Mavi alanı hesaplamak için yukarıdaki formülün integralini bulmamız gereklidir.Yani aşağıdaki fotoğraftaki b ile a arasındaki integrali hesaplamalıyız.

Fakat bu integrali cebirsel olarak hesaplayamadığımız için seri açılımlarını kullanmalıyız.Burada biz devreye gireceğiz.

Bu seri açılımı sayesinde bizler verilen aralıklar için hesaplamalar yaparak olasılık değerlerini elde edebiliyoruz.

Şimdi ise kod tarafını alıntı yapalım.

function GetZPercent(z) 
{
//z == number of standard deviations from the mean

//if z is greater than 6.5 standard deviations from the mean
//the number of significant digits will be outside of a reasonable
//range
if ( z < -6.5)
return 0.0;
if( z > 6.5)
return 1.0;

var factK = 1;
var sum = 0;
var term = 1;
var k = 0;
var loopStop = Math.exp(-23);
while(Math.abs(term) > loopStop)
{
term = .3989422804 * Math.pow(-1,k) * Math.pow(z,k) / (2 * k + 1) / Math.pow(2,k) * Math.pow(z,k+1) / factK;
sum += term;
k++;
factK *= k;

}
sum += 0.5;

return sum;
}

Yukarıdaki açılımın Javascript’e dönmüş hali, biraz kod okur yazarlığınız varsa zaten anlarsınız. Eğer anlamazsanız lütfen yorumlarda belirtiniz.

Bu sorun için kaynakça

  1. https://stackoverflow.com/questions/16194730/seeking-a-statistical-javascript-function-to-return-p-value-from-a-z-score
  2. http://math2.org/math/stat/distributions/z-dist.htm

Bu konularda kafa patlatacaksınız, 1–3. Kaynakları mutlaka incelemek zorundasın. Diğer kaynaklarda benim işime yaramıştı, umarım sizin de işine yarar.

  1. Numerical Recipes 3rd Edition The Art of Scientific Computing
  2. Numerical Python:Scientific Computing and Data Science Applications with Numpy Scipy and Matplotlib
  3. https://www.youtube.com/watch?v=nykOeWgQcHM&list=PLUl4u3cNGP63WbdFxL8giv4yhgdMGaZNA
  4. Learn R for Applied Statistics with Data Visualizations ,Regressions ,and Statistics

GENEL KAYNAKÇA

  1. https://iam.metu.edu.tr/en/scientific-computing
  2. https://en.wikipedia.org/wiki/Computational_science
  3. https://www.scicomp.uni-kl.de/about/scientific-computing/
  4. https://www.datasciencearth.com/matematiksel-programlama/

--

--