Skalární součin — a proč jsou obě definice totéž
Skalární součin se zavádí dvakrát a obě definice vypadají, že spolu nesouvisejí:
První je předpis: vezmi čísla, vynásob a sečti. Druhá je geometrie: o souřadnicích neví vůbec nic. Naprostá většina učebnic obě napíše a pak už používá tu, která se zrovna hodí. Jenže proč by měl součet součinů něco vědět o úhlu? Dokud tohle člověk nevidí, je skalární součin pravidlo k zapamatování, ne fakt.
Důkaz je jeden a je krátký: kosinová věta.
- a₁b₁ + a₂b₂ + a₃b₃ vs. |a||b| cos θ
Jedna je předpis se souřadnicemi, druhá je čistá geometrie a o souřadnicích nic neví. Že vycházejí stejně, není samozřejmé — a skoro nikde se to nedokazuje.
- c = b − a
Doplníme trojúhelník. Třetí strana je b − a (kapitola 2: šipka z hrotu a do hrotu b).
- |c|² = |a|² + |b|² − 2|a||b| cos θ
Kosinová věta. Zatím žádné souřadnice — je to tvrzení o trojúhelníku, které znal Eukleides. Tohle je ta geometrická strana rovnice.
- |c|² = Σ(bᵢ − aᵢ)² = Σbᵢ² − 2Σaᵢbᵢ + Σaᵢ²
Tutéž délku spočítáme podruhé, tentokrát Pythagorou ze složek, a roznásobíme závorku. Uprostřed se objeví součet součinů — ta druhá definice, aniž bychom o ni prosili.
- |c|² = |a|² + |b|² − 2Σaᵢbᵢ
Σaᵢ² je |a|² a Σbᵢ² je |b|² — to je kapitola 3. Řádek teď vypadá skoro přesně jako kosinová věta.
- −2Σaᵢbᵢ = −2|a||b| cos θ
−8,604 = −8,604Dva výpočty téže délky. Levé strany jsou totožné, |a|² i |b|² se v obou vyskytují — takže se musí rovnat i to, co zbylo.
- Σaᵢbᵢ = |a||b| cos θ = 4,3018
Obě definice jsou totéž číslo. Praktický dopad: souřadnicový předpis je způsob, jak spočítat úhel bez úhloměru — a to je jediný důvod, proč skalární součin v robotice a grafice tolik potkáváte.
K čemu to je: úhel bez úhloměru
Praktický dopad té rovnosti je jediný, zato zásadní. Ze složek se dá spočítat úhel:
Tímhle se v robotice zjišťuje, jestli chapadlo míří na cíl, jestli je plocha přivrácená ke kameře, jestli je síla ve směru pohybu. Žádná z těch otázek nemá úhloměr.
Pozor na acos. Vzorec výše se nemá počítat
přímo jako acos(a·b/(|a||b|)). Kosinus je u 0° a 180° plochý, takže zaokrouhlovací
chyba 10⁻¹⁶ v argumentu udělá chybu 10⁻⁸ v úhlu — a argument, který kvůli zaokrouhlení vyjde
1,0000000000000002, udělá z acos rovnou NaN. Solver v téhle labce
používá atan2(|a×b|, a·b), což je přesné v celém rozsahu. Doporučuje to
W. Kahan, Computing Cross-Products and Rotations (2016), §12, a v testech je na to
případ s úhlem 10⁻⁷ rad.
Znaménko je ta nejužitečnější polovina
- a · b > 0 — ostrý úhel, míří zhruba stejným směrem;
- a · b = 0 — kolmé. Tohle je nejpoužívanější rovnice v celé geometrii;
- a · b < 0 — tupý úhel, míří proti sobě.
Většina praktických použití si vystačí jenom se znaménkem: je ta stěna přivrácená, nebo odvrácená? Jede robot k překážce, nebo od ní? Koná síla práci, nebo ji spotřebovává?
Vlastnosti, které se hodí znát
Skalární součin je komutativní (a·b = b·a) a distributivní
(a·(b+c) = a·b + a·c). Není asociativní, a to ani nemůže být: (a·b)·c je
číslo krát vektor, kdežto a·(b·c) je vektor krát číslo — dva různé vektory. Ta
„vlastnost“ ani nedává smysl a nemá se po ní pátrat.
A jedna nerovnost, která je celá schovaná v tom, že kosinus nepřeleze jedničku:
Rovnost nastane právě tehdy, když jsou vektory rovnoběžné. Testy v repu ji ověřují na čtyřech tisících náhodných dvojic — právě proto, že je to tvrzení o každé dvojici, a ne tabulková hodnota.