AST409 Astronomide Sayısal Çözümleme VI. Python ve Türev
scipy.misc.derivative fonksiyonu Bu fonksiyon, verilen türevlenebilir bir fonksiyonun herhangi bir noktadaki n. türevini merkezi türev ifadesini kullanarak alır. Örnek1 : def f(x): return x**3 + x**2 x = 1.0 turev_x = misc.derivative(f, x, dx = 1e-6) turev_x_gercek = 3*x**2 + 2*x bagil_hata = abs((turev_x_gercek - turev_x)/turev_x_gercek) print "x^3 + x^2 fonksiyonunun x = %.2f noktasindaki turevi %.12f" % \ (x,turev_x) print "Turevin bu noktadaki gercek degeri %.2f ve yapilan bagil hata %.12f" % \ (turev_x_gercek,bagil_hata) Kodun ekran çıktısı: x^3 + x^2 fonksiyonunun x = 1.00 noktasindaki turevi 4.999999999922 Turevin bu noktadaki gercek degeri 5.00 ve yapilan bagil hata 0.000000000016
scipy.misc.derivative fonksiyonu Bir önceki örneğimiz için ikinci türevi hesap edelim Örnek 2 : # ayni fonksiyonun ikinci turevini alalim turev_2_x = misc.derivative(f, x, dx = 1e-6, n = 2) turev_2_x_gercek = 6 * x + 2 bagil_hata_2 = abs((turev_2_x_gercek - turev_2_x)/turev_2_x_gercek) print "x^3 + x^2 fonksiyonunun x = %.2f noktasindaki ikinci turevi %.12f" % \ (x,turev_2_x) print "Ikinci bu noktadaki gercek degeri %.2f ve yapilan bagil hata %.12f" % \ (turev_2_x_gercek, bagil_hata_2) Kodun ekran çıktısı: x^3 + x^2 fonksiyonunun x = 1.00 noktasindaki ikinci turevi 7.999378937029 Ikinci bu noktadaki gercek degeri 8.00 ve yapilan bagil hata 0.000077632871
SymPy fonksiyonları ile sembolik türev Problem “yeterince” basitse sembolik türev de yeterli olabilmektedir. SymPy paketi fonksiyon ve metotlarını kullanmak bu anlamda etkin bir çözümdür. Örnek 3: import numpy as np import sympy as sym x = sym.Symbol('x') y = x**2 + 1 turev_y = y.diff(x) print "%s 'in turevi %s 'tir." % (y,turev_y) Kodun ekran çıktısı: x**2 + 1 'in turevi 2*x 'tir. Örnek 4: y1 = sym.diff(sym.sin(x), x) print "sin(x) fonksiyonunun turevi %s 'tir" % y1 y2 = sym.diff(sym.sin(2*x),x) print "sin(2x) fonksiyonunun turevi %s 'tir" % y2 y3 = sym.diff(sym.tan(x), x) print "tan(x) fonksiyonunun turevi %s 'tir" % y3 Kodun ekran çıktısı: sin(x) fonksiyonunun turevi cos(x) 'tir sin(2x) fonksiyonunun turevi 2*cos(2*x) 'tir tan(x) fonksiyonunun turevi tan(x)**2 + 1 'tir
SymPy fonksiyonları ile yapılabilecek diğer işlemler SymPy paketi başka matematiksel işlemleri de sembolik olarak yapabilmek üzere pek çok olanak sağlar. Örnek 5: import math as math a = sym.Rational(1,2) print a print "a^2 = %s, 2*a = %s, sin(a) = %s" % (a**2, 2*a, math.sin(a)) Kodun ekran çıktısı: 1/2 a^2 = 1/4, 2*a = 1, sin(a) = 0.479425538604 # evalf -evaluate as function- fonskiyonu sembol olarak yazilan bir ifadenin # sayisal karsiligini verir print sym.pi**2 print "Sayisal olrak %.6f 'e esittir" % (sym.pi**2).evalf() pi**2 Sayisal olrak 9.869604 'e esittir # bir diger ornek print "pi + e^2 = %.8f" % (sym.pi+sym.exp(2)).evalf() pi + e^2 = 10.53064875
SymPy fonksiyonları ile yapılabilecek diğer işlemler Örnek 7: # integral almak icin kullanabiliriz print "6x^5 fonksiyonunun integrali %s" % sym.integrate(6*x**5, x) # belirli integralleri almak icin de kullanabiliriz print "x^3 fonksiyonunun x=-1 ile x=1 arasindaki integrali %s" %\ sym.integrate(x**3, (x, -1, 1)) # bir diger ornek print "cos(x)'in x=-pi/2 ile x=pi/2 arasindaki integrali %s" %\ sym.integrate(sym.cos(x), (x, -1*sym.pi/2, sym.pi/2)) Kodun ekran çıktısı: 6x^5 fonksiyonunun integrali x**6 x^3 fonksiyonunun x=-1 ile x=1 arasindaki integrali 0 cos(x)'in x=-pi/2 ile x=pi/2 arasindaki integrali 2 # verilen bir fonksiyonu Taylor serisine acabiliriz print "cos(x) fonksiyonunun McLaurin serisine acilimi ", \ sym.series(sym.cos(x), x) print "cos(x) fonksiyonunun x=1 civarinda Taylor serisine acilimi ", \ sym.series(sym.cos(x), x, 1) cos(x) fonksiyonunun McLaurin serisine acilimi 1 - x**2/2 + x**4/24 + O(x**6) cos(x) fonksiyonunun x=1 civarinda Taylor serisine acilimi cos(1) - x*sin(1) - x**2*cos(1)/2 + x**3*sin(1)/6 + x**4*cos(1)/24 - x**5*sin(1)/120 + O(x**6)
SymPy fonksiyonları ile yapılabilecek diğer işlemler Örnek 8: # # denklem cozmek icin kullanabiliriz print "x^4 - 1 = 0 denkleminin cozumu ", sym.solve(x**4 - 1, x) # birden fazla bilinmeyen iceren bir denklem takimini da cozebiliriz print "x + 5y = 2 ve -3x + 6y = 15 denklemlerinin cozumu" print sym.solve([x + 5*y - 2, -3*x + 6*y - 15], [x, y]) Kodun ekran çıktısı: x^4 - 1 = 0 denkleminin cozumu [-1, 1, -I, I] x + 5y = 2 ve -3x + 6y = 15 denklemlerinin cozumu: {x: -3, y: 1} # bazi komplike denklemlerin -bazi limitleri olmakla birlikte- cozumu vardir print "e^x + 1 = 0 denkleminin cozumu ", sym.solve(sym.exp(x) + 1,x)
SymPy fonksiyonları ile lineer cebir Örnek 9: # ornegin matris gosterimini kullanabiliriz x = sym.Symbol('x') y = sym.Symbol('y') A = sym.Matrix([[1,x], [y,1]]) print A # simdi bu matrisini karesini alalim print A**2 Kodun ekran çıktısı: Matrix([[1, x], [y, 1]]) Matrix([[x*y + 1, 2*x], [2*y, x*y + 1]]) # birden fazla matrisi carpabiliriz B = sym.Matrix([[x,x], [y,-1]]) C = sym.Matrix([[1,0], [0,1]]) print sym.MatMul(A, B, C) print A*B*C Matrix([ [1, x], [y, 1]])*Matrix([ [x, x], [y, -1]])*Matrix([ [1, 0], [0, 1]]) Matrix([[x*y + x, 0], [x*y + y, x*y - 1]])
Ödev 6 Teslim Tarihi: 26 Aralık 2014 Soru: a) Aşağıdaki fonksiyonları bir python fonksiyonu şeklinde yazdıktan sonra 1. ve 2. türevlerini scipy.misc.derivative fonksiyonunu kullanarak verilen x ve dx değerleri için hesaplayınız. b) Bu fonksiyonların türevlerini (ister SymPy fonksiyonlarını kullanarak isterseniz elinizle) analitik olarak aldıktan sonra gerçek değerlerini verilen x değerleri için hesaplayınız. c) scipy.misc.derivative fonksiyonu ile hesapladığınız değerlerin bağıl hatasını bulduğunuz gerçek değeri de kullanarak türetiniz. 3xex – 2ex , x = 1, dx = 0.01 e-x * cos (2πx), x = π / 2, dx = π / 32 -0.1 x4 – 0.15 x3 – 0.5 x2 – 0.25 x + 0.12 , x = 0.5, dx = 0.25 Bonus (10’ar puan): sinx / x, x1 = π / 2, x2 = 0, dx = π / 64 (Eğer hata verirse hata kodunun ne demek istediğini anlamaya çalışınız. Anladığınızı koda yorum satırı olarak ekleyiniz) log2 ( x2 – 2x + 1), x = 5, dx = 0.1