{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# AST416 Astronomide Sayısal Çözümleme - II #\n", "## Ders - 03 İnterpolasyon ##" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Doç. Dr. Özgür Baştürk
\n", "Ankara Üniversitesi, Astronomi ve Uzay Bilimleri Bölümü
\n", "obasturk at ankara.edu.tr
\n", "http://ozgur.astrotux.org" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Bu derste neler öğreneceksiniz?#\n", "## İnterpolasyon ##\n", "\n", "* [İnterpolasyon](#İnterpolasyon)\n", "* [scipy.Interpolate Modülü ile İnterpolasyon](#scipy.Interpolate-Modülü-ile-İnterpolasyon)\n", " * [1 Boyutlu İnterpolasyon: interp1d](#1-Boyutlu-İnterpolasyon:-interp1d)\n", " * [Çok Boyutlu İnterpolasyon: griddata](#Çok-Boyutlu-İnterpolasyon:-griddata)\n", "* [Yapısal Spline İnterpolasyonu](#Yapısal-Spline-İnterpolasyonu)\n", " * [Bir Boyutlu Yapısal Spline İnterpolasyonu](#Bir-Boyutlu-Yapısal-Spline-İnterpolasyonu)\n", " * [İki Boyutlu Yapısal Spline İnterpolasyonu](#İki-Boyutlu-Yapısal-Spline-İnterpolasyonu)\n", "* [UnivariateSpline İle Nesne Yönelimli Spline İnterpolasyonu](#UnivariateSpline-İle-Nesne-Yönelimli-Spline-İnterpolasyonu)\n", "* [Örnek: Spline Fonksiyonları ile İnterpolasyon](#Örnek:-Spline-Fonksiyonları-ile-İnterpolasyon)\n", "* [Ödev 3](#Ödev-3)\n", "* [Kaynaklar](#Kaynaklar)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# İnterpolasyon #\n", "\n", "Sayısal çözümlemede interpolasyon formal olarak bir süreksiz veride bilinen değerlerden yola çıkarak bilinmeyen ara değerlerin hesaplanmasına dayanan her türlü yöntem olarak tanımlanır. Astronomi, interpolasyonun en sık ihtiyaç duyulduğu alanlardan biridir. Zira astronomide sürekli veri almak ancak uzay teleskoplarıyla mümkün olabilmekte, onlarda dahi sürekli veri alınmasına engel kısıtlar bulunmaktadır. Gece / gündüz, kapalı / açık hava, aletsel problemler, kullanılan dedektörlerin veri alabilme sıklığı, çok bant gözlem yapma ihtiyacı gibi nedenlerle astronomide kullanılan verinin içerisinde büyük boşluklar oluşabilmektedir. Bu boşlukları, var olan veriden yola çıkarak doldurmak önemli bir ihtiyaç olarak karşımıza çıkmaktadır.\n", "\n", "İnterpolasyonda izlenen geleneksel yöntemler, örneklerle birlikte [İnterpolasyon Yöntemleri](http://ozgur.astrotux.org/ast416/Ders_03/Ders03_Interpolasyon_Yontemleri.pdf) kaynağında verilmiştir. Ayrıca astronoimde en sık başvurulan interpolasyon yöntemi olan [Spline İnterpolasyonu](http://ozgur.astrotux.org/ast416/Ders_03/Ders03_Spline_Interpolasyonu.pdf) dokümanında ayrıntılı olarak anlatılmş ve örneklendirilmiştir. Bu derste Python programlama dilinin ve ek modüllerin interpolasyona ilişkin sağladığı olanaklar örnek kodlarla işlenecektir. Dersten önce bu iki dokümanın incelenmesinde fayda vardır.\n", "\n", "# scipy.Interpolate Modülü ile İnterpolasyon #\n", "\n", "## 1 Boyutlu İnterpolasyon: interp1d ##\n", "\n", "`scipy.interpolate` modülü fonksiyonlarından `interp1d` verilen verideki her bir $(x,y)$ ikilisinin arasına bir doğru uyumlayarak, istenen $x$ değerleri için bu doğrularda karşılık geldiği $y$ değerlerini hesaplayarak interpolasyon yapar.\n", "\n", "Aşağıdaki örnekte ilk olarak $y = e^{\\frac{-x}{3}}$ fonksiyonu $x = [0,10)$ aralığında 50 nokta için oluşturulmaktadır. Daha sonra bu $x,y$ ikilileri `interpolate.interp1d` fonksiyonuna sağlanarak $f$ doğrusal interpolasyon fonksiyonu oluşturulmuş ve $x_{yeni} = [1,8]$ aralığında oluşturulan 5 yeni x değeri bu fonksiyona sağlanarak, bu noktalar için $y_{yeni}$ interpolasyon değerleri elde edilmiştir. Bu interpolasyon değerleri ve $(x,y)$ ikilileri arasında interpolasyonun yapıldığı doğrular orjinal fonksiyonla birlikte çizdirilmiştir." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from scipy import interpolate\n", "x = np.arange(0,10)\n", "y = np.exp(-x/3.0) # y = e^(-x / 3)\n", "f = interpolate.interp1d(x,y)\n", "xyeni = np.linspace(1,8,5)\n", "yyeni = f(xyeni)\n", "plt.plot(x,y,'b-')\n", "plt.plot(xyeni,yyeni,'ro')\n", "plt.plot(xyeni,yyeni,'r-')\n", "plt.xlabel(\"x\")\n", "plt.ylabel(\"y\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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 uyarlanır. Bu yapısıyla fonksiyon gerçekte lineer ya da kübik [spline interpolasyonu](http://ozgur.astrotux.org/ast416/Ders_03/Ders03_Spline_Interpolasyonu.pdf) uygulamaktadır.\n", "\n", "Aşağıdaki örnekte bu kez önce $y = cos(-x^2 / 9.0)$ fonksiyonu $x = [0,10]$ aralığındaki 11 nokta için oluşturulmakta; daha sonra, ardışık her $(x,y)$ ikilisine sırasıyla doğrusal ve 3. dereceden polinomlar aynı aralıktaki 41 nokta için uyarlanmaktadır. Burada dikkat edilmesi gereken husus, veri setninin tamamına doğrusal ya da 3. dereceden bir polinomun uyarlanmadığı, bu fonksiyonların veri setindeki ardışık ikililerin arasına uyarlandığıdır. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from matplotlib import pyplot as plt\n", "import numpy as np\n", "from scipy.interpolate import interp1d\n", "x = np.linspace(0, 10, 11, endpoint=True)\n", "y = np.cos(-x**2/9.0)\n", "f1 = interp1d(x,y)\n", "f2 = interp1d(x,y,kind='cubic')\n", "xyeni = np.linspace(0, 10, 41, endpoint=True)\n", "y1 = f1(xyeni)\n", "y2 = f2(xyeni)\n", "plt.plot(x, y, 'o', xyeni, y1, '-', xyeni, y2, '-.')\n", "plt.legend(['veri', 'dogrusal', 'kubik'], loc = 'best')\n", "plt.plot\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Öncelikle sayısal veri içeren (nümerik) sütunlara ilişkin istatistiklerin verildiğini görüyoruz. Ancak öğrencilerin durumuna ilişkin sütunlarla ilgili de istatistiksel bilgi alabiiriz." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Çok Boyutlu İnterpolasyon: griddata ##\n", "\n", "`scipy.interpolated` sadece bir boyutta tanımlı $y = f(x)$ yapısındaki veriler için değil çok boyutlu $z = f(x,y,\\omega,...)$ şeklindeki veriler için de interpolasyon yapmaya yönelik olanaklar sağlamaktadır. Öncelikle veriyi oluşturmak üzere\n", "\n", "$$z = x^{1 - x}~cos(4~\\pi~x)~sin(4~\\pi~y^2)^2 $$\n", "\n", "fonksiyonunu tanımlayalım" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "def fonk(x, y):\n", " return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$z$ fonksiyonunun $[0, 1] x [0, 1]$ gridindeki çok sayıda nokta için interpolasyonunu hesaplamak üzere değerini bu griddeki rastgele 1000 nokta için bildiğimizi varsayalım. Aşağıda `np.random.rand` fonksiyonu ile ortalama değeri $\\mu = 0$, standart sapması $\\sigma = 1$ olan birer normal dağılımdan oluşturulan $noktalar$ dizisi iki boyutludur ve fonksiyona gönderilen hem $x$, hem de $y$ değerlerini tutmaktadır. Fonksiyon bu ikililer için hesaplanan $z$ değerlerini döndürür ve böylece arasında interpolasyon yapmak istediğimiz $z$ noktaları oluşturulmuş olur." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "noktalar = np.random.rand(1000, 2)\n", "degerler = fonk(noktalar[:,0], noktalar[:,1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu noktalardan hareketle istediğimiz $(x,y)$ ikilileri için bu kez $z_{interp.}$ interpolasyon değerlerini hesaplayalım. Bunun için interpolasyon yapmak istedğimiz $(x,y)$ ikililerini `np.mgrid` fonksiyonuyla $[0,1]$ arasında $x$ ekseninde 100, $y$ ekseninde 200 nokta içerecek şekilde oluşturalım. ve `interpolate.griddata` fonksiyonuna orjinal verimizi içeren $noktalar$ ve $degerler$ dizilerinin yanı sıra, interpolasyon yapılmasını istedğimiz bu $(x,y)$ ikililerini ve interpolasyon yöntemimizi sağlayalım." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from scipy.interpolate import griddata\n", "grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j]\n", "grid_z0 = griddata(noktalar, degerler, (grid_x, grid_y), method='nearest')\n", "grid_z1 = griddata(noktalar, degerler, (grid_x, grid_y), method='linear')\n", "grid_z2 = griddata(noktalar, degerler, (grid_x, grid_y), method='cubic')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Son olarak orjinal fonksiyon ve interpolasyonla elde ettiğimiz noktaları bir grafikle görelim." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "plt.subplot(221)\n", "plt.imshow(fonk(grid_x, grid_y).T, extent=(0,1,0,1), origin='lower')\n", "plt.plot(noktalar[:,0], noktalar[:,1], 'k.', ms=1)\n", "plt.title('Veri')\n", "plt.subplot(222)\n", "plt.imshow(grid_z0.T, extent=(0,1,0,1), origin='lower')\n", "plt.title('En Yakin')\n", "plt.subplot(223)\n", "plt.imshow(grid_z1.T, extent=(0,1,0,1), origin='lower')\n", "plt.title('Dogrusal')\n", "plt.subplot(224)\n", "plt.imshow(grid_z2.T, extent=(0,1,0,1), origin='lower')\n", "plt.title('Kubik')\n", "plt.gcf().set_size_inches(6, 6)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Yapısal Spline İnterpolasyonu #\n", "\n", "Yapısal (ing. structural) 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", "\n", "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.\n", "\n", "$s$ interpolasyon sırasındaki düzleştirmenin (ing. 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. \n", "\n", "Spline temsili belirlendikten sonra istenen noktalarda spline interpolasyon (ve türevi ile integrailinin) hesabını yapan fonksiyonlar $splev$, $splde$, $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.\n", "\n", "## Bir Boyutlu Yapısal Spline İnterpolasyonu ##\n", "\n", "Aşağıda $y = sin(x)$ fonksiyonuyla oluşturulan veri üzerinden bu yöntem kullanılarak yapılan bir kübik interpolasyon örneği verilmiştir. Görüldüğü gibi orjinal verideki $(x,y)$ ikilileri `scipy.interpolate.splev` fonksiyonuna sağlanarak spline temsili oluşturulmakta, bu temsil interpolasyon yapılmak istenen $x_{yeni}$ noktaları ile `scipy.interpolate.splev` fonksiyonuna sağlanmakta ve bu fonksiyon verilen parametrelerle bu interpolasyon işlemini $x_{yeni}$ noktalarında gerçekleştirerek $y_{yeni}$ değerlerini hesaplamaktadır. $[0, 2\\pi]$ aralığında sadece $\\pi / 4$ aralıkla 6 nokta kullanılarak oluşturulan veri üzerinde dahi kübik interpolasyonun $sin(x)$ fonksiyonunu başarıyla oluşturduğu görülmektedir." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy import interpolate\n", "x = np.arange(0, 2*np.pi+np.pi/4, 2*np.pi/8)\n", "y = np.sin(x)\n", "tck = interpolate.splrep(x, y, s=0)\n", "xyeni = np.arange(0, 2*np.pi, np.pi/50)\n", "yyeni = interpolate.splev(xyeni, tck, der=0)\n", "plt.figure()\n", "plt.plot(x,y,'g-',label=\"veri\")\n", "plt.plot(xyeni,yyeni,'b-',label=\"Kubik spline\")\n", "plt.legend(loc=\"upper right\")\n", "plt.axis([-0.05, 6.33, -1.05, 1.05])\n", "plt.title('Kubik Spline Interpolasyonu')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## İki Boyutlu Yapısal Spline İnterpolasyonu ##\n", "\n", "İki boyutlu bir yüzey üzerindeki veri için ara değer hesabı yapmak (interpolasyon) için `interpolate.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 `interpolate.splev` fonksiyonuna geçirilir ve istenen $(x, y)$ noktaları için interpolasyon (ara değer) hesabı yapılır.\n", "\n", "Tıpkı 1-boyutlu spline interpolasyonunda olduğu gibi 2-boyutlu spline interpolasyounda da $s$ parametresi düzleştirme (ing. 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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ " import numpy as np\n", "from scipy import interpolate\n", "import matplotlib.pyplot as plt\n", "# 20x20 'lik bir grid uzerinde bir fonksiyon tanimlayalim\n", "x, y = np.mgrid[-1:1:20j, -1:1:20j]\n", "z = (x+y) * np.exp(-6.0*(x*x+y*y))\n", "# grafik\n", "plt.figure()\n", "plt.pcolor(x, y, z)\n", "plt.colorbar()\n", "plt.title(\"Seyrek Orneklenmis Fonksiyon\")\n", "plt.show()\n", "# 70x70'lik daha genis bir grid uzerinden interpolasyonla ornekleme\n", "xyeni, yyeni = np.mgrid[-1:1:70j, -1:1:70j]\n", "tck = interpolate.bisplrep(x, y, z, s=0)\n", "zyeni = interpolate.bisplev(xyeni[:,0], yyeni[0,:], tck)\n", "# grafik\n", "plt.figure()\n", "plt.pcolor(xyeni, yyeni, zyeni)\n", "plt.colorbar()\n", "plt.title(\"Spline Interpolasyonu\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# UnivariateSpline İle Nesne Yönelimli Spline İnterpolasyonu #\n", "\n", "Python'da spline interpolasyonu için nesne yönelimli (ing. object oriented) bir alternatif de bulunmaktadır. Bu alternatifte başlatıcı (__init__) metodunaa $(x,y)$ verisi geçirilerek bir $spline$ nesnesi oluşturulur. Sınıfın __call__ 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.\n", "\n", "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 fonksiyonuna “interpole spline” yerine “düzleştirilmiş spline” adı verilir.\n", "\n", "`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.\n", "\n", "Şimdi bir önceki örnekte yapısal yöntemle gerçekleştirdiğimizi interpolasyonu bir de nesne yönelimli yöntemle gerçekleştirelim." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = np.arange(0, 2*np.pi+np.pi/4, 2*np.pi/8)\n", "y = np.sin(x)\n", "s = interpolate.InterpolatedUnivariateSpline(x, y)\n", "xyeni = np.arange(0, 2*np.pi, np.pi/50)\n", "yyeni = s(xyeni)\n", "plt.plot(x,y,'g-',label=\"veri\")\n", "plt.plot(xyeni,yyeni,'b-',label=\"Kubik spline\")\n", "plt.legend(loc=\"upper right\")\n", "plt.axis([-0.05, 6.33, -1.05, 1.05])\n", "plt.title('Kubik Spline (Nesne Yonelimli) Interpolasyonu')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Örnek: Spline Fonksiyonları ile İnterpolasyon #\n", "\n", "Spline fonksiyonlarında türev, integral ve kök bulmaya yönelik genel bir örnek aşağıdaki kodla verilmektedir. Koda ilişkin açıklamalar iç dokümatasyonda \"#\" ile sınırlanan yorum ifadeleri ile kod içinden sağlanmıştır." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy import interpolate\n", "\n", "# Kubik Spline\n", "\n", "x = np.arange(0, 2*np.pi+np.pi/4, 2*np.pi/8)\n", "y = np.sin(x)\n", "tck = interpolate.splrep(x, y, s=0)\n", "xyeni = np.arange(0, 2*np.pi, np.pi/50)\n", "yyeni = interpolate.splev(xyeni, tck, der=0)\n", "\n", "# Grafik\n", "plt.figure()\n", "plt.plot(x, y, 'x', xyeni, yyeni, xyeni, np.sin(xyeni), x, y, 'b')\n", "plt.legend(['Dogrusal', 'Kubik Spline', 'Veri'])\n", "plt.axis([-0.05, 6.33, -1.05, 1.05])\n", "plt.title('Kubik Spline Interpolasyonu')\n", "plt.show()\n", "\n", "# Turevi\n", "yturev = interpolate.splev(xyeni, tck, der=1)\n", "plt.figure()\n", "plt.plot(xyeni, yturev, xyeni, np.cos(xyeni),'--')\n", "plt.legend(['Kubik Spline', 'Veri'])\n", "plt.axis([-0.05, 6.33, -1.05, 1.05])\n", "plt.title('Spline Ile Hesaplanan Turev')\n", "plt.show()\n", "\n", "# Integrali\n", "def integ(x, tck, constant=-1):\n", " x = np.atleast_1d(x)\n", " sonuc = np.zeros(x.shape, dtype=x.dtype)\n", " for n in range(len(sonuc)):\n", " sonuc[n] = interpolate.splint(0, x[n], tck)\n", " sonuc += constant\n", " return sonuc\n", "\n", "yint = integ(xyeni, tck)\n", "plt.figure()\n", "plt.plot(xyeni, yint, xyeni, -np.cos(xyeni), '--')\n", "plt.legend(['Kubik Spline', 'Veri'])\n", "plt.axis([-0.05, 6.33, -1.05, 1.05])\n", "plt.title('Spline Ile Hesaplanan Integral')\n", "plt.show()\n", "\n", "# Kokleri\n", "interpolate.sproot(tck)\n", "# array([3.1416])\n", "\n", "# sproot fonksiyonunun x = 0 kokunu bulamadigina dikkat ediniz!\n", "# bu koku bulabilmek icin spline'i daha genis bir aralik uzerinden\n", "# hesaplamaniz gerekir!\n", "x = np.linspace(-np.pi/4, 2.*np.pi + np.pi/4, 21)\n", "y = np.sin(x)\n", "tck = interpolate.splrep(x, y, s=0)\n", "interpolate.sproot(tck)\n", "# array([0., 3.1416])\n", "\n", "# Parametrik Spline\n", "t = np.arange(0, 1.1, .1)\n", "x = np.sin(2*np.pi*t)\n", "y = np.cos(2*np.pi*t)\n", "tck, u = interpolate.splprep([x, y], s=0)\n", "uyeni = np.arange(0, 1.01, 0.01)\n", "cikti = interpolate.splev(uyeni, tck)\n", "plt.figure()\n", "plt.plot(x, y, 'x', cikti[0], cikti[1], np.sin(2*np.pi*uyeni), \\\n", " np.cos(2*np.pi*uyeni), x, y, 'b')\n", "plt.legend(['Dogrusal', 'Kubik Spline', 'Veri'])\n", "plt.axis([-1.05, 1.05, -1.05, 1.05])\n", "plt.title('Parametrik Veri icin Spline')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Kaynaklar #\n", "\n", "* Data Reduction and Error Analysis for the Physical Sciences, 3rd ed., Philip R.Bevington & D. Keith Robinson, 2003, McGraw Hill Higher Education\n", "\n", "* [scipy.interpolate Dokümantasyonu](https://docs.scipy.org/doc/scipy/reference/interpolate.html)\n", "\n", "* Tanımlar için: [wikipedia Interpolasyon başlığı](https://en.wikipedia.org/wiki/Interpolation)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Başa Dön](#Bu-derste-neler-öğreneceksiniz?)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 2 }