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 2 laboratuvarı: rüzgâr altında rota bileşenleri."""
from __future__ import annotations
import numpy as np
from agbook import angle_between, orthogonal_decomposition, vector_norm
def main() -> None:
air_velocity = np.array([15.0, 2.0])
wind_velocity = np.array([-3.0, 4.0])
route_direction = np.array([4.0, 3.0])
ground_velocity = air_velocity + wind_velocity
decomposition = orthogonal_decomposition(ground_velocity, route_direction)
scaled = orthogonal_decomposition(ground_velocity, 1.0e8 * route_direction)
np.set_printoptions(precision=6, suppress=True)
print(f"hava_hizi: {air_velocity}")
print(f"ruzgar_hizi: {wind_velocity}")
print(f"yer_hizi: {ground_velocity}")
print(f"yer_surati: {vector_norm(ground_velocity):.6f}")
print(f"rota_bileseni: {decomposition.scalar_component:.6f}")
print(f"paralel: {decomposition.parallel}")
print(f"capraz: {decomposition.perpendicular}")
print(f"capraz_surat: {vector_norm(decomposition.perpendicular):.6f}")
print(f"rota_acisi_derece: {angle_between(ground_velocity, route_direction, degrees=True):.6f}")
print(f"yeniden_kurma_artigi: {decomposition.reconstruction_residual:.3e}")
print(f"diklik_artigi: {decomposition.orthogonality_residual:.3e}")
print(f"olcek_degismezligi: {vector_norm(decomposition.parallel - scaled.parallel):.3e}")
if __name__ == "__main__":
main()
Doğrulama çalıştırmasının çıktısı
hava_hizi: [15. 2.]
ruzgar_hizi: [-3. 4.]
yer_hizi: [12. 6.]
yer_surati: 13.416408
rota_bileseni: 13.200000
paralel: [10.56 7.92]
capraz: [ 1.44 -1.92]
capraz_surat: 2.400000
rota_acisi_derece: 10.304846
yeniden_kurma_artigi: 0.000e+00
diklik_artigi: 7.401e-16
olcek_degismezligi: 0.000e+00
Metindeki Python kodları
# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Bölüm 2'nin yeniden üretilebilir deneyi ---
import numpy as np
from agbook import angle_between, orthogonal_decomposition, vector_norm
air_velocity = np.array([15.0, 2.0])
wind_velocity = np.array([-3.0, 4.0])
route_direction = np.array([4.0, 3.0])
ground_velocity = air_velocity + wind_velocity
decomp = orthogonal_decomposition(ground_velocity, route_direction)
scaled = orthogonal_decomposition(
ground_velocity, 1.0e8 * route_direction
)
print(f"yer_hizi: {ground_velocity}")
print(f"yer_surati: {vector_norm(ground_velocity):.6f}")
print(f"rota_bileseni: {decomp.scalar_component:.6f}")
print(f"paralel: {decomp.parallel}")
print(f"capraz: {decomp.perpendicular}")
print(f"capraz_surat: {vector_norm(decomp.perpendicular):.6f}")
print(f"rota_acisi_derece: "
f"{angle_between(ground_velocity, route_direction, degrees=True):.6f}")
print(f"yeniden_kurma_artigi: {decomp.reconstruction_residual:.3e}")
print(f"diklik_artigi: {decomp.orthogonality_residual:.3e}")
print(f"olcek_degismezligi: "
f"{vector_norm(decomp.parallel-scaled.parallel):.3e}")
Kaydedilen çıktı
1. Bölüm 2'nin yeniden üretilebilir deneyi
yer_hizi: [12. 6.]
yer_surati: 13.416408
rota_bileseni: 13.200000
paralel: [10.56 7.92]
capraz: [ 1.44 -1.92]
capraz_surat: 2.400000
rota_acisi_derece: 10.304846
yeniden_kurma_artigi: 0.000e+00
diklik_artigi: 7.401e-16
olcek_degismezligi: 0.000e+00
Çözümlerdeki Python kodları
# Kitaptaki kod blokları; bu dosya içinde sırayla çalıştırılır.
# --- 1. Cauchy--Schwarz ve üçgen eşitsizliği taraması ---
import numpy as np
from agbook import inner_product, vector_norm
pairs = [
(np.array([1., 2.]), np.array([-3., 4.])),
(np.array([1., 2.]), np.array([0.5, -2.])),
(np.array([-3., 4.]), np.array([5., 0.])),
]
tolerance = 1e-12
cs = [vector_norm(u)*vector_norm(v) - abs(inner_product(u, v))
for u, v in pairs]
triangle = [vector_norm(u)+vector_norm(v)-vector_norm(u+v)
for u, v in pairs]
print(f"min_cs_margin: {min(cs):.6e}")
print(f"min_triangle_margin: {min(triangle):.6e}")
print(min(cs) >= -tolerance and min(triangle) >= -tolerance)
# --- 2. Büyük bileşenlerde norm ve açı ---
import numpy as np
from agbook import angle_between, vector_norm
u = np.array([1e307, 1e307])
v = np.array([1e307, 9.99e306])
with np.errstate(over="ignore"):
direct = np.sqrt(np.sum(u*u))
safe = vector_norm(u)
theta = angle_between(u, v)
print(direct)
print(f"{safe:.6e}")
print(f"{theta:.9e}")
print(np.isfinite(theta) and 0.0 <= theta <= np.pi)
# --- 3. Hedef ölçeği ve yönü ---
import numpy as np
from agbook import scalar_projection, vector_norm, vector_projection
v = np.array([5., 1.])
u = np.array([2., 1.])
reference = vector_projection(v, u)
for c in (1e8, -3., 1e-8):
projected = vector_projection(v, c*u)
difference = vector_norm(projected-reference)
component = scalar_projection(v, c*u)
print(f"{c: .1e} {difference:.3e} {component:.6f}")
# --- 4. Sıfır ve uygulama eşiği ---
from agbook import unit_vector
for label, vector, tolerance in (
("zero_default", [0., 0.], 0.0),
("small_default", [1e-10, 0.], 0.0),
("small_threshold", [1e-10, 0.], 1e-9),
):
try:
print(label, unit_vector(vector, zero_tolerance=tolerance))
except ValueError as error:
print(label, type(error).__name__)
Kaydedilen çıktı
1. Cauchy--Schwarz ve üçgen eşitsizliği taraması
min_cs_margin: 1.109772e+00
min_triangle_margin: 9.115127e-01
True
2. Büyük bileşenlerde norm ve açı
inf
1.414214e+307
5.002500833e-04
True
3. Hedef ölçeği ve yönü
1.0e+08 1.986e-15 4.919350
-3.0e+00 0.000e+00 -4.919350
1.0e-08 0.000e+00 4.919350
4. Sıfır ve uygulama eşiği
zero_default ValueError
small_default [1. 0.]
small_threshold ValueError
Ç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_02_vektorler_izdusum.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_02_vektorler_izdusum.py
.venv\Scripts\python.exe -m pytest