A409 Astronomide Sayısal Çözümleme
Transkript
A409 Astronomide Sayısal Çözümleme
AST415 Astronomide Sayısal Çözümleme - I 2. Formüllerle Hesaplar, İnteraktif Kabuk Kullanımı, Yazım Kuralları Bu derste neler öğreneceksiniz? ✔ Formüllerle Hesaplar ✗ Dikey Atış Problemi ✗ Editör Kullanımı ✗ IDLE ✗ Terminalden Program Çalıştırma ✗ Değişken Kullanımı ✗ Değişken İsimlendirmeleri ✗ Yorum İfadeleri ✗ Metin ve Sayı Formatlama ✗ Matematiksel İfadeler ✗ Tam Sayı Bölmesi ✗ Aritmetik Operatörlerin Öncelik Sırası ✗ Standart Matematiksel Fonksiyonlar ✗ Modül Fonksiyonları ✗ Modül Çağırma ✗ Yuvarlama Hataları ✗ Değişken Türleri ve Dönüşümler ✔ IPython (Opsiyonel) ✔ Karmaşık Sayılar (Opsiyonel) Formüllerle Hesaplar Dikey Atış Problemi Newton Hareket Kanunları'ndan yararlanarak matematiksel ifadesini bulan bu problemin çözümü, yer çekimine zıt yönde atılan bir cismin düşey konumunun (y) zamana (t) bağlı olarak değişimini aşağdaki formülle verir y(t) = V0t – ½ gt2 Burada V0 cismin ilk hızını, g yerçekimi ivmesini y=0 konumu cismin t=0 anındaki konumunu göstermektedir. Topun tekrar başlangıç konumuna dönmesi için geçen süreyi hesaplamak üzere V0t – ½ gt2 = 0 → t (V0 – ½ gt) = 0 → t = 0 ve t = 2V0 / g olduğu düşünülecek olursa t Є [0, 2V0 / g] denebilir. Editör Kullanımı Yazacağımız programlar her zaman bu kadar küçük olmayacak ve interaktif kabuk da bize bu anlamda yeterli değil. Bu nedenle programlarımızı bir editör kullanarak yazmak isteyeceğiz. Word, Writer gibi metin editörleri “güzel” görünen metinler üretmek için yazılmışlardır bu nedenle yazdığınız metne format eklerler ve programcılık için kullanılamazlar. Ancak Notepad, Notepad++, vim, emacs, nano, pico gibi programlar genel olarak metin saklamak üzere saklanabilecekleri gibi programcılık için de kullanılabiilrler. Python ile birlikte gelen IDLE interaktif bir kabuğun yanı sıra programlarınızı yazıp saklayabilmeniz için de bir editör sağlar. IDLE çalıştırdığınız vakit ilk gelen ekran interaktif kabuktur. Biraz önce çalıştırdığınız ifadeyi IDLE kabuğuna da yazıp çalıştırmayı deneyebilirsiniz. Ya da File → New Windos (Ctrl + N) menü seçeneğinden editör opsiynunu çalıştırıp, programınızı yazıp, kaydettikten sonra, Run → Run Module (F5) seçeneği ile çalıştırabilir ve çıktısını yine kabukta görebilirsiniz. dikey_atis1.py kodu çalıştırılınca interaktif kabuğa yazılan program çıktısı Terminalden Program Çalıştırma Terminalde programınızı kaydettiğiniz dizine (UNIX'te cd, Windows'ta chdir ile) geçtikten sonra aşağıdaki şekilde de çalıştırabilirsiniz. Alıştırma 1: Şimdi aynı programı V0= 1 m/s , t = 0.1 saniye için çalıştırın! Değişken Kullanımı Programımızı V0 , t ve g'nin farklı değerleri için çalıştırmak istediğimizde oldukça fazla değişiklik yapmamız gerekecek. Değişkenler kulllanarak bu sorunu aşabiliriz. >>> >>> >>> >>> >>> >>> v0 = 5 t = 0.6 g = 9.81 y = v0 * t – 0.5 * g * t**2 print y 1.2342 Şimdi değişiklik yapmamız da çok kolay V0 = 1 m/s ve t = 0.1 s için alınan toplam yolu tekrar hesaplayalım. >>> >>> >>> >>> >>> ! v0 = 1 t = 0.1 y = v0 * t – 0.5 * g * t**2 print y 0.05095 g'yi tekrar yazmadığımıza ancak y'yi veren satıırı tekrar yazdığımıza dikkat ediniz! Değişken İsimlendirmeleri Değişkenleri isimlendirmek üzere (inglizce alfabe dışında karakter içermeyen) küçük (a-z) ve büyük (A-Z), rakamlardan (0-9) ve alt çizgi (– underscore) işaretinden faydalanabilirsiniz. Değişken isimleri rakamla başlayamaz! Bu şekilde verilmiş bir değişken ismi yazım (syntax) hatası verir. Python küçük harflerle büyük harfleri birbirinden ayırır (case sensitive). Yani “x” ile “X” aynı değildir! Kesin bir kural olmamakla birlikte değişkenler için küçük harf, sabitler (PI, PLANCK_SABITI gibi) için büyük harf kullanmak, kelimeleri “_” (alt çizgi) işaret ile birbirinden ayırmak; daha sonra göreceğiniz sınıf (class) isimlerinde ikinci kelimenin baş harfini büyük yapmak gibi genel Python alışkanlıkları olmakla birlikte bunları takip etmezseniz hata vermez. (Python'da kullanılan genel kod yazma stili alışkanlıkları için bkz: PEP 0008: Style Guide for Python, https://www.python.org/dev/peps/pep-0008/) Mümkün olduğunca açıklayıcı değişken isimleri kullanmak hem siz, hem de kodunuzu okuyanlar (diğer programcılar, BİZLER!) için iyidir. Örnek problemimizde v0 yerine ilk_hiz, t yerine zaman, y yerine dusey_konum, g yerine yercekimi_ivmesi kullanirsak daha aciklayici olur Python için saklı kelimeleri değişken ismi olarak kullanamazsınız (and, as, assert, break, class, continue, def, del, elif, else, except, False, finally, for, from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return, True, try, with, while, yield). Çok istiyorsanız sonua bir “_” işareti koymak işi çözer! Değişken İsimlendirmeleri Örnekler Bu derste yapılan en klasik hata değişken ismi olarak Türkçe karakter kullanmaktır. Yazdığınız kodlar bazen çalışmayacak, ancak bu bir değişkenin ismindeki Türkçe karakter nedeniyle değil ondan önceki bir hatanız nedeniyle olacak bazen. Ancak biz yine de kulllandığınız (ve bizim de yakaladığımız!) her Türkçe karakter için 2 puanınızı istikrarlı bir şekilde kıracağız! >>> başlangıç_hızı = 5 File "<stdin>", line 1 başlangıç_hızı = 5 ^ SyntaxError: invalid syntax >>> Aşağıdaki değişken isimlendirmelerinin doğruluğunu kontrol edelim 1a = 2 a1 = b x=2 y=X+4 pi = “3.14159” c = 4 ** 3 ** 2 ** 3 _ = ((c-78564)/c + 32)) indirim = 12% para = 120$ eposta = obasturk@ankara.edu.tr and = “ve” Degisken = x > 0 Yorum İfadeleri (Comments) Programlarınıza kendiniz ve kodunuzu okuyan başkaları (örn. BİZLER!) için yorum satırları koymanız çok yararlıdır. Bunun için tek yapmanız gereken Python tarafından çalıştırılmaması için ilgili ifadenin başına “#” işaretini koymanız! # havaya bir ilk hizla atilan cismin t anindaki # yuksekligini hesaplayan program v0 = 5 # ilk hiz g = 9.81 # yercekimi ivmesi t = 0.6 # zaman y = v0*t - 0.5*g*t**2 # dusey konum print y ! Zaten açıklayıcı bir degisken ismi kullandıysanız aynı kelimeleri kullanarak bir de yorum eklemeyin. Aynı şeyi iki kere yapmamak bir programcı alışkanlığıdır! Metin ve Sayı Formatlama printf fonksiyonalitesi Düşey atış problemi çözen basit programımızın çıktısını sadece alınan toplam yolu rakamsal olarak vermek yerine daha açıklayıcı bir şekilde; örneğin, “t = 0.6 saniyede cismin yuksekligi 1.23 metredir.” gibi bir cümleyle vermek isteyebiliriz. >>> print “t = %g saniyede cismin yuksekligi %.2f metredir” % (t,y) Birinci değişkenin değerinin reel (gerçel) bir sayının en kompakt hali şeklinde yazılması gerektiğini gösteren yer tutucu (placeholder) İkinci değişkenin değerinin reel (gerçel) bir sayının noktadan sonra iki basamak şeklinde yazılması gerektiğini gösteren yer tutucu (placeholder) Yerleri tutulan değişkenler İlk programımızın nihai hali aşağıdaki gibi oldu. Bu programı Ders2 örnek kodları arasında dikey_atis1.py ismindeki dosyada bulabilirsiniz! İndirip, tam olarak anladıktan sonra, çalıştırınız! # havaya bir ilk hizla atilan cismin t anindaki # yuksekligini hesaplayan program v0 = 5 # ilk hiz g = 9.81 # yercekimi ivmesi t = 0.6 # zaman y = v0*t - 0.5*g*t**2 # dusey konum print “t = %g saniyede cismin yuksekligi %.2f metredir” % (t,y) Aşağıda en sık kullanılan bazı “YER TUTUCULARI” görüyorsunuz: %s %d %0xd %f %e %E %g %G %% : : : : : : : : : Metin değişkenler için yer tutucu Tamsayı değişkenler için yer tutucu Önüne getirilen “0” rakamları ile birlikte x basamak yer kaplayacak tam sayı yer tutucusu Noktadan sonra 6 basamak kaplayacak şekilde yazılmak istenen noktalı sayı yer tutucusu Kompakt bilimsel gösterim yer tutucusu Kompakt bilimsel gösterim yer tutucusu (üssü belirtmek üzere e yerine E kullanılır) Reel bir sayı için olası en kompakt yazımı veren yer tutucu %g ile aynı sadece üs gerektiğinde belirtmek üzere e yerine E kullanılır yüzde (%) işaretini yazdırmak gerektiğinde kullanılır Örnekleri Ders2 kodları arasındaki printf_demo.py dosyasında bulunabilirsiniz. Bazı formatları denemek üzere ilk programımızı kullanalım. Bu programı Ders2 örnek kodları arasında dikey_atis2.py ismindeki dosyada bulabilirsiniz! Birden çok satır süren metinler için “”” işaretinin kullanıldığına dikkat ediniz. v0 = 5 g = 9.81 t = 0.6 y = v0*t - 0.5*g*t**2 print """ v0=%.3E m/s ilk hizla firlatilan cismin t=%f saniyedeki yuksekligi %.2f metredir. """ % (t, v0, y) Metin ve Sayı Formatlama str:format yöntemi Yine düşey atış problemi çözen basit programımızın çıktısını sadece alınan toplam yolu rakamsal olarak vermek yerine daha açıklayıcı bir şekilde; örneğin, “t = 0.6 saniyede cismin yuksekligi 1.23 metredir.” gibi bir cümleyle verelim. Ancak bu kez printf fonksiyonalitesi yerine str:format yöntemini kullanalım. >>> print “t = {0:g} saniyede cismin yuksekligi {1:.2f} metredir.”.format(t,y) Birinci değişkenin (0 konumunu göstermektedir) değerinin reel (gerçel) bir sayının en kompakt hali (g) şeklinde yazılması gerektiğini gösterir. İkinci değişkenin (1 konumunu göstermektedir) değerinin reel (gerçel) bir sayının noktadan sonra iki basamak (.2f) şeklinde yazılması gerektiğini gösterir. Yerleri tutulan değişkenler Bu yöntemle değişkenlerin konumlarını metin içinden bildirmek mümkün olduğu için, en sonda format fonksiyonunun içinde doğru sırada verilmesi de zorunlu olmaktan çıkar. >>> print “t = {1:g} saniyede cismin yuksekligi {0:.2f} metredir.”.format(t,y) Her iki komutla da aşağıdaki aynı sonucu elde edersiniz. t = 0.6 saniyede cismin yuksekligi 1.23 metredir. Bu yöntemde herhangi bir metni hizalamak için “-” ve “+” işaretleri yerine “<” ve “>” işaretleri kullanılır. Örnekleri Ders2 kodları arasındaki strformat_demo.py dosyasında bulunabilirsiniz. >>> '%-10s' % ('test') 'test ' >>> '{:<10s}'.format('test') 'test ' >>> '%10s' % ('test') ' test' >>> '{:>10s}'.format('test') ' test' # printf stili # str.format yontemi # printf stili # str.format yontemi Bu yöntemle eski printf yöntemine göre metin hizalama ve yazdırma üzerine daha çok kontrol sahibi olmak mümkün hale getirilmiştir. >>> '{:_<10s}'.format('test') 'test______' >>> '{:^10s}'.format('test') ' test ' >>> '{:06.2f}'.format(3.141592653589793) 003.14 >>> '{: d}'.format((- 23)) -23 >>> '{:+d}'.format(42) +42 >>> '{:=+8d}'.format((18)) '+ 18' Yer tutucular bu formatla isimlendirilebilir ve adlarıyla atıfta bulunularak kullanılabilir. >>> '{birinci} {ikinci}'.format(birinci='Ad', ikinci='Soyad') 'Ad Soyad' >>> '{birinci} {ikinci}'.format(ikinci='Ad', birinci='Soyad') 'Soyad Ad' Bu yöntemle ayrıca format parametreleri parametrik şekilde de kullanılabilir. >>> '{:{hiza}{genislik}}'.format('test', hiza='^', genislik='10') ' test ' >>> '{} = {:.{hassasiyet}f}'.format('Sayi ', 2.7182, hassasiyet=2) 'Sayi = 2.72' >>> '{:{genislik}.{hassasiyet}f}'.format(3.14159, genislik=8, hassasiyet=2) ' 3.14' >>> '{:{}{}{}.{}}'.format(2.7182818284, '>', '+', 10, 3) ' +2.72' >>> '{:{}{isaret}{}.{}}'.format(2.7182818284, '>', 10, 3, isaret='+') ' +2.72' Python'da Matematiksel İşlemler Python'da matematiksel işlemler, bu işlemlerde karşılaşılan bazı problemler ve işlem sırası gibi konuları santigrat derece – fahrenheit dönüşümü örneği üzerinden tartışalım. F = 9 / 5 * C + 32 Bu problemi C = 21° için basit bir Python koduyla çözmeye çalışalım. >>> C = 21 >>> F = (9/5)*C + 32 >>> print F 53 Hesap makinesi ile aynı hesabı yaptığmızda bulduğumuz sonuç oldukça farklıdır (69.8). Acaba sorun ne olabilir? Tam Sayı Bölmesi, Python'da Nesneler Problemin kaynağı tam sayı bölmesi ve sayıların Python'da saklanış şeklidir! 9/5=1 1 * 21 = 21 21 + 32 = 53! ✔ Python C = 21 ifadesiyle 21 bir tam sayı olduğu için bir tam sayı (int) nesnesi oluşturur ve bu nesnenin adı da C olarak belirlenmiş olur. Benzer şekilde C = 21.0 şeklinde bir atama yapılmış olsaydı bir noktalı sayı (float) nesnesi oluşturulmuş ve bu nesnenin adı C olarak belirlenmiş olacaktı. (21 ≠ 21.0) ✔ “Bir Python programı yazmak, nesneler oluşturmak ve bu nesnelerin değerlerini değiştirmektir” ✔ Bölme işlemi (/) her iki tarafta da birer tam sayı varsa, sonucu da tam sayı olarak verdiğinden sonuç beklediğimizden farklı çıktı. Tam Sayı Bölmesinden Kaçınmak, Python'da Değişken Türü Değişimleri Bunun pek çok yolu var ancak hepsinde temel olan şey bölme (/) işleminin en az bir tarafındaki sayıyı bir noktalı sayı (float) olmaya zorlayıp sonucun da bir noktalı sayı olmasını sağlamak üzerine kurulu. Bölme işleminde her iki tarafındaki sayılardan sadece biri noktalı olduğunda dahi sonuç noktalı bir sayıdır! >>> C = 21 >>> F = (9.0/5)*C + 32 >>> F = (9/5.)*C + 32 >>> F = float(9)/5*C + 32 >>> print F 69.80000000000001 Sonuç yine ilginç. Ancak bu sefer daha sonra değineceğimiz başka bir nedenle! Python'da Aritmetik Operatörlerin Öncelik Sırası Aslında matematikte olduğundan çok farklı değil. Üs işareti (**) 'nin çarpma (*) ve bölmeye (/) önceliği var. Sonra toplama (+) ve çıkarma (-) geliyor ve parantez içi ifadeler her zaman daha büyük öncelik taşıyor. Örnek 1. 5/9+2*3**4/2 5 / 9 = 0 → 3**4 = 81 → 2*81 = 162 → 162 / 2 = 81 → 0 + 81 = 81 Örnek 2. 5/(9+2)*3**(4/2) 5 / (9+2) = 0 → (4/2) = 2 → 3**2= 9 → 0*9= 0 Python'da Standart Matematik Fonksiyonların Kullanımı Düşey atış problemimizde cismin t anındaki yüksekliği (y) yerine, herhangi bir yüksekliğe ne kadar zamanda çıkacağını bulmak için y(t) = V0t – ½ gt2 ½ gt2 – V0t + y = 0 İkinci derece denklemini çözmemiz gerekir. Bu denklemini çözümü bize; t1,2 =(V0 +/- (V02 – 2gy))/2) / g sonucunu verir (iki sonuç vardır zira cisim bu yüksekliğe biri yükselirken, diğeri inerken olmak üzere iki kez ulaşır!). Bu işlemi Python ile gerçekleştirmek için karekök (sqrt) fonksiyonuna ihtiyaç duyacağımız açıktır. Modül Fonksiyonlarının Kullanımı Karekök gibi trigonometrik, logaritmik, üstel, hiperbolik fonksiyonların da aralarında bulunduğu pek çok matematiksel ifadenin nasıl hesaplanacağı uzun yıllar sonucunda oluşturulmuş algoritmalarla saptanmış ve pek çok programcı bu algoritmalara dayanan fonksiyonlar hazırlamışlardır. Python'da modül benzer nitelikte işler yapan fonksiyonların bir araya toplandığı programlara denir. Örneğin math modülünde pek çok matemtaik fonksiyonu bulunmaktadır. astropy modülünde ise astronomi hesapları için gerekli (Julyen günü dönüşümü, ufuk yüksekliği hesabı gibi...) pek çok fonksiyon bulunur. Bir modüldeki fonksiyonları kullanabilmek için öncelikle onu çağırmak (import etmek) gereklidir. Bu işlem en basit şekliyle import modul_adi ifadesiyle yapılır. Daha sonra bu modüldeki fonksiyon (örneğin karekök fonksiyonu sqrt) modul_adi.fonksiyon(arguman) şeklinde kullanılır. (örneğin math.sqrt(5) math modülünden karekök fonskiyonunu çağırır ve karekök 5 değerini hesaplar!) Modül Fonksiyonlarının Kullanımı Düşey atış problemimizde bir ilk hızla yukarı doğru atılan bir cismin herhangi bir yükseklikten hangi zamanlarda geçtğini bulmak için aşağıdaki şekilde bir Python kodu yazmamız gerekir. (dikey_atis3.py) v0 = 5 g = 9.81 yc = 0.2 import math t1 = (v0 - math.sqrt(v0**2 - 2*g*yc))/g t2 = (v0 + math.sqrt(v0**2 - 2*g*yc))/g print 't={:g} saniye ve {:g} saniyede cismin yuksekligi {:g} metredir'.format(t1, t2, yc) Modül Çağırma ve Modül Fonksiyonu Kullanma Yöntemleri import modul_adi yazımının yanı sıra başka modül çağırma şekilleri de vardır. En sık kullanılan modül çağırma şekillerinden biri from modul_adi import fonksiyon_adi1,fonksiyon_adi2, ... >>> from math import sqrt,sin,exp,log,e,sin,pi >>> print sqrt(2) 1.41421356237 >>> print “sin (90) = {:g}”.format(sin(0.5*pi)) sin(90) = 1 >>> print “ln(e^2) = {:g}”.format(log(e**2,e)) ln(e^2) = 2 >>> print “e^5 = {:g}”.format(exp(5)) E^5 = 148.413159103 >>> print log(sin(pi/2.),10) 0.0 Bu şekilde bir modüldeki tüm fonksiyonları from modul_adi import * ifadesiyle de çağrımak mümkündür. From modül_adi import … yazımının sakıncası fonksiyonun adını doğrudan kullanmaktan gelir. Python'un büyük bir gücü olan pek çok programcı / bili minsanı tarafından modüllerin yazılıyor olması burada bir dezavantaja dönüşüyor. Zira farklı modüllerde aynı isimle ve farklı işler yapan ya da bir şekilde farklı davranan fonksiyonlar olabiliyor. Kodun içerisinden her iki modülün birden çağrılması bu durumda problem haline gelebiliyor. Probleme biraz yakından bakalım: - import math ifadesi math modülü fonksiyonlarını math alanına (namespace) indirir. Bu nedenle o alandaki bir fonksiyonu çağırmak istediğinizde alanın adını kullanmanız gerekir: math.sqrt(x) gibi.. - from math import * ifadesi modülündeki tüm fonksiyonları (ya da * yerine fonksiyonun adını yazarsanız o fonksiyonu) sizin kullandığınız alana (namespace) indirir. Bu alanı siz kullanıyor olduğunuz için fonksiyon çağırırken sadece adını kullanırsınız: sqrt(x) gibi... - Aslında burada “pythonik” bir yol tam olarak tanımlı değildir. Bazen birini bazen diğerini kullanırsınız (ikinci uzun kodlarda değil de kabukta küçük işlevsel betikler (script) yazarken daha çok tercih edilir. - İyi bir çözüm: import math as mt ya da from math import log as ln gibi ifadelerle lakap kullanmaktır. Bu durum, fonksiyonların indiği alana kısa ve kendinizin (ve iç dokümantasyon tutuyorsanız kodunuzu okuyan kişinin) bildiği bir isim verdiğiniz için kullanım kolaylığı getirir. >>> import math as m >>> yaricap = 10 >>> cevre = 2*m.pi*yaricap >>> alan = m.pi*yaricap**2 >>> print “Yaricapi {:d} olan cemberin cevresi {:g}”.format(yaricap,cevre) Yaricapi 10 olan cemberin cevresi 62.8319 >>> print “Alani ise {:g} 'dir”.format(alan) Alani ise 314.159 'dir Yuvarlama Hataları I / II Matematiksel olarak sinüs hiperbolik fonksiyonu (sin h) sinh(x) = 1 / 2 (ex – e-x) şeklinde tanımlanır. Şimdi x = 2π için sinh(x) farklı şekillerde hesaplayalım >>> from math import sinh, exp, e, pi >>> x = 2*pi >>> r1 = sinh(x) >>> r2 = 0.5*(exp(x) - exp(-x)) >>> r3 = 0.5*(e**x - e**(-x)) >>> print r1, r2, r3 267.744894041 267.744894041 267.744894041 >>> print “{:.16f} {:.16f} {:.16f}”.format(r1,r2,r3) 267.7448940410164369 267.7448940410164369 267.7448940410163232 İşte bu ilginç! Matematiksel olarak eşit olduğunu bildiğimiz üç ifadeden sonuncusu 12. basamaktan sonra diğerlerinden farklılaşan bir sonuç verdi! Yuvarlama Hataları II / II Bir başka örneğe bakalım. Aşağıdaki iki ifadenin aynı sonucu vermesi gerek: 1 / 49. * 49. = 1 / 51. * 51 = 1.0000000000000000 >>> 1./49.*49. 0.9999999999999999 >>> 1./51.*51. 1.0 Problem reel sayıların bilgisayarlarca saklanma ve gösterilme şeklinden kaynaklanmaktadır. AST416 dersinde ayrıntılı bir şekilde görebileceğniz gibi bilgisayarlar sınırlı (genellikle 16) sayıda basamakla reel sayıları saklarlar. Oysa 1/49'u tam olarak ifade etmek için SONSUZ sayıda basamağa ihtiyacınız vardır. Problemimizde 1/49. tam olarak saklanamıyor ve sonuç 1'den farklı çıkıyor. Aslında durum 1/51. için de aynı ama çıkan sayıyı 51. ile tekrar çarptığımızda yine 1'e ulaşıyoruz. Yani hata final değere kadar yayılmıyor! Değişken Türleri (type) ve Dönüşümler Daha önce bir değişken tanımladığımızda adı değişkenin adı, türü değişkene verdiğimiz değerle belirlenen bir nesne oluşturulduğunu görmüştük. >>> C = 21 >>> type(C) <type 'int'> >>> t = 0.2 >>> type(t) <type 'float'> >>> s = “Python ogreniyorum!” >>> type(s) <type 'str'> Bu değişken türleri arasında dönüşümler yapabiliriz. Bu amaçla int(x), (tam sayıya dönüştürme), float(x) (noktalı sayıya dönüştürme), str(x) (metne dönüştürme) gibi fonksiyonlar kullanılır. >>> C = float(C) >>> D 21.0 >>> T = int(t) >>> T 0 >>> t2 = 0.6 >>> print int(t2) 0 >>> t3 = -1.7 >>> print int(t3) -1 # noktadan sonraki basamaklar atildi # bu bir yuvarlama islemi degil kesip atma # durum negatif sayilar icin de ayni IPython IPython tıpkı standart Python kabuğu ya da IDLE'ın sağladığı Python kabuğu gibi bir interaktif kabuktur. Mecbur bırakmaszsak çoğunuzun kullanmayacağını bildğimiz halde ve buna rağmen IPython kullanmanızı şiddetle tavsiye ediyoruz. Zira kullanımı çok kolay ve pek çok avantajla birlikte geliyor! Öncelikle IPython'ı (ipython.org) kurmanız gerekiyor. Anaconda ile Windows'a Python kuranların yapması gereken bir şey yok, çünkü IPython hazır geliyor. UNIX kullanıcıları için de iş son derece kolay! Avantaj 1: İşletim sisteml komutlarını Python'un os modülünü indirmeden, kolaylıkla kullanabilirsiniz. >>> cd ~/Desktop File "<stdin>", line 1 cd ~/Desktop ^ SyntaxError: invalid syntax # Standart kabukta yazim hatasi! In [1]: cd ~/ Desktop /home/ozbasturk/Desktop # Kabugun isaretine dikkat! # >>> degil ln[1] ! Aynı şeyi standart kabukta (ya da IDLE kabuğunda) yapmak için >>> import os >>> os.chdir(“/home/ozbasturk/Desktop”) >>> os.getcwd() '/home/ozbasturk/Desktop' IPython Avantaj 2: TAB 'la tamamlama özelliğinden faydalanabilirsiniz. In [2]: uzun_bir_degisken_adi_bir = 4 In [3]: uzun_bir_degisken_adi_iki = 5 In [4]: uz <TAB> # eger “uz” ile baslayan birden cok # degiskeniniz varsa ikinci <TAB> # olasi tum secenekleri ekrana doker uzun_bir_degisken_adi_bir uzun_bir_degisken_adi_iki In [4]: uzun_bir_degisken_adi # Ikisinde ortak olan karakter # dizisi ekrana gelir ve # sizden tamamlamanizi bekler In [4]: uzun_bir_degisken_adi_bir Out[4]: 4 Avantaj 3: Önceki komutların çıktılarını kullanabilirsiniz. Bir önceki komuta _i1 (_), iki öncekine _i2 (__), üç öncekine _i3 (___), … şeklinde ulaşabilirsiniz. In [5]: In [6]: Out[6]: In [7]: Out[7]: In [8]: Out[8]: In [8]: Out[8]: C = 21 (9./5.)*C + 32 69.80000000000001 (_ - 32)*(5./9.) 21.000000000000007 int(__) 69 int(__) 21 # Neden 21 cikmadi? Python'da Karmaşık Sayılar ✔ Çok iyi bildiğiniz üzere karmaşık sayılar i = √-1 olmak üzere, a +/- ib şeklinde ifade edilirler. ✔ u = a +/- ib ve v = c +/- id olmak üzere, u = v => (a = b) ve (c = d) ● - u = -a – ib ● u* = a + ib (kompleks eşlenik) ● u + v = (a + c) + (b + d)i ● u - v = (a - c) + (b – d)i ● uv = (ac − bd) + (bc + ad)i ● u/v = (ac + bd) / (c2 + d2) + (bc − ad) / (c2 + d2) ● |u| = √ (a2 + b2) ● eiq = cos q + i sin q ● Python'da Karmaşık Sayılar >>> u = 2.5 + 3j >>> v = 2 >>> w = u + v >>> w (4.5 + 3j) # python'da karmasik sayilar i yerine j ile yazilir # bu bir tam sayi # karmasik sayi + tam sayi >>> a = -2 >>> b = 0.5 >>> s = a + b*1j >>> s = complex(a,b) >>> s (-2+0.5j) # karmasik sayi olustur. Dikkat j degil 1j # bu sekilde de karmasik sayi olusturulabilir >>> s*w # iki karmasik sayinin carpimi (-10.5-3.75j) >>> s/w # iki karmasik sayinin bolumu (-0.2564102564102564+0.28205128205128205j) >>> s.real -2.0 >>> s.imag 0.5 >>> s.conjugate() (-2-0.5j) # karmasik sayinin reel kismini verir # karmasik sayinin imajiner kismini verir # karmasik sayinin kompleks eslenigini verir Python'da Karmaşık Sayılar >>> u = 2.5 + 3j >>> v = 2 >>> w = u + v >>> w (4.5 + 3j) # python'da karmasik sayilar i yerine j ile yazilir # bu bir tam sayi # karmasik sayi + tam sayi >>> a = -2 >>> b = 0.5 >>> s = a + b*1j >>> s = complex(a,b) >>> s (-2+0.5j) # karmasik sayi olustur. Dikkat j degil 1j # bu sekilde de karmasik sayi olusturulabilir >>> s*w # iki karmasik sayinin carpimi (-10.5-3.75j) >>> s/w # iki karmasik sayinin bolumu (-0.2564102564102564+0.28205128205128205j) >>> s.real -2.0 >>> s.imag 0.5 >>> s.conjugate() (-2-0.5j) # karmasik sayinin reel kismini verir # karmasik sayinin imajiner kismini verir # karmasik sayinin kompleks eslenigini verir Python'da Karmaşık Sayılar cmath Modülü Fonksiyonları >>> from math import sin >>> r = sin(w) # math modulundeki sinus karmasik sayilarla calismas Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't convert complex to float >>> from cmath import sin,sinh >>> r1 = sin(8j) >>> r1 1490.4788257895502j >>> r2 = 1j * sinh(8) >>> r2 1490.4788257895502j >>> from cmath import exp,cos,sin,pi >>> q = 8 # rastgele secilmis bir sayi >>> exp(1j*q) # e^iq (-0.14550003380861354+0.9893582466233818j) >>> cos(q) + 1j*sin(q) (-0.14550003380861354+0.9893582466233818j) >>> exp(pi*1j) # Euler esitligi (-1+1.2246063538223773e-16j) # Neden -1 degil? Python'da Karmaşık Sayılar ve Reel Sayıların Birlikte Kullanımı numpy.lib.scimath Fonksiyonları >>> from math import sqrt >>> sqrt(4) # 4'un karekoku reel sayidir 2.0 >>> sqrt(-1) # hata vermesini bekleriz Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: math domain error >>> from cmath import sqrt >>> sqrt(4) # 4'un karekoku reel sayi ama karmasik sekilde yazilabilir (2+0j) >>> sqrt(-1) # sonucun bu kez dogru cikmasini bekliyoruz 1j >>> from numpy.lib.scimath import sqrt >>> sqrt(4) # Bu modul sonuc reelse reel, karmasiksa karmasik verir 2.0 >>> sqrt(-1) 1j Örnek: 2. Dereceden Denklem Çözümü Aşağıdaki ikinci dereceden denklemi a, b, c'nin farklı değerli için çözmek isitiyor olalım. ax2 + bx + c = 0 from numpy.lib.scimath import sqrt a = 1; b = 2; c = 100 # polinom katsayilari r1 = (-b + sqrt(b**2 - 4*a*c))/(2*a) r2 = (-b - sqrt(b**2 – 4*a*c))/(2*a) print r1 print r2 a = 1; b = 4; c = 1 # polinom katsayilarini degistirelim r1 = (-b + sqrt(b**2 - 4*a*c))/(2*a) r2 = (-b - sqrt(b**2 – 4*a*c))/(2*a) print r1 print r2 >>> (-1+9.94987437107j) (-1-9.94987437107j) -0.267949192431 -3.73205080757 >>> # sonuc karmasik cikinca karmasik gosterim # sonuc reel cikinca reel gosterim Ödev 2 Teslim Tarihi: 14 Ekim 2016 Cuma 16:00 Aşağıdaki işlemleri yapan birer Python programi yaziniz ve parantez içinde verilen isimlerle kaydedip, Ekrem Murat Esmer'e tek bir e-posta ile gönderiniz. 1.2 + 3 işlemini yapan ve sonucunu ekrana yazdıran bir program yazınız (ad_soyad_ogrno_odev2a_2arti3.py). 2. p bir banka tarafından kredilere uygulanan 1 yıllık faiz olsun. (yüzde cinsinden örn. 0.01 = %1). Kredi olarak alınan “A” kadar bir miktar “n” senenin sonunda A*( 1 + p)n formülüyle verilen miktara ulaşır. Bu hesabı yapan bir Python programı yazarak, A = 10000 TL kredinin, p = %2.8 faiz oranı ile n = 2 yıl sonunda geri ödemesinin ne kadar olacağını hesaplayınız. (ad_soyad_ogrno_odev2b_kredi.py). 3.Hava direnci nedeniyle bir cisme uygulanan kuvvet ile verilir. Burada ρ, havanın yoğunluğunu, V cismin hızını, A cismin hız vektörüne dik kesit alanını, C D ise sürtünme katsayısını göstermektedir. Havanın yoğunluğunu (ρ) 1.2 kg / m 3 , mükemmel bir küre olarak düşünebileceğiniz cismin yarıçapını r = 11 cm, cismin hızını 50 km/saat ve sürtünme katsayısını (C D) 0.2 alarak cisme hava direnci tarafından uygulanan kuvveti hesaplayınız. Cismin kütlesini 0.43 kg farzetseniz, g = 9.81 m / s2 olan bir yerde cisme yer çekimi tarafından uygulanan kuvveti (F g = mg) de hesaplayarak bulduğunuz hava direnci ile karşılaştırınız. Hesaplarınızı yaparken uygun birimler kullanmaya dikkat ediniz! (ad_soyad_ogrno_odev2c_havadirenci.py). 4. Aşağıdaki bir Python programı yer almaktadır. Bu programın neden çalışmadığını bulduktan sonra, çalışır ve C’yi aynı formülle hesaplayıp ekrana yazar hale getiriniz (ad_soyad_ogrno_odev2d.py) C = A + B A = 3 B = 2 print C