AST416 Astronomide Sayısal Çözümleme - II

Slides:



Advertisements
Benzer bir sunumlar
Matlab’da Diziler; Vektörler ve Matrisler
Advertisements

LİMİT.
FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ
Makine Müh. & Jeoloji Müh.
Bilgisayar Programlama Güz 2011
İstatistik Tahmin ve Güven aralıkları
17-21 Şubat Doğrusal Fonksiyonların Grafiği
Bezier Eğrileri ve Yüzeyleri
8. SAYISAL TÜREV ve İNTEGRAL
CLUSTERING USING REPRESENTATIVES Hazırlayan: Arzu ÇOLAK
ÖZEL TANIMLI FONKSİYONLAR
Bölüm 8: EĞRİ UYDURMA Fizikte laboratuarda yapılan deneysel ölçümlerin ne kadar hata payı içerdiğini, veya belli teorik modellere ne kadar uyduğunu bilmek.
AST409 Astronomide Sayısal Çözümleme
MATLAB’ de Programlama
TBF Genel Matematik I DERS – 1 : Sayı Kümeleri ve Koordinatlar
AST409 Astronomide Sayısal Çözümleme
AST409 Astronomide Sayısal Çözümleme
Bölüm 4: Sayısal İntegral
Yapay Zeka Teknikleri Kullanılarak Yüzey Modelleme
AST409 Astronomide Sayısal Çözümleme
AST409 Astronomide Sayısal Çözümleme
DOĞRU GRAFİKLERİ EĞİM.
Yıldız Teknik Üniversitesi Makina Müh. Bölümü
BM-103 Programlamaya Giriş Güz 2014 (8. Sunu)
Erkan ULKER & Ahmet ARSLAN Selçuk Üniversitesi,
A409 Astronomide Sayısal Çözümleme
C PROGRAMLAMA FONKSİYONLAR Adres ile Fonksiyon Çağırma Pointer (İşaretçiler) ile Fonksiyon Çağırma Rekürsif Fonksiyonlar.
Yrd.Doç.Dr. Mustafa Akkol
Bölüm 6 Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
SONLU ELEMANLAR DERS 5.
DOĞRUSAL DENKLEMLER Tuba TIRAŞOĞLU
10-14 Şubat Fonksiyonların Grafiği
Yıldız Teknik Üniversitesi Makina Müh. Bölümü
MATLAB’ de Programlama
21 - ÖLÇME SONUÇLARI ÜZERİNE İSTATİSTİKSEL İŞLEMLER
SONLU ELEMANLAR DERS 6.
Regresyon Örnekleri.
ÇOK DEĞİŞKENLİ FONKSİYONLAR
DİERANSİYEL DENKLEMLER
BAĞINTI & FONKSİYONLAR.
FONKSİYONLAR.
İnternet Programlama-I
En Yakın k-komşu Algoritması Bellek Tabanlı Sınıflandırma
Polinomlar Enterpolasyon Grafikler Uygulama Sayısal Analiz
SAYISAL ANALİZ Doç. Dr. Cüneyt BAYILMIŞ.
Sayısal Analiz Sayısal Türev
Sayısal Analiz Sayısal İntegral 3. Hafta
Sayısal Analiz 7. Hafta SAÜ YYurtaY.
Denklemeler içerdiği değişkenin sayısına ve kuvvetine göre sınıflandırılır. Aşağıdaki örneklere bakarsak; 2x+4=15I. Dereceden I Bilinmeyenli Denklem x.
Regresyon Analizi İki değişken arasında önemli bir ilişki bulunduğunda, değişkenlerden birisi belirli bir birim değiştiğinde, diğerinin nasıl bir değişim.
İNTEGRAL.
Tanım: Bir x 0  A = [a,b] alalım. f : A  R ye veya f : A -{x 0 }  R ye bir Fonksiyon olsun Terimleri A - {x 0 } Cümlesine ait ve x 0 ’a yakınsayan.
İLERİ GERİ Sayfa:2 GERİ Tanım: Bir x 0  A = [a,b] alalım. f : A  R ye veya f : A -{x 0 }  R ye bir Fonksiyon olsun Terimleri A - {x 0 } Cümlesine.
OLASILIK ve İSTATİSTİK
7. HAFTA.
ÇOK DEĞİŞKENLİ FONKSİYONLAR
Fonksiyonlar ve Diziler
MATLAB R2013’e Giriş.
Bölüm 6 Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
C Programlama Dili Bilgisayar Mühendisliği.
Bilgisayar Programlamasına ve Veri Analizine Giriş - IV
5.1 POLİNOMİNAL REGRESSİYON
Doğu Akdeniz Üniversitesi Bilgisayar Ve Teknoloji Yüksek Okulu
FONKSİYONLAR.
BLP 4210 PLATFORM BAĞIMSIZ PROGRAMLAMA
Bölüm 6: Kullanıcı Tanımlı Fonksiyonlar I
Bilgisayar Bilimi Fonksiyonlar-2.
Bilgisayar Bilimi Problem Çözme Süreci-3.
Sunum transkripti:

AST416 Astronomide Sayısal Çözümleme - II 3. Python'da Interpolasyon

scipy.Interpolate Modülü ile İnterpolasyon 1 Boyutlu İnterpolasyon: interp1d __call__ metodu y = f(x) şeklinde bir fonksiyon için (x,y) ikililerinin interpolasyonu sonucu her iki veri noktasının arasına uyarlanan bir doğru şekilnde bir fonksiyon döndüren bir sınıftır. >>> import matplotlib.pyplot as plt >>> import numpy as np >>> from scipy import interpolate >>> x = np.arange(0,10) >>> y = np.exp(-x/3.0) # y = e^-3 >>> f = interpolate.interp1d(x,y) >>> xyeni = np.arange(0,9,1) >>> yyeni = f(xyeni) >>> plt.plot(x,y,'o') >>> plt.plot(xyeni,yyeni,'-') >>> plt.show()

Aksi söyllenmediği takdirde fonksiyon, veri noktaları arasında birer doğru uyumlayacak şekilde oluşturulur. Eğer “kind” parametresi “cubic” şekilde belirlenmişse bu kez noktaların arasına 3. dereceden birer polinom ayarlanır. Bu yapısıyla fonksiyon gerçekte lineer ya da kübik spline interpolasyonu uygulamaktadır. >>> from matplotlib import pyplot as plt >>> import numpy as np >>> from scipy.interpolate import interp1d >>> x = np.linspace(0, 10, 11, endpoint=True) >>> y = np.cos(-x**2/9.0) >>> f1 = interp1d(x,y) >>> f2 = interp1d(x,y,kind='cubic') >>> xyeni = np.linspace(0, 10, 41, endpoint=True) >>> y1 = f1(xyeni) >>> y2 = f2(xyeni) >>> plt.plot(x, y, 'o', xyeni, y1, '-', xyeni, y2, '–') >>> plt.legend(['veri', 'dogrusal', 'kubik'], loc = 'best') >>> plt.plot >>> plt.show()

scipy.Interpolate Modülü ile İnterpolasyon Çok Boyutlu İnterpolasyon: griddata (opsiyonel) >>> import numpy as np >>> def fonk(x, y): ... return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2 >>> grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j] fonksiyonunun [0, 1] x [0, 1] gridindeki çok sayıda nokta için interpolasyonunu hesaplayalım. Fonksiyonun değerini bu griddeki 1000 nokta için bildiğimizi varsayalım. >>> noktalar = np.random.rand(1000, 2) >>> degerler = fonk(noktalar[:,0], noktalar[:,1]) Bu noktalardan yola çıkarak sınıfın tüm metodlarının yardımıyla interpole değerleri bulalım ve grafiğini çizdiirelim. >>> from scipy.interpolate import griddata >>> grid_z0 = griddata(noktalar, degerler, (grid_x, grid_y), method='nearest') >>> grid_z1 = griddata(noktalar, degerler, (grid_x, grid_y), method='linear') >>> grid_z2 = griddata(noktalar, degerler, (grid_x, grid_y), method='cubic') >>> import matplotlib.pyplot as plt >>> plt.subplot(221) >>> plt.imshow(fonk(grid_x, grid_y).T, extent=(0,1,0,1), origin='lower') >>> plt.plot(noktalar[:,0], noktalar[:,1], 'k.', ms=1) >>> plt.title('Veri') >>> plt.subplot(222) >>> plt.imshow(grid_z0.T, extent=(0,1,0,1), origin='lower') >>> plt.title('En Yakin') >>> plt.subplot(223) >>> plt.imshow(grid_z1.T, extent=(0,1,0,1), origin='lower') >>> plt.title('Dogrusal') >>> plt.subplot(224) >>> plt.imshow(grid_z2.T, extent=(0,1,0,1), origin='lower') >>> plt.title('Kubik') >>> plt.gcf().set_size_inches(6, 6) >>> plt.show()

Yapısal (Procedural) Spline İnterpolasyonu Yapısal spline interpolasyonu iki adımda gerçekleştirilir: i) verinin spline interpolasyonu ile temsili oluşturulur, ii) istenen noktalarda spline interpolasyonu hesabı yapılır. Spline temsili için gereken katsayılar doğrudan ya da parametrik olarak elde edilebilir. Verinin doğrudan spline temsili (katsayıların hesabı) splrep fonksiyonu ile gerçekleştirilir. Fonksiyona verinin x,y noktaları geçirilir; fonksiyon t: düğüm noktalarını, c: katsayıları, k: spline derecesini göstermek üzere (t, c, k) demet değişkenini döndürür. Varsayılan spline derecesi kübiktir ancak istenirse k parametresi ile değişitirilebilir. N-boyutlu uzayda veri splprep fonksiyonu ile parametrik olarak temsil edilir. Bu fonksiyon tek bir değişken kabul ettiği için N-boyutlu veri N-boyutlu bir dizi ile tanımlanır. Dizilerin uzunluğu verideki nokta sayısını, dizilerin sayısı ise verinin kaç boyut içerdiğini gösterir. Parametre değişkeni u parametresi ile gösterilir ve 0-1 aralığında monotonik artan bir dizidir. Fonksiyon yine spline parametrelerini tutan (t, c, k) demetini ve u parametresini döndürür. s interpolasyon sırasındaki düzleştimrenin (smoothing) derecesini belirlemek üzere kulanılabilecek bir parametredir. Varsayılan değeri m: veri sayısını göstermek üzere s = m – sqrt(2m) ile verilir. Düzleştirme istenmiyorsa s = 0 olduğu belirtilmelidir. Spline temsili belirlendikten sonra istenen noktalarda spline interpolasyon (ve türevi ile integrailinin) hesabını yapan fonksiyonlar splev, spalde, splint fonksiyonlarıdır. 8 ya da daha fazla düğüm içeren kübik spline fonksiyonları için kök hesabı yapan bir de splroot fonksiyonu bulunmaktadır.

Örnek: Kübik Spline İnterpolasyonu >>> import numpy as np >>> import matplotlib.pyplot as plt >>> from scipy import interpolate Örnek: Kübik Spline İnterpolasyonu >>> x = np.arange(0, 2*np.pi+np.pi/4, 2*np.pi/8) >>> y = np.sin(x) >>> tck = interpolate.splrep(x, y, s=0) >>> xyeni = np.arange(0, 2*np.pi, np.pi/50) >>> yyeni = interpolate.splev(xyeni, tck, der=0) grafiğini çizdirelim >>> plt.figure() >>> plt.plot(x, y, 'x', xyeni, yyeni, xyeni, np.sin(xyeni), x, y, 'b') >>> plt.legend(['Dogrusal', 'Kubik Spline', 'Veri']) >>> plt.axis([-0.05, 6.33, -1.05, 1.05]) >>> plt.title('Kubik Spline Interpolasyonu') >>> plt.show() Spline interpolasyonun diğer uygulamaları için bkz. spline_interpolasyonu_2.py

Nesne Yönelimli (Object Oriented) Spline İnterpolasyonu UnivariateSpline Python'da spline interpolasyonu için Nesne Yönelimli bir alternatif de bulunmaktadır. Başlatıcı (__init__) metoda x,y verisi geçirilerek olgu oluşturulur. Sınıfın __calll__ metodu gönderilen x değerleri için spline interpolasyonu ile y değerlerini hesaplar ve döndürür. InterpolatedUnivariateSpline alt sınıfı bu işlemi yapmasının yanı sıra ayrıca integral, türev ve kök bulma için de metodlara sahiptir. Bunun yanı sıra düzleştirme istendiğinde tıpkı yapısal alternatifte olduğu gibi s parametresi kullanılır. Bu durumda verideki düğüm sayısından daha az (düzleştirme miktarı kadar az) düğüm içeren bir spline fonksiyonu oluşturulur. Bu şekilde düzleştirme kullanılarak oluşturulan spline'a “interpole spline” yerine “düzleştirilmiş spline” adı verilir. UnivariateSpline sınıfının bir başka alt sınıfı olan LSQUnivariateSpline t parametresi ile düğümleri dışarıdan yerleri ile birlikte sağlamak için kullanılabilir. Aralarında eşit uzaklıklar olmayan ve her noktadan geçmeyen; bazı aralıklarda düzleştirme içeren bazılarında içermeyen özel nitelikli spline fonksiyonları yaratmak için kullanışlıdır.

>>> import numpy as np >>> import matplotlib.pyplot as plt >>> from scipy import interpolate Örnek: Yapısal olarak çözdüğümüz kübik spline interpolasyon örneğini nesne yönelimli alternatifiyle çözelim. >>> x = np.arange(0, 2*np.pi+np.pi/4, 2*np.pi/8) >>> y = np.sin(x) >>> s = interpolate.InterpolatedUnivariateSpline(x, y) >>> xyeni = np.arange(0, 2*np.pi, np.pi/50) >>> yyeni = s(xyeni) grafiğini çizdirelim >>> plt.figure() >>> plt.plot(x, y, 'x', xyeni, yyeni, xyeni, np.sin(xyeni), x, y, 'b') >>> plt.legend(['Dogrusal', 'InterpolatedUnivariateSpline', 'Veri']) >>> plt.axis([-0.05, 6.33, -1.05, 1.05]) >>> plt.title('Nesne Yonelimli Spline Interpolasyonu') >>> plt.show() Spline interpolasyonun diğer uygulamaları için bkz. spline_interpolasyonu.py

2-Boyutlu Spline İnterpolasyonu (Yapısal) (opsiyonel) İki boyutlu bir yüzeye üzerindeki veri için ara değer hesabı yapmak (interpolasyon) için bsplrep fonksiyonu kullanılır. Bu fonksiyona tıpkı 1-boyutlu yapısal (procedural) spline interpolasyonunda olduğu gibi z = f(x,y) yüzeyini oluşturan x, y ve z dizileri gönderilir. Fonksiyon tx, ty, tz: düğüm noktalarını, c: katsayıları, kx, ky: spline derecesini göstermek üzere (tx, ty, tz, c, kx, ky) demet değişkenini döndürür. Bu demet değişken splev fonksiyonuna geçirilir ve istenen (x, y) noktaları için interpolasyon (ara değer) hesabı yapılır. Tıpkı 1-boyutlu spline interpolasyonunda olduğu gibi 2-boyutlu spline interpolasyounda da s parametresi düzleştirme (smoothing) için kullanılır. s = 0 düzleştirme yapılmak istenmediği anlamına gelir. m: nokta sayısını göstermek üzere varsayılan düzleştirme değeri s = m – sqrt(2m) 'dir. >>> import numpy as np >>> from scipy import interpolate >>> import matplotlib.pyplot as plt >>> # 20x20 'lik bir grid uzerinde bir fonksiyon tanimlayalim >>> x, y = np.mgrid[-1:1:20j, -1:1:20j] >>> z = (x+y) * np.exp(-6.0*(x*x+y*y)) >>> # grafik >>> plt.figure() >>> plt.pcolor(x, y, z) >>> plt.colorbar() >>> plt.title("Seyrek Orneklenmis Fonksiyon") >>> plt.show() >>> # 70x70'lik daha genis bir grid uzerinden ornekleme >>> xyeni, yyeni = np.mgrid[-1:1:70j, -1:1:70j] >>> tck = interpolate.bisplrep(x, y, z, s=0) >>> znew = interpolate.bisplev(xyeni[:,0], yyeni[0,:], tck) >>> plt.pcolor(xnew, ynew, znew) >>> plt.title("Spline Interpolasyonu")

Aynı fonksiyonun 70 x 70 'lik bir gridle örneklenmiş versiyonu 20 x 20 'lik bir gridle (20 (x,y) ikilisi ile) örneklenmiş fonksiyon

Ödev 3 (1 Mayıs 2017, Pazartesi 23:59) Lagrange İnterpolasyon Yöntemi ile interpolasyon yapabilen LagrangeInterpolasyon adlı bir sınıf kodlayınız. Kodunuz aşağıdaki özelliklere sahip olmalıdır. Orjinal veriyi (x ve y'leri) birer NumPy dizisi olarak başlatan bir başlatıcı (__init__) metoduna sahip olmaldıır. Herhangi bir x noktası için Lagrange interpolasyonu ile interpole y değerini hesaplayan bir __call__ metoduna sahip olmalıdır. Herhangi bir x dizisinin (liste ya da demet değişkenler için de çalışmalı!) tüm değerleri için Langrange interpolasyonu ile y değerlerini hesaplayıp, bir dizi şeklinde döndüren vektorel_interpolasyon metodu içermelidir. Kodunuzu ders notunun (Ders03_Interpolasyon_Yontemleri.pdf) 5. bölümündeki örnek için (x = 2.2) çalıştıran bir _test() fonkisyonu kodlayınız (x0 = 1 alınız). Kodunuzu aynı örnekteki veri üzerinden x = [1.1, 1.3, 1.5, 1.7, 1.9, … , 4.1, 4.3, 4.5, 4.7, 4.9] dizisi için çalıştıran ve bu x'lere karşılık hesap ettiği interpole y değerlerinin grafiğini çizen bir _test2() fonksiyonu kodlayınız. Verilen x,y ikilileri için scipy.interpolate fonksiyonlarından splrep ve splev 'I kullanarak spline interpolasyonu ile 5. basamakta verilen x dizisi için interpole y değerleirni hesaplayıp, yine 5. basamakta çizilen grafiğin üzerine x'lere karşıılık olarak çizdiriniz. Orjinal veride x'i y'ye bağlayan fonksiyonu da bularak, x dizisine karşılık bu fonksiyonla hesapladığınız y dizisini de bu graiğin üzerine çizdiriniz. Grafiğinizin eksenlerine birer isim (xlabel, ylabel) veriniz ve başlığı (title) ile birlikte çizdirdiğiniz eğrilerin ne anlama geldiğini gösteriniz (legend). Kodunuzu (sadece kodu, grafiği değil) Türkçe karakter içermeyecek şekilde ad_soyad_ogrno_odev3.py isimli bir dosyaya kaydedip e-posta ile gönderiniz.