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

Düzlemde Doğru Denklemleri

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

Bölüm 05 · 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 5 laboratuvarı: sentetik bir ölçme referans doğrusu."""

from __future__ import annotations

from importlib.metadata import version

import numpy as np

from agbook import (
    canonical_array_sha256,
    canonical_line_coefficients,
    line_from_point_direction,
    line_from_points,
    line_membership_diagnostics,
    line_residuals,
    parametric_line_points,
)


def main() -> None:
    # Bütün koordinatlar metredir; parametreler boyutsuzdur.
    control_a = np.array([1000.0, 500.0])
    control_b = np.array([1300.0, 700.0])
    direction = control_b - control_a
    parameters = np.array([0.0, 0.25, 0.5, 0.75, 1.0])

    coefficients = line_from_points(control_a, control_b)
    stations = parametric_line_points(control_a, direction, parameters)
    station_residuals = line_residuals(coefficients, stations)

    shifted_anchor = stations[2]
    equivalent = line_from_point_direction(shifted_anchor, -3.0 * direction)
    scaled_equation = canonical_line_coefficients(-7.0 * coefficients)

    # Aday, kanonik birim normal yönünde 0.006 m ötelenmiştir.
    candidate = stations[3] + 0.006 * coefficients[:2]
    membership = line_membership_diagnostics(
        coefficients,
        candidate,
        absolute_tolerance=0.010,
        relative_tolerance=0.0,
        reference_scale=500.0,
    )

    input_hash = canonical_array_sha256(
        np.concatenate([control_a, control_b, parameters])
    )
    print("birim: m")
    print("parametre_birimi: boyutsuz")
    print("kanonik_katsayilar:", np.round(coefficients, 9))
    print("istasyon_sekli:", stations.shape)
    print("istasyonlar_m:", np.round(stations, 3).tolist())
    print(f"en_buyuk_istasyon_artigi: {np.max(np.abs(station_residuals)):.3e}")
    print(f"baslangic_yon_esdegerlik_artigi: {np.max(np.abs(equivalent - coefficients)):.3e}")
    print(f"denklem_olcek_esdegerlik_artigi: {np.max(np.abs(scaled_equation - coefficients)):.3e}")
    print(f"aday_ham_artigi: {membership.residual:.6f}")
    print(f"uyelik_esigi: {membership.threshold:.6f}")
    print(f"aday_dogru_uzerinde: {membership.on_line}")
    print(f"girdi_sha256: {input_hash}")
    print(f"numpy_surumu: {version('numpy')}")


if __name__ == "__main__":
    main()
Doğrulama çalıştırmasının çıktısı
birim: m
parametre_birimi: boyutsuz
kanonik_katsayilar: [   0.5547002    -0.83205029 -138.67504906]
istasyon_sekli: (5, 2)
istasyonlar_m: [[1000.0, 500.0], [1075.0, 550.0], [1150.0, 600.0], [1225.0, 650.0], [1300.0, 700.0]]
en_buyuk_istasyon_artigi: 0.000e+00
baslangic_yon_esdegerlik_artigi: 2.842e-14
denklem_olcek_esdegerlik_artigi: 2.842e-14
aday_ham_artigi: 0.006000
uyelik_esigi: 0.010000
aday_dogru_uzerinde: True
girdi_sha256: 2c98223c857708d8304279a93e108ab32f22e4201addef2cf892c7f7dc1b96bf
numpy_surumu: 2.2.6
Metindeki Python kodları

Kod dosyasını indir

# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Kanonik doğru ve açık üyelik denetimi ---
import numpy as np
from agbook import (
    canonical_line_coefficients,
    line_from_point_direction,
    line_from_points,
    line_membership_diagnostics,
    line_residuals,
    parametric_line_points,
)

A = np.array([1000.0, 500.0])  # metre
B = np.array([1300.0, 700.0])  # metre
v = B - A
t = np.array([0.0, 0.25, 0.5, 0.75, 1.0])

line = line_from_points(A, B)
stations = parametric_line_points(A, v, t)
residuals = line_residuals(line, stations)
same_from_shift = line_from_point_direction(stations[2], -3.0 * v)
same_from_scale = canonical_line_coefficients(-7.0 * line)

candidate = stations[3] + 0.006 * line[:2]
membership = line_membership_diagnostics(
    line,
    candidate,
    absolute_tolerance=0.010,
    relative_tolerance=0.0,
    reference_scale=500.0,
)

Kaydedilen çıktı

1. Kanonik doğru ve açık üyelik denetimi
Çözümlerdeki Python kodları

Kod dosyasını indir

# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. İki noktadan doğru ve artık ---
import numpy as np
from agbook import line_from_points, line_residuals, parametric_line_points

A = np.array([-1.0, 2.0])
B = np.array([3.0, 4.0])
line = line_from_points(A, B)
t = np.linspace(0.0, 1.0, 5)
points = parametric_line_points(A, B - A, t)
all_points = np.vstack([A, B, points])
residuals = line_residuals(line, all_points)

print(np.round(line, 12))
print(points.shape)
print(f"{np.max(np.abs(residuals)):.3e}")

# --- 2. Ortak ölçeği kaldırmak ---
import numpy as np
from agbook import canonical_line_coefficients

base = np.array([1.0, -2.0, 5.0])
scales = np.array([3.5, -7.0, 1.0e120, -1.0e-120])
canonical = np.vstack([
    canonical_line_coefficients(scale * base)
    for scale in scales
])
print(canonical)
print("en_buyuk_fark:", np.max(np.abs(canonical - canonical[0])))

# --- 3. Yatay, dikey ve geçersiz girdiler ---
from agbook import line_from_point_direction

print(line_from_point_direction([0.0, 4.0], [1.0, 0.0]))
print(line_from_point_direction([-3.0, 0.0], [0.0, 1.0]))

for point, direction in [
    ([0.0, 0.0], [0.0, 0.0]),
    ([0.0, 0.0, 1.0], [1.0, 0.0]),
]:
    try:
        line_from_point_direction(point, direction)
    except ValueError as error:
        print(type(error).__name__, str(error))

# --- 4. Üyelik kararının ölçek değişmezliği ---
import numpy as np
from agbook import line_membership_diagnostics

base = np.array([3.0, 4.0, -5.0])
point = np.array([1.0, 0.49])
for scale in [1.0e-6, 1.0, 1.0e6, -4.0]:
    result = line_membership_diagnostics(
        scale * base,
        point,
        absolute_tolerance=0.01,
        relative_tolerance=0.001,
        reference_scale=10.0,
    )
    print(scale, result.residual, result.threshold, result.on_line)

Kaydedilen çıktı

1. İki noktadan doğru ve artık
[ 0.4472136  -0.89442719  2.23606798]
(5, 2)
0.000e+00

2. Ortak ölçeği kaldırmak
[[ 0.4472136  -0.89442719  2.23606798]
 [ 0.4472136  -0.89442719  2.23606798]
 [ 0.4472136  -0.89442719  2.23606798]
 [ 0.4472136  -0.89442719  2.23606798]]
en_buyuk_fark: 4.440892098500626e-16

3. Yatay, dikey ve geçersiz girdiler
[ 0.  1. -4.]
[1. 0. 3.]
ValueError Sıfır veya eşik altındaki vektörün yönü tanımlı değildir.
ValueError point, (2,) biçiminde bir düzlem noktası veya vektörü olmalıdır.

4. Üyelik kararının ölçek değişmezliği
1e-06 -3.999999999999962e-08 1e-07 True
1.0 -0.040000000000000036 0.1 True
1000000.0 -40000.0 100000.0 True
-4.0 0.16000000000000014 0.4 True

Ç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_05_duzlemde_dogru_denklemleri.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_05_duzlemde_dogru_denklemleri.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.