Tamsayı Haritası Örneği: Collatz Dizisi
Genel Bakış
Bu örnek, tamsayı durum değişkeni kullanan bir harita (map) simülasyonunun nasıl oluşturulacağını gösterir. Dokümantasyonun diğer bölümlerinde gösterilen kayan noktalı (floating-point) aritmetiğe dayalı lojistik harita örneklerinin aksine, bu model Collatz yinelemesini tamsayılar üzerinde gerçekleştirerek, tamsayı aritmetiğinin kullanımını sergiler.
Öne Çıkan Kavramlar
- Ayrık Zamanlı Simülasyon (
map): Durumun her adımda bir kez güncellendiği ve sürekli zaman kavramının olmadığı ayrık zamanlı bir simülasyon türüdür. - Tamsayı Veri Tipi (
int64): Collatz dizisinin elemanlarının tam olarak hesaplanmasını sağlayarak, önceden bilinen referans diziyle karşılaştırma yapılmasına olanak tanır. assertile Doğrulama:numpy.testing.assert_array_equalfonksiyonu kullanılarak, simülasyon sonucu elde edilen yörüngenin, beklenen 1-4-2-1 döngüsüyle biten diziyle birebir aynı olup olmadığı kontrol edilir.- Seri Grafiği: Tamsayı yörüngesi görselleştirilerek, dizinin ne zaman 4-2-1 döngüsüne yakınsadığı gösterilir.
Collatz Konjektür Modelinin Tanımlanması
Model, başlangıç değeri 27 olan n adında tek bir tamsayı durum değişkeni ile tanımlanmıştır. Modelin denklemi, n'nin çift veya tek olmasına göre farklı hesaplama yapan int64 türünde bir ifadedir. Bu tanım, aşağıda görüldüğü gibi TOML formatında satır içi (inline) olarak yapılmıştır.
[model]
type = "map"
dtype = "int64"
name = "Collatz Conjecture"
[states]
n = 27
[equations.rhs]
n = "n//2 if n % 2 == 0 else 3*n + 1"
Simülasyonun Çalıştırılması
Betik, setup(..., stepper="map") fonksiyonu ile modeli oluşturur ve len(expected) - 1 adım kadar simülasyonu çalıştırır. Simülasyon sonuçları sim.results() ile alınır. series.plot fonksiyonu, n'nin adımlara göre değişimini gösteren bir grafik çizer. Betik ayrıca, elde edilen dizinin, 27 ile başlayıp 1-4-2-1 döngüsüyle biten bilinen expected dizisiyle tam olarak eşleşip eşleşmediğini kontrol eder. Son olarak, yörüngenin son kısmı ve durum değişkeninin veri tipi ekrana yazdırılarak döngünün ve veri tipinin korunduğu doğrulanır.
Grafik ve Görselleştirme
theme.use("paper") komutu, matplotlib'i yayın kalitesinde grafikler oluşturacak şekilde ayarlar. export.show() ise oluşturulan grafiği ekranda gösterir. Grafiğin eksen etiketleri (iteration ve n) ve başlığı (Collatz Conjecture), n değerlerinin meşhur 4-2-1 döngüsüne girmeden önceki değişimini kolayca incelemeyi sağlar.
Referans Kod
Doğrulama ve çizim mantığını da içeren tam betik aşağıda verilmiştir:
from dynlib import setup
from dynlib.plot import series, export, theme
import numpy as np
from numpy.testing import assert_array_equal
model = '''
inline:
[model]
type = "map"
dtype = "int64"
name = "Collatz Conjecture"
[states]
n = 27
[equations.rhs]
n = "n//2 if n % 2 == 0 else 3*n + 1"
'''
expected = np.array([
27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121,
364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175,
526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502,
251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438,
719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367,
4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300,
650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160,
80, 40, 20, 10, 5, 16, 8, 4, 2, 1
], dtype=np.int64)
sim = setup(model, stepper="map")
sim.run(N=len(expected)-1)
res = sim.results()
theme.use("paper")
series.plot(x=res.step, y=res["n"], xlabel="iteration", ylabel="n", ylabel_rot=0, title="Collatz Conjecture")
print("1-4-2-1 cycle: ", res["n"][-6:])
print("dtype for n : ", res["n"].dtype)
if res["n"][0] == 27:
assert_array_equal(res["n"], expected)
print("✅ Collatz sequence matches exactly!")
export.show()
expected olarak tanımlanan NumPy dizisiyle birebir eşleştiğini doğrular.