VectorLab šipky, které umí počítat

Tohle je statická kopie kapitoly pro vyhledávače. Interaktivní verze má animované obrázky, kontrolní otázky a tlačítka, která příklad načtou do kalkulačky.

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í:

a · b = a₁b₁ + a₂b₂ + a₃b₃      a · b = |a| |b| cos θdvě tváře jedné věci

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.

xyc = b − aabθz kosinové věty|c|² = 6,6464ze složek|c|² = 6,6464tatáž délka, dvě cestya·b = 4,3018|a||b|cos θ = 4,3018
  1. 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.

  2. c = b a

    Doplníme trojúhelník. Třetí strana je b − a (kapitola 2: šipka z hrotu a do hrotu b).

  3. |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.

  4. |c= Σ(bᵢ − aᵢ)² = Σbᵢ² 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.

  5. |c= |a+ |baᵢbᵢ

    Σaᵢ² je |a|² a Σbᵢ² je |b|² — to je kapitola 3. Řádek teď vypadá skoro přesně jako kosinová věta.

  6. −2Σaᵢbᵢ = −2|a||b| cos θ
    −8,604 = −8,604

    Dva 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.

  7. Σ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.

Sedm kroků. Klíč je v tom, že se tatáž délka |c| spočítá dvakrát — jednou geometricky, jednou ze složek — a obě čísla musí sedět.

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:

cos θ = (a · b) / (|a| |b|)úhel ze souřadnic

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

xyab40°a · b3,677ostrý úhel — míří spoluprůmět b na a|b|·cos θ = 1,532a·b = |a| × (ten průmět)2,40 × 1,532 = 3,677
a·b = 3,6770  ·  cos θ = 0,7660  ·  znaménko je znaménko kosinu — nic víc
Táhni úhlem přes 90°. Skalární součin změní znaménko přesně tam, a průmět b na a se překlopí na druhou stranu.
  • 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:

|a · b| ≤ |a| |b|Cauchyho–Schwarzova nerovnost

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.

Vzorce v této kapitole

a·b — skalární součin ze složek
a·b = a₁b₁ + a₂b₂ + a₃b₃ [—] ISO 80000-2
cos θ — úhel mezi vektory
cos θ = (a·b)/(|a||b|); počítej θ = atan2(|a×b|, a·b) [rad] Kahan 2016, §12
|a·b| ≤ |a||b| — Cauchyho–Schwarzova nerovnost
|a·b| ≤ |a||b|, rovnost ⇔ rovnoběžné [—] kap. 4