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

Python ile Hesaplamalı Analitik Geometri

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

Bölüm 04 · 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 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ı

Kod dosyasını indir

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

Kod dosyasını indir

# 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 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_04_hesaplamali_analitik_geometri.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.