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 = [email protected]
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

Benzer belgeler