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 4 laboratuvarı: CAD delik merkezi ölçümlerini denetleme."""
from __future__ import annotations
from importlib.metadata import version
import numpy as np
from sympy import Matrix, Rational
from agbook import (
canonical_array_sha256,
geometric_close,
pairwise_distances,
point_set_tolerance_diagnostics,
)
SEED = 20260907
def main() -> None:
# Bütün koordinatlar, şartname sınırı ve belirsizlik milimetredir.
nominal = np.array(
[[0.0, 0.0], [80.0, 0.0], [80.0, 50.0], [0.0, 50.0], [40.0, 25.0]]
)
observed = np.array(
[[0.02, -0.01], [80.08, 0.04], [80.15, 50.04], [-0.04, 50.02], [40.095, 25.0]]
)
diagnostics = point_set_tolerance_diagnostics(
nominal,
observed,
specification_limit=0.10,
measurement_uncertainty=0.02,
)
nominal_distances = pairwise_distances(nominal)
observed_distances = pairwise_distances(observed)
distance_matrix_residual = float(np.max(np.abs(observed_distances - nominal_distances)))
numeric_centroid = np.mean(nominal, axis=0)
exact_centroid = Matrix(
[
sum(Rational(str(value)) for value in nominal[:, axis]) / nominal.shape[0]
for axis in range(nominal.shape[1])
]
)
centroid_check = geometric_close(
numeric_centroid,
np.array(exact_centroid, dtype=float).reshape(2),
absolute_tolerance=1.0e-12,
relative_tolerance=1.0e-12,
reference_scale=80.0,
)
generator_a = np.random.Generator(np.random.PCG64(SEED))
generator_b = np.random.Generator(np.random.PCG64(SEED))
seeded_a = generator_a.normal(0.0, 0.01, size=(2, 2))
seeded_b = generator_b.normal(0.0, 0.01, size=(2, 2))
combined_hash = canonical_array_sha256(np.vstack([nominal, observed]))
print("birim: mm")
print(f"nominal_shape: {nominal.shape}")
print(f"observed_shape: {observed.shape}")
print("nokta_hatalari_mm:", np.round(diagnostics.point_errors, 6))
print("nokta_siniflari:", diagnostics.point_classifications)
print(f"genel_sinif: {diagnostics.overall_classification}")
print(f"en_buyuk_hata_mm: {diagnostics.worst_error:.6f}")
print(f"en_buyuk_hata_indisi: {diagnostics.worst_index}")
print(f"uzaklik_matrisi_artigi_mm: {distance_matrix_residual:.6f}")
print(f"kesin_merkez: {tuple(exact_centroid)}")
print(f"merkez_yakin: {centroid_check.close}")
print(f"tohum: {SEED}")
print("bit_uretici: PCG64")
print(f"tohumlu_tekrar_artigi: {np.max(np.abs(seeded_a - seeded_b)):.3e}")
print(f"girdi_sha256: {combined_hash}")
print(f"numpy_surumu: {version('numpy')}")
print(f"sympy_surumu: {version('sympy')}")
if __name__ == "__main__":
main()
Doğrulama çalıştırmasının çıktısı
birim: mm
nominal_shape: (5, 2)
observed_shape: (5, 2)
nokta_hatalari_mm: [0.022361 0.089443 0.155242 0.044721 0.095 ]
nokta_siniflari: ('accept', 'review', 'reject', 'accept', 'review')
genel_sinif: reject
en_buyuk_hata_mm: 0.155242
en_buyuk_hata_indisi: 2
uzaklik_matrisi_artigi_mm: 0.190002
kesin_merkez: (40, 25)
merkez_yakin: True
tohum: 20260907
bit_uretici: PCG64
tohumlu_tekrar_artigi: 0.000e+00
girdi_sha256: ce3a3b59adcbb168223823b5fb2dd916e00afe4ae9abe5e392415a0342090392
numpy_surumu: 2.2.6
sympy_surumu: 1.14.0
Metindeki Python kodları
# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Delik merkezlerinde şekil, tolerans ve iz kaydı ---
from importlib.metadata import version
import numpy as np
from sympy import Matrix, Rational
from agbook import (
canonical_array_sha256,
geometric_close,
pairwise_distances,
point_set_tolerance_diagnostics,
)
SEED = 20260907
nominal = np.array([
[0., 0.], [80., 0.], [80., 50.],
[0., 50.], [40., 25.],
])
observed = np.array([
[0.02, -0.01], [80.08, 0.04], [80.15, 50.04],
[-0.04, 50.02], [40.095, 25.],
])
diag = point_set_tolerance_diagnostics(
nominal,
observed,
specification_limit=0.10,
measurement_uncertainty=0.02,
)
d0 = pairwise_distances(nominal)
d1 = pairwise_distances(observed)
matrix_residual = np.max(np.abs(d1 - d0))
numeric_centroid = np.mean(nominal, axis=0)
exact_centroid = Matrix([
sum(Rational(str(v)) for v in nominal[:, axis]) / len(nominal)
for axis in range(2)
])
centroid_check = geometric_close(
numeric_centroid,
np.array(exact_centroid, dtype=float).reshape(2),
absolute_tolerance=1e-12,
relative_tolerance=1e-12,
reference_scale=80.,
)
rng_a = np.random.Generator(np.random.PCG64(SEED))
rng_b = np.random.Generator(np.random.PCG64(SEED))
z_a = rng_a.normal(0., 0.01, size=(2, 2))
z_b = rng_b.normal(0., 0.01, size=(2, 2))
print("birim: mm")
print("nominal_shape:", nominal.shape)
print("nokta_hatalari_mm:", np.round(diag.point_errors, 6))
print("nokta_siniflari:", diag.point_classifications)
print("genel_sinif:", diag.overall_classification)
print(f"en_buyuk_hata_mm: {diag.worst_error:.6f}")
print(f"uzaklik_matrisi_artigi_mm: {matrix_residual:.6f}")
print("merkez_yakin:", centroid_check.close)
print(f"tohumlu_tekrar_artigi: {np.max(np.abs(z_a-z_b)):.3e}")
print("girdi_sha256:", canonical_array_sha256(
np.vstack([nominal, observed])
))
print("numpy_surumu:", version("numpy"))
print("sympy_surumu:", version("sympy"))
Kaydedilen çıktı
1. Delik merkezlerinde şekil, tolerans ve iz kaydı
birim: mm
nominal_shape: (5, 2)
nokta_hatalari_mm: [0.022361 0.089443 0.155242 0.044721 0.095 ]
nokta_siniflari: ('accept', 'review', 'reject', 'accept', 'review')
genel_sinif: reject
en_buyuk_hata_mm: 0.155242
uzaklik_matrisi_artigi_mm: 0.190002
merkez_yakin: True
tohumlu_tekrar_artigi: 0.000e+00
girdi_sha256: ce3a3b59adcbb168223823b5fb2dd916e00afe4ae9abe5e392415a0342090392
numpy_surumu: 2.2.6
sympy_surumu: 1.14.0
Çözümlerdeki Python kodları
# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Satır farkı ve bütün ikili farklar ---
import numpy as np
p = np.array([[0., 0.], [1., 0.], [1., 2.], [0., 2.]])
q = np.array([[0.1, 0.], [1.1, 0.], [1., 2.1], [0., 2.1]])
rowwise = q - p
pairwise = q[:, None, :] - p[None, :, :]
print(p.shape, q.shape)
print(rowwise.shape)
print(pairwise.shape)
# --- 2. Büyük ofsette kesin ve binary64 fark ---
import numpy as np
from sympy import Matrix, sqrt
s = 10**16
float_a = np.array([s, s], dtype=float)
float_b = np.array([s + 1, s + 1], dtype=float)
exact_a = Matrix([s, s])
exact_b = Matrix([s + 1, s + 1])
print("numpy_fark:", float_b - float_a)
print("numpy_uzaklik:", np.linalg.norm(float_b - float_a))
print("sympy_fark:", exact_b - exact_a)
print("sympy_uzaklik:", sqrt((exact_b-exact_a).dot(exact_b-exact_a)))
# --- 3. Birimle birlikte ölçeklenen yakınlık ---
from agbook import geometric_close
metres = geometric_close(
[0., 0.], [0.001, 0.],
absolute_tolerance=0.0005,
relative_tolerance=0.001,
reference_scale=1.,
)
millimetres = geometric_close(
[0., 0.], [1., 0.],
absolute_tolerance=0.5,
relative_tolerance=0.001,
reference_scale=1000.,
)
print(metres.distance, metres.threshold, metres.close)
print(millimetres.distance, millimetres.threshold, millimetres.close)
try:
geometric_close(
[0., 0.], [1., 0.],
absolute_tolerance=-1.,
relative_tolerance=0.,
reference_scale=1.,
)
except ValueError as error:
print(type(error).__name__)
# --- 4. Tohum, çağrı, sürüm ve girdi özeti ---
from importlib.metadata import version
import numpy as np
from agbook import canonical_array_sha256
seed = 20260907
rng_a = np.random.Generator(np.random.PCG64(seed))
rng_b = np.random.Generator(np.random.PCG64(seed))
a = rng_a.normal(0., 0.01, size=(2, 2))
b = rng_b.normal(0., 0.01, size=(2, 2))
print("bit_generator: PCG64")
print("seed:", seed)
print("call: normal(0, 0.01, size=(2, 2))")
print("shape:", a.shape)
print(f"tekrar_artigi: {np.max(np.abs(a-b)):.1e}")
print("numpy:", version("numpy"))
print("sha256:", canonical_array_sha256(np.vstack([a, b])))
Kaydedilen çıktı
1. Satır farkı ve bütün ikili farklar
(4, 2) (4, 2)
(4, 2)
(4, 4, 2)
2. Büyük ofsette kesin ve binary64 fark
numpy_fark: [0. 0.]
numpy_uzaklik: 0.0
sympy_fark: Matrix([[1], [1]])
sympy_uzaklik: sqrt(2)
3. Birimle birlikte ölçeklenen yakınlık
0.001 0.0015 True
1.0 1.5 True
ValueError
4. Tohum, çağrı, sürüm ve girdi özeti
bit_generator: PCG64
seed: 20260907
call: normal(0, 0.01, size=(2, 2))
shape: (2, 2)
tekrar_artigi: 0.0e+00
numpy: 2.2.6
sha256: d43cebd4a303355919ffa888c6a8b58a738fbd33b0ea5c875fa37087673e8ba5
Ç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_04_hesaplamali_analitik_geometri.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_04_hesaplamali_analitik_geometri.py
.venv\Scripts\python.exe -m pytest