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 1 laboratuvarı: değişmezlik ve üçleme denetimi."""
from __future__ import annotations
import numpy as np
from agbook import (
rigid_motion_diagnostics,
rotation_matrix_2d,
trilaterate_linear,
)
SEED = 20260907
def main() -> None:
triangle = np.array([[0.0, 0.0], [4.0, 0.0], [1.0, 3.0]])
rotation = rotation_matrix_2d(np.deg2rad(37.0))
diagnostics = rigid_motion_diagnostics(triangle, rotation, [2.5, -1.25])
anchors = np.array([[0.0, 0.0], [6.0, 0.0], [0.0, 5.0], [6.0, 5.0]])
true_point = np.array([2.3, 1.7])
rng = np.random.default_rng(SEED)
measured_ranges = np.linalg.norm(anchors - true_point, axis=1)
measured_ranges += rng.normal(loc=0.0, scale=0.01, size=anchors.shape[0])
estimate = trilaterate_linear(anchors, measured_ranges)
np.set_printoptions(precision=6, suppress=True)
print(f"tohum: {SEED}")
print(f"ortogonallik_artigi: {diagnostics.orthogonality_residual:.3e}")
print(f"determinant: {diagnostics.determinant:.6f}")
print(f"en_buyuk_uzaklik_hatasi: {diagnostics.maximum_distance_error:.3e}")
print(f"gercek_nokta: {true_point}")
print(f"tahmin: {estimate.point}")
print(f"rank: {estimate.rank}")
print(f"uzaklik_artik_normu: {estimate.residual_norm:.6f}")
print(f"konum_hatasi: {np.linalg.norm(estimate.point - true_point):.6f}")
if __name__ == "__main__":
main()
Doğrulama çalıştırmasının çıktısı
tohum: 20260907
ortogonallik_artigi: 2.702e-17
determinant: 1.000000
en_buyuk_uzaklik_hatasi: 4.441e-16
gercek_nokta: [2.3 1.7]
tahmin: [2.302395 1.716606]
rank: 2
uzaklik_artik_normu: 0.018807
konum_hatasi: 0.016778
Metindeki Python kodları
# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Bölüm 1'in yeniden üretilebilir deneyi ---
import numpy as np
from agbook import (
rigid_motion_diagnostics,
rotation_matrix_2d,
trilaterate_linear,
)
SEED = 20260907
triangle = np.array([[0.0, 0.0],
[4.0, 0.0],
[1.0, 3.0]])
Q = rotation_matrix_2d(np.deg2rad(37.0))
diag = rigid_motion_diagnostics(triangle, Q, [2.5, -1.25])
anchors = np.array([[0.0, 0.0],
[6.0, 0.0],
[0.0, 5.0],
[6.0, 5.0]])
true_point = np.array([2.3, 1.7])
rng = np.random.default_rng(SEED)
ranges = np.linalg.norm(anchors - true_point, axis=1)
ranges += rng.normal(0.0, 0.01, size=anchors.shape[0])
fit = trilaterate_linear(anchors, ranges)
print(f"ortogonallik: {diag.orthogonality_residual:.3e}")
print(f"uzaklik_hatasi: {diag.maximum_distance_error:.3e}")
print(f"tahmin: {fit.point}")
print(f"rank: {fit.rank}")
print(f"artik_normu: {fit.residual_norm:.6f}")
print(f"konum_hatasi: {np.linalg.norm(fit.point-true_point):.6f}")
Kaydedilen çıktı
1. Bölüm 1'in yeniden üretilebilir deneyi
ortogonallik: 2.702e-17
uzaklik_hatasi: 4.441e-16
tahmin: [2.30239524 1.71660613]
rank: 2
artik_normu: 0.018807
konum_hatasi: 0.016778
Çözümlerdeki Python kodları
# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. H1 ve H2'nin yeniden hesaplanması ---
import numpy as np
from agbook import displacement, euclidean_distance, midpoint
a2, b2 = np.array([-3., 2.]), np.array([5., -4.])
a3, b3 = np.array([2., -1., 4.]), np.array([-2., 5., 0.])
computed = np.r_[displacement(a2, b2),
euclidean_distance(a2, b2),
midpoint(a3, b3),
euclidean_distance(a3, b3)]
expected = np.array([8., -6., 10., 0., 2., 2., 2*np.sqrt(17.)])
print(computed)
print(np.max(np.abs(computed - expected)))
# --- 2. 361 dönme matrisinin ortogonallik taraması ---
import numpy as np
from agbook import rotation_matrix_2d
residuals = []
for degree in range(361):
q = rotation_matrix_2d(np.deg2rad(degree))
residuals.append(np.linalg.norm(q.T @ q - np.eye(2)))
index = int(np.argmax(residuals))
print(index, f"{residuals[index]:.3e}")
print(max(residuals) < 1e-12)
# --- 3. Dört çıpayla gürültülü konum hesabı ---
import numpy as np
from agbook import trilaterate_linear
anchors = np.array([[0., 0.], [10., 0.],
[0., 8.], [10., 8.]])
truth = np.array([4., 3.])
rng = np.random.default_rng(20260907)
ranges = np.linalg.norm(anchors - truth, axis=1)
ranges += rng.normal(0., 0.02, size=4)
fit = trilaterate_linear(anchors, ranges)
print(fit.point)
print(fit.rank)
print(f"{fit.residual_norm:.6f}")
print(f"{np.linalg.norm(fit.point-truth):.6f}")
# --- 4. Rank ile koşulluluğun ayrılması ---
import numpy as np
from agbook import trilaterate_linear
target = np.array([0.5, 1.0])
collinear = np.array([[0., 0.], [1., 0.], [2., 0.]])
near = np.array([[0., 0.], [1., 0.], [2., 1e-8]])
try:
trilaterate_linear(collinear,
np.linalg.norm(collinear-target, axis=1))
except ValueError as error:
print(type(error).__name__)
ranges = np.linalg.norm(near-target, axis=1)
fit1 = trilaterate_linear(near, ranges)
ranges[-1] += 1e-10
fit2 = trilaterate_linear(near, ranges)
print(fit1.singular_values)
print(np.linalg.norm(fit2.point-fit1.point))
Kaydedilen çıktı
1. H1 ve H2'nin yeniden hesaplanması
[ 8. -6. 10. 0. 2. 2.
8.24621125]
0.0
2. 361 dönme matrisinin ortogonallik taraması
225 3.198e-16
True
3. Dört çıpayla gürültülü konum hesabı
[4.00512656 3.03327703]
2
0.039369
0.033670
4. Rank ile koşulluluğun ayrılması
ValueError
[4.47213595e+00 8.94427191e-09]
0.01802773749828579
Ç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_01_koordinatlarla_geometrik_dusunme.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_01_koordinatlarla_geometrik_dusunme.py
.venv\Scripts\python.exe -m pytest