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 3 laboratuvarı: sıralı güvenlik bölgesinin alanı ve yönelimi."""
from __future__ import annotations
import numpy as np
from sympy import Matrix
from agbook import (
determinant_2d,
orientation_diagnostics,
polygon_area,
polygon_signed_area,
triangle_area,
)
boundary = np.array(
[
[0.0, 0.0],
[6.0, 0.0],
[7.0, 3.0],
[4.5, 5.0],
[1.0, 4.0],
]
)
tolerance = 1.0e-10
signed_area = polygon_signed_area(boundary)
area = polygon_area(boundary)
fan_area = sum(triangle_area(boundary[0], boundary[i], boundary[i + 1]) for i in range(1, len(boundary) - 1))
first_turn = orientation_diagnostics(*boundary[:3], relative_tolerance=tolerance)
reversed_area = polygon_signed_area(boundary[::-1])
translated_area = polygon_signed_area(boundary + np.array([1.0e9, -2.0e9]))
linear_map = np.array([[1.2, 0.3], [-0.2, 0.8]])
mapped = boundary @ linear_map.T
area_scale = determinant_2d(linear_map[:, 0], linear_map[:, 1])
mapped_ratio = polygon_area(mapped) / area
near = np.array([[0.0, 0.0], [1.0e8, 1.0e8], [2.0e8, 2.0e8 + 1.0]])
near_result = orientation_diagnostics(*near, relative_tolerance=1.0e-8)
exact_double_area = Matrix(
[
[100000000, 100000000],
[200000000, 200000001],
]
).det()
print(f"yonlu_alan_m2: {signed_area:.6f}")
print(f"alan_m2: {area:.6f}")
print(f"ilk_donus: {first_turn.classification}")
print(f"ucgen_yelpazesi_m2: {fan_area:.6f}")
print(f"ters_sira_yonlu_alan_m2: {reversed_area:.6f}")
print(f"oteleme_farki_m2: {translated_area - signed_area:.3e}")
print(f"donusum_determinanti: {area_scale:.6f}")
print(f"donusmus_alan_orani: {mapped_ratio:.6f}")
print(f"yakin_normalize_determinant: {near_result.normalized_determinant:.6e}")
print(f"yakin_sinif: {near_result.classification}")
print(f"kesin_iki_kat_alan: {exact_double_area}")
Doğrulama çalıştırmasının çıktısı
yonlu_alan_m2: 26.250000
alan_m2: 26.250000
ilk_donus: counterclockwise
ucgen_yelpazesi_m2: 26.250000
ters_sira_yonlu_alan_m2: -26.250000
oteleme_farki_m2: 0.000e+00
donusum_determinanti: 1.020000
donusmus_alan_orani: 1.020000
yakin_normalize_determinant: 2.500000e-09
yakin_sinif: uncertain
kesin_iki_kat_alan: 100000000
Metindeki Python kodları
# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Robot bölgesi, dönüşüm ve kesin karşılaştırma ---
import numpy as np
from sympy import Matrix
from agbook import (
determinant_2d, orientation_diagnostics, polygon_area,
polygon_signed_area, triangle_area,
)
boundary = np.array([
[0., 0.], [6., 0.], [7., 3.], [4.5, 5.], [1., 4.]
])
tolerance = 1.0e-10
signed_area = polygon_signed_area(boundary)
area = polygon_area(boundary)
fan_area = sum(
triangle_area(boundary[0], boundary[i], boundary[i + 1])
for i in range(1, len(boundary) - 1)
)
first_turn = orientation_diagnostics(
*boundary[:3], relative_tolerance=tolerance
)
reversed_area = polygon_signed_area(boundary[::-1])
translated_area = polygon_signed_area(
boundary + np.array([1.0e9, -2.0e9])
)
linear_map = np.array([[1.2, 0.3], [-0.2, 0.8]])
mapped = boundary @ linear_map.T
scale = determinant_2d(linear_map[:, 0], linear_map[:, 1])
mapped_ratio = polygon_area(mapped) / area
near = np.array([
[0., 0.], [1.0e8, 1.0e8], [2.0e8, 2.0e8 + 1.]
])
near_result = orientation_diagnostics(
*near, relative_tolerance=1.0e-8
)
exact = Matrix([
[100000000, 100000000],
[200000000, 200000001],
]).det()
print(f"yonlu_alan_m2: {signed_area:.6f}")
print(f"alan_m2: {area:.6f}")
print(f"ilk_donus: {first_turn.classification}")
print(f"ucgen_yelpazesi_m2: {fan_area:.6f}")
print(f"ters_sira_yonlu_alan_m2: {reversed_area:.6f}")
print(f"oteleme_farki_m2: {translated_area-signed_area:.3e}")
print(f"donusum_determinanti: {scale:.6f}")
print(f"donusmus_alan_orani: {mapped_ratio:.6f}")
print(f"yakin_normalize_determinant: "
f"{near_result.normalized_determinant:.6e}")
print(f"yakin_sinif: {near_result.classification}")
print(f"kesin_iki_kat_alan: {exact}")
Kaydedilen çıktı
1. Robot bölgesi, dönüşüm ve kesin karşılaştırma
yonlu_alan_m2: 26.250000
alan_m2: 26.250000
ilk_donus: counterclockwise
ucgen_yelpazesi_m2: 26.250000
ters_sira_yonlu_alan_m2: -26.250000
oteleme_farki_m2: 0.000e+00
donusum_determinanti: 1.020000
donusmus_alan_orani: 1.020000
yakin_normalize_determinant: 2.500000e-09
yakin_sinif: uncertain
kesin_iki_kat_alan: 100000000
Çözümlerdeki Python kodları
# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Alternatiflik ve kesme artıkları ---
import numpy as np
from agbook import determinant_2d
pairs = [
(np.array([3., -1.]), np.array([2., 4.])),
(np.array([2.5, 0.8]), np.array([0.6, 2.2])),
(np.array([-5., 7.]), np.array([3., 1.])),
]
lam = 3.25
residuals = []
for u, v in pairs:
residuals.append(
determinant_2d(u, v) + determinant_2d(v, u)
)
residuals.append(
determinant_2d(u, v + lam*u) - determinant_2d(u, v)
)
print(f"max_mutlak_artik: {max(map(abs, residuals)):.3e}")
# --- 2. Çokgen sırası, kapanış ve öteleme ---
import numpy as np
from agbook import polygon_signed_area
p = np.array([
[0., 0.], [6., 0.], [7., 3.], [4.5, 5.], [1., 4.]
])
closed = np.vstack([p, p[0]])
shifted = p + np.array([1.0e9, -2.0e9])
for name, vertices in (
("ozgun", p),
("ters", p[::-1]),
("kapali", closed),
("otelenmis", shifted),
):
print(name, f"{polygon_signed_area(vertices):.6f}")
# --- 3. Üç tolerans ve kesin determinant ---
import numpy as np
from sympy import Matrix
from agbook import orientation_diagnostics
points = np.array([
[0., 0.], [1.0e8, 1.0e8], [2.0e8, 2.0e8 + 1.]
])
for tau in (1.0e-6, 1.0e-8, 1.0e-10):
result = orientation_diagnostics(
*points, relative_tolerance=tau
)
print(f"{tau:.0e}", result.classification,
f"{result.normalized_determinant:.6e}")
exact = Matrix([
[100000000, 100000000],
[200000000, 200000001],
]).det()
print("kesin", exact)
# --- 4. Taşmayı yakalama ve işaret için ölçekleme ---
import numpy as np
from agbook import determinant_2d
u = np.array([1.0e308, 1.0e308])
v = np.array([1.0e308, -1.0e308])
try:
determinant_2d(u, v)
except OverflowError as error:
print("overflow:", type(error).__name__)
scale = 1.0e308
scaled_det = determinant_2d(u/scale, v/scale)
print(f"scaled_determinant: {scaled_det:.1f}")
print("sign:", int(np.sign(scaled_det)))
Kaydedilen çıktı
1. Alternatiflik ve kesme artıkları
max_mutlak_artik: 1.776e-15
2. Çokgen sırası, kapanış ve öteleme
ozgun 26.250000
ters -26.250000
kapali 26.250000
otelenmis 26.250000
3. Üç tolerans ve kesin determinant
1e-06 uncertain 2.500000e-09
1e-08 uncertain 2.500000e-09
1e-10 counterclockwise 2.500000e-09
kesin 100000000
4. Taşmayı yakalama ve işaret için ölçekleme
overflow: OverflowError
scaled_determinant: -2.0
sign: -1
Ç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_03_determinant_alan_yonelim.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_03_determinant_alan_yonelim.py
.venv\Scripts\python.exe -m pytest