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 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ı
# 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ı
# 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 pytestWindows 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