Skip to content

Commit f73a831

Browse files
committed
Added Bisection Method
1 parent cf23514 commit f73a831

File tree

3 files changed

+119
-0
lines changed

3 files changed

+119
-0
lines changed

Bisection-Method/README.md

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# İkiye Bölme Yöntemi (Bisection Method)
2+
3+
## Teori
4+
5+
İkiye Bölme Yöntemi, sürekli bir fonksiyonun köklerini bulmak için kullanılan sayısal bir yöntemdir. Özellikle analitik olarak çözülmesi zor olan fonksiyonlar için yararlıdır. Yöntem, kökün bulunduğu aralığı yeterince küçük olana kadar daraltarak çalışır.
6+
7+
<img src="./image.png" width="200px"/>
8+
9+
### Süreç
10+
11+
1. **Başlangıç Aralığı Seçimi**: Fonksiyonun işaret değiştirdiği bir `[a, b]` aralığı ile başlayın (yani, `f(a) * f(b) < 0`). Bu, aralıkta en az bir kök olduğunu gösterir.
12+
2. **Orta Nokta Hesaplama**: Aralığın orta noktasını hesaplayın, `m = (a + b) / 2`.
13+
3. **Kök Kontrolü**: Eğer `f(m) == 0` ise, `m` fonksiyonun bir köküdür.
14+
4. **Aralığı İkiye Bölme**: Eğer `f(m)` sıfır değilse, işaret değişiminin gerçekleştiği alt aralığı belirleyin. Bu, `[a, m]` veya `[m, b]` olacaktır, `f(a) * f(m)` ve `f(b) * f(m)`'in işaretlerine bağlı olarak.
15+
5. **Tekrar Et**: Aralık boyutu önceden belirlenmiş bir tolerans seviyesi, `tol`'dan küçük olana kadar adım 2-4'ü yeni alt aralıkla tekrarlayın.
16+
17+
### Formüller
18+
19+
- **Orta Nokta**: \( m = \frac{a + b}{2} \)
20+
- **Fonksiyon Değerlendirmesi**: \( f(m) \)
21+
- **Aralık Güncellemesi**:
22+
- Eğer f(a) . f(m) < 0 ise, yeni aralık `[a, m]` olur.
23+
- Eğer f(b) . f(m) < 0 ise, yeni aralık `[m, b]` olur.
24+
25+
## Python Kodu Açıklaması
26+
27+
```python
28+
def bisection_method(f, a, b, tol):
29+
# Yöntemin uygulanabilir olup olmadığını kontrol eder
30+
if f(a) * f(b) >= 0:
31+
print("İkiye bölme yöntemi başarısız oldu.")
32+
return None
33+
34+
# Ana döngü: Aralık, toleranstan küçük olana kadar tekrar eder
35+
while (b - a) / 2.0 > tol:
36+
orta_nokta = (a + b) / 2.0 # Orta noktayı hesaplar
37+
if f(orta_nokta) == 0:
38+
return orta_nokta # Eğer orta nokta kök ise
39+
elif f(a) * f(orta_nokta) < 0: # Yeni aralığı belirler
40+
b = orta_nokta
41+
else:
42+
a = orta_nokta
43+
44+
return (a + b) / 2.0 # Kökün yaklaşık değerini döndürür
45+
46+
```
47+
48+
#### bisection_method Fonksiyonu
49+
50+
Bu, yarıya bölme yöntemini uygulayan ana fonksiyondur.
51+
52+
#### Parametreler:
53+
54+
- `f`: Kökü bulunacak fonksiyon.
55+
- `a`, `b`: Başlangıç aralığı uç noktaları.
56+
- `tol`: Kök yaklaşımı için tolerans.
57+
58+
#### Aralık Kontrolü
59+
60+
İlk olarak, fonksiyon `f(a)` ve `f(b)`'nin zıt işaretlere sahip olup olmadığını kontrol eder, bu yöntemin çalışması için gereklidir.
61+
62+
#### Döngü
63+
64+
Fonksiyon, aralık boyutu `tol`dan küçük olana kadar bir döngüye girer.
65+
66+
#### Orta Nokta ve Değerlendirme
67+
68+
Her yinelemede, orta nokta hesaplanır ve değerlendirilir. Eğer orta nokta kök ise, döndürülür.
69+
70+
#### Aralık Güncelleme
71+
72+
`f`'nin orta noktadaki işaretine bağlı olarak, aralık ya `[a, midpoint]` ya da `[midpoint, b]` olarak güncellenir.
73+
74+
#### Dönüş
75+
76+
Aralık yeterince küçük olduğunda, fonksiyon orta noktayı yaklaşık kök olarak döndürür.

Bisection-Method/image.png

39.3 KB
Loading

Bisection-Method/main.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
def bisection_method(f, a, b, tol=1e-6):
2+
"""
3+
Bir fonksiyonun [a, b] aralığında kökünü ikiye bölme yöntemiyle bulur.
4+
5+
:param f: Kökünü bulmaya çalıştığımız fonksiyon.
6+
:param a: Aralığın başlangıcı.
7+
:param b: Aralığın sonu.
8+
:param tol: Tolerans; işlem, aralık tol'dan küçük olduğunda durdurulur.
9+
:return: Fonksiyonun kökü (veya kökün bir yaklaşımı).
10+
:n_iter: İterasyon sayısı.
11+
"""
12+
global n_iter
13+
14+
n_iter = 0
15+
if f(a) * f(b) >= 0:
16+
print("ikiye bölme yöntemi başarısız oldu.")
17+
return None
18+
19+
while (b - a) / 2.0 > tol:
20+
n_iter += 1
21+
midpoint = (a + b) / 2.0
22+
if f(midpoint) == 0:
23+
return midpoint # Tam kök bulundu.
24+
elif f(a) * f(midpoint) < 0: # Kök sol yarıda yer alıyor.
25+
b = midpoint
26+
else: # Kök sağ yarıda yer alıyor.
27+
a = midpoint
28+
29+
return (a + b) / 2.0
30+
31+
32+
# Örnek kullanım
33+
if __name__ == "__main__":
34+
# Köklerini bulacağımız bir fonksiyon tanımlayın.
35+
func = lambda x: x**3 - 2 * x - 5
36+
37+
# Bir kökün olduğundan şüphelendiğimiz [a, b] aralığı ve tolerans
38+
a, b, tol = 2, 3, 1e-6
39+
40+
# Kökü bul ve yazdır.
41+
root = bisection_method(func, a, b, tol)
42+
if root is not None:
43+
print(f"{n_iter}'inci iterasyon Kök yaklaşık olarak burada: {root}")

0 commit comments

Comments
 (0)