TEORİDEN UYGULAMAYA · PYTHON EŞLİKÇİSİ

Konik Kesitler ve Geometrik Yer

Prof. Dr. Zühal Küçükarslan Yüzbaşı · Prof. Dr. Bahadır Yüzbaşı

Bölüm 09 · v1.0 · Türkçe

Bu bölümün laboratuvarı, kitaptaki örnekleri yeniden üretmek ve sayısal sonuçları incelemek için hazırlanmıştır. Matematiksel tanımlar, ispatlar ve sorular kitapta yer alır.

Laboratuvarı indir (.py) Tam Python paketi (.zip)

Laboratuvar kodu

"""Bölüm 9 laboratuvarı: sentetik bir yörünge izinin konik geometrisi.

Model iki boyutlu ve sentetiktir. Koordinatlar kilometredir. Noktalar,
odak--doğrultman oranı sabit bir elips üzerinden tam olarak üretilir; sonra
aynı geometri rijit bir çerçeve değişiminde yeniden denetlenir. Zaman, hız,
kütleçekim kuvveti, ölçüm gürültüsü ve yörünge kestirimi modellenmez.
"""

from __future__ import annotations

import numpy as np

from agbook import (
    canonical_array_sha256,
    classify_standard_cone_plane,
    focus_directrix_diagnostics,
    rotation_matrix_2d,
)


def main() -> None:
    eccentricity = 0.6
    directrix_distance_km = 12_000.0
    focus_km = np.array([0.0, 0.0])
    directrix = np.array([1.0, 0.0, -directrix_distance_km])

    center_x_km = -(
        eccentricity**2
        * directrix_distance_km
        / (1.0 - eccentricity**2)
    )
    semimajor_km = (
        eccentricity
        * directrix_distance_km
        / (1.0 - eccentricity**2)
    )
    semiminor_km = semimajor_km * np.sqrt(1.0 - eccentricity**2)
    parameters = np.linspace(0.0, 2.0 * np.pi, 12, endpoint=False)
    orbit_points_km = np.column_stack(
        [
            center_x_km + semimajor_km * np.cos(parameters),
            semiminor_km * np.sin(parameters),
        ]
    )

    before = focus_directrix_diagnostics(
        orbit_points_km,
        focus_km,
        directrix,
        eccentricity,
        reference_scale=directrix_distance_km,
    )

    rotation = rotation_matrix_2d(np.deg2rad(23.0))
    translation_km = np.array([3_200.0, -1_800.0])
    transformed_points_km = orbit_points_km @ rotation.T + translation_km
    transformed_focus_km = focus_km @ rotation.T + translation_km
    transformed_normal = rotation @ directrix[:2]
    transformed_offset = directrix[2] - float(
        np.dot(transformed_normal, translation_km)
    )
    transformed_directrix = np.r_[transformed_normal, transformed_offset]
    after = focus_directrix_diagnostics(
        transformed_points_km,
        transformed_focus_km,
        transformed_directrix,
        eccentricity,
        reference_scale=directrix_distance_km,
    )

    section_cases = (
        ("yatay", [0.0, 0.0], 2.0),
        ("az_egimli", [0.5, 0.0], 2.0),
        ("uretece_paralel", [1.0, 0.0], 2.0),
        ("dik_egimli", [1.25, 0.0], 2.0),
        ("tepe_az_egimli", [0.5, 0.0], 0.0),
        ("tepe_uretece", [1.0, 0.0], 0.0),
        ("tepe_dik_egimli", [1.25, 0.0], 0.0),
    )

    print("birim: km")
    print("model: sentetik_iki_boyutlu_geometri")
    print("dinamik_model_var_mi: False")
    print("nokta_sayisi:", orbit_points_km.shape[0])
    print("dismerkezlik:", f"{eccentricity:.12f}")
    print("konik_turu:", before.conic_type)
    print("oran_araligi_once:", np.round([before.ratios.min(), before.ratios.max()], 12))
    print("en_buyuk_mutlak_artik_km_once:", f"{before.maximum_absolute_residual:.3e}")
    print("en_buyuk_olceksiz_artik_once:", f"{before.maximum_scaled_residual:.3e}")
    print("oran_araligi_sonra:", np.round([after.ratios.min(), after.ratios.max()], 12))
    print("en_buyuk_mutlak_artik_km_sonra:", f"{after.maximum_absolute_residual:.3e}")
    print("en_buyuk_olceksiz_artik_sonra:", f"{after.maximum_scaled_residual:.3e}")
    print(
        "rijit_oran_farki:",
        f"{np.max(np.abs(after.ratios - before.ratios)):.3e}",
    )
    for case_name, slopes, offset in section_cases:
        diagnosis = classify_standard_cone_plane(slopes, offset)
        print(
            f"kesit_{case_name}:",
            diagnosis.section_type,
            "dejenere=" + str(diagnosis.degenerate),
        )

    signature_values = np.concatenate(
        [
            np.array([eccentricity, directrix_distance_km]),
            focus_km,
            directrix,
            parameters,
            orbit_points_km.ravel(),
            rotation.ravel(),
            translation_km,
            transformed_points_km.ravel(),
        ]
    )
    print("bilimsel_imza:", canonical_array_sha256(signature_values))


if __name__ == "__main__":
    main()
Doğrulama çalıştırmasının çıktısı
birim: km
model: sentetik_iki_boyutlu_geometri
dinamik_model_var_mi: False
nokta_sayisi: 12
dismerkezlik: 0.600000000000
konik_turu: ellipse
oran_araligi_once: [0.6 0.6]
en_buyuk_mutlak_artik_km_once: 1.819e-12
en_buyuk_olceksiz_artik_once: 1.516e-16
oran_araligi_sonra: [0.6 0.6]
en_buyuk_mutlak_artik_km_sonra: 7.276e-12
en_buyuk_olceksiz_artik_sonra: 4.547e-16
rijit_oran_farki: 3.331e-16
kesit_yatay: circle dejenere=False
kesit_az_egimli: ellipse dejenere=False
kesit_uretece_paralel: parabola dejenere=False
kesit_dik_egimli: hyperbola dejenere=False
kesit_tepe_az_egimli: point dejenere=True
kesit_tepe_uretece: repeated_line dejenere=True
kesit_tepe_dik_egimli: intersecting_lines dejenere=True
bilimsel_imza: 6d7b95b6e6a0b490c66ea61feee2659767ed586357f95ea04027b1de81a61e7c
Metindeki Python kodları

Kod dosyasını indir

# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Bölüm 9: odak--doğrultman tanısı ve rijit çerçeve ---
import numpy as np
from agbook import (
    focus_directrix_diagnostics,
    rotation_matrix_2d,
)

e, d = 0.6, 12_000.0  # d: km
focus = np.array([0.0, 0.0])
directrix = np.array([1.0, 0.0, -d])
xc = -(e**2) * d / (1.0 - e**2)
a0 = e * d / (1.0 - e**2)
b0 = a0 * np.sqrt(1.0 - e**2)
t = np.linspace(0.0, 2.0*np.pi, 12, endpoint=False)
points = np.column_stack([xc + a0*np.cos(t), b0*np.sin(t)])

before = focus_directrix_diagnostics(
    points, focus, directrix, e, reference_scale=d
)
Q = rotation_matrix_2d(np.deg2rad(23.0))
b = np.array([3_200.0, -1_800.0])  # km
moved = points @ Q.T + b
moved_focus = focus @ Q.T + b
n_moved = Q @ directrix[:2]
line_moved = np.r_[n_moved, directrix[2] - n_moved @ b]
after = focus_directrix_diagnostics(
    moved, moved_focus, line_moved, e, reference_scale=d
)

print(before.conic_type)
print(f"{before.maximum_absolute_residual:.3e}")
print(f"{before.maximum_scaled_residual:.3e}")
print(f"{np.max(np.abs(before.ratios-after.ratios)):.3e}")

Kaydedilen çıktı

1. Bölüm 9: odak--doğrultman tanısı ve rijit çerçeve
ellipse
1.819e-12
1.516e-16
3.331e-16
Çözümlerdeki Python kodları

Kod dosyasını indir

# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Yedi standart koni--düzlem tanısı ---
from agbook import classify_standard_cone_plane

cases = [
    ("cember", (0.0, 0.0), 2.0),
    ("elips", (0.5, 0.0), 2.0),
    ("parabol", (1.0, 0.0), 2.0),
    ("hiperbol", (1.25, 0.0), 2.0),
    ("nokta", (0.5, 0.0), 0.0),
    ("cakisik", (1.0, 0.0), 0.0),
    ("kesisen", (1.25, 0.0), 0.0),
]
for label, slopes, h in cases:
    out = classify_standard_cone_plane(slopes, h)
    print(label, out.section_type, out.slope_norm,
          out.quadratic_determinant, out.degenerate)

# --- 2. Üç konik türünde artık denetimi ---
import numpy as np
from agbook import focus_directrix_diagnostics

models = [
    ("elips", [[5/3, 0], [-5, 0], [0, 2.5]],
     [0, 0], [1, 0, -5], 0.5),
    ("parabol", [[0, 0], [1, 2], [4, -4]],
     [1, 0], [1, 0, 1], 1.0),
    ("hiperbol", [[4, 0], [4/3, 0], [0, 4]],
     [0, 0], [1, 0, -2], 2.0),
]
for name, points, focus, line, e in models:
    d = focus_directrix_diagnostics(
        np.array(points, float), focus, line, e,
        reference_scale=1.0,
    )
    print(name, d.conic_type,
          d.maximum_absolute_residual,
          d.maximum_scaled_residual)

# --- 3. Doğrultman ölçeği ve geçersiz normal ---
import numpy as np
from agbook import focus_directrix_ratios

points = np.array([[5/3, 0], [-5, 0], [0, 2.5]])
r1 = focus_directrix_ratios(points, [0, 0], [1, 0, -5])
r2 = focus_directrix_ratios(points, [0, 0], [-7, 0, 35])
print(np.max(np.abs(r1-r2)))

try:
    focus_directrix_ratios(points, [0, 0], [0, 0, 1])
except ValueError as error:
    print(type(error).__name__)

# --- 4. Rijit ve anizotropik dönüşüm karşılaştırması ---
import numpy as np
from agbook import focus_directrix_ratios, rotation_matrix_2d

P = np.array([[0., 0.], [1., 2.], [4., 4.]])
F = np.array([1., 0.])
line = np.array([1., 0., 1.])       # x=-1
r0 = focus_directrix_ratios(P, F, line)

Q = rotation_matrix_2d(np.pi/2)
b = np.array([3., -2.])
Pr, Fr = P @ Q.T + b, F @ Q.T + b
n = Q @ line[:2]
liner = np.r_[n, line[2] - n @ b]
rr = focus_directrix_ratios(Pr, Fr, liner)

Pa, Fa = P * [2., 1.], F * [2., 1.]
linea = np.array([1., 0., 2.])      # x'=-2
ra = focus_directrix_ratios(Pa, Fa, linea)
print(np.max(np.abs(rr-r0)))
print(r0)
print(ra)

Kaydedilen çıktı

1. Yedi standart koni--düzlem tanısı
cember circle 0.0 1.0 False
elips ellipse 0.5 0.75 False
parabol parabola 1.0 0.0 False
hiperbol hyperbola 1.25 -0.5625 False
nokta point 0.5 0.75 True
cakisik repeated_line 1.0 0.0 True
kesisen intersecting_lines 1.25 -0.5625 True

2. Üç konik türünde artık denetimi
elips ellipse 2.220446049250313e-16 1.3322676295501878e-16
parabol parabola 0.0 0.0
hiperbol hyperbola 2.220446049250313e-16 1.6653345369377346e-16

3. Doğrultman ölçeği ve geçersiz normal
0.0
ValueError

4. Rijit ve anizotropik dönüşüm karşılaştırması
2.220446049250313e-16
[1. 1. 1.]
[1.         0.5        0.72111026]

Çalıştırma rehberi

Önce tam Python paketini indirin ve arşivi açın. Aşağıdaki komutları arşivin üst klasöründen başlatın. İlk kurulum internet bağlantısı ve Python 3.12 veya 3.13 gerektirir. Bağımlılıklar sabittir; sistem Python'unu değiştirmemek için ayrı sanal ortam kullanılır.

macOS / Linux
cd analitik-geometri-python-v1.0
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e ".[dev]"
python labs/bolum_09_konik_geometrik_yer.py
python -m pytest
Windows PowerShell
cd analitik-geometri-python-v1.0
py -3.13 -m venv .venv
.venv\Scripts\python.exe -m pip install -e ".[dev]"
.venv\Scripts\python.exe labs/bolum_09_konik_geometrik_yer.py
.venv\Scripts\python.exe -m pytest

Laboratuvar dosyaları agbook yardımcı paketini kullanır; tek bir dosyayı indirmek paketi kurmanın yerini tutmaz. Metin/çözüm kodları kendi dosyaları içinde sırayla çalıştırılır; gizli bir notebook oturumu gerekmez. Son ondalık basamaklar platforma göre değişebilir.