Tomáš Kalvoda, KAM FIT ČVUT, 2019
Tento příklad je poměrně typický a obsahuje většinu pojmů týkajících se lineárního zobrazení. Použijeme ho proto jako ukázkový.
Máme lineární zobrazení, resp. operátor, zadané předpisem
pro každý vektor . Linearitu tohoto zobrazení na tomto místě nebudeme ověřovat, plyne velmi jednoduše přímo z definice (ověřte, že pro každé ).
Pro naše účely v SageMath stačí pracovat v . Následuje definice našeho vektorového prostoru a samotného zobrazení .
V = QQ^4
def A(v):
# pozor na indexování vektorů od 0
return V([v[0], v[0] - v[1], v[0] + 2*v[2], v[3]])
Tato definice přesně odpovídá té v zadání Příkladu 6.8 o pár řádků výše. tedy na vektorech působí dle definice například takto
A(V([1,2,3,4]))
(1, -1, 7, 4)
A(V([1,0,0,0]))
(1, 1, 1, 0)
bere na vstupu čtveřici čísel, vektor z , a vyplivne výsledek, opět vektor z .
V prostoru máme v Příkladu 6.8 zadány dvě báze:
X = [
V((1, 0, -1, 1)),
V((2, 1, 0, -1)),
V((0, 2, -1, 1)),
V((2, -1, 1, 0))
]
Y = [
V((0, 0, 0, 1)),
V((0, 0, -1, 1)),
V((0, 1, -1, 1)),
V((1, 1, 1, 1))
]
# Abychom snadno mohli pracovat se souřadnicemi ve zvolených bázích,
# změníme si ve V bázi (v definici V výše se implicitně bere standardní).
VX = V.span_of_basis(X)
VY = V.span_of_basis(Y)
Máme-li například vektor , pak jeho souřadnice vzhledem k bázi jsou . Tj. platí .
Skutečně, nejprve zadefinujme :
w = V((1, 2, 3, 4))
show(w)
Nyní spočtěme souřadnice v bázi :
cxW = VX.coordinates(w)
show(cxW)
A otestujme požadovanou rovnost:
# pozor na indexování listů od 0, range(4) = {0,1,2,3}.
sum([ cxW[j] * X[j] for j in range(4) ])
(1, 2, 3, 4)
To je (nepřekvapivě!) skutečně vektor . Podívejme se na jeho souřadnice v bázi :
cyW = VY.coordinates(w)
show(cyW)
To je sice jiná čtveřice, ale stále platí následující vztah:
sum([ cyW[j] * Y[j] for j in range(4) ])
(1, 2, 3, 4)
Máme vypočítat matici . O té z přednášky víme, že má ve sloupcích postupně souřadnice -obrazů bazických vektorů báze v bázi . Tedy
Klíčová vlasnost (z které vlastně lze i definici výše odvodit) této matice je následující:
O co zde je? Původní zobrazení pracuje s vektory, matice lineárního zobrazení reprezentuje působení tohoto zobrazení pomocí souřadnic vektorů.
Sestavme matici našeho zobrazení vzhledem k bázím a , přímo z definice:
XAY = matrix(QQ, 4) # alokace prázdné matice
for j in range(4):
XAY[:, j] = V(VY.coordinates(A(X[j])))
show(XAY)
(Ručně bychom napočítali obrazy bazických vektorů báze a poté jejich souřadnice v bázi ; provedli bychom tedy několik aplikací zobrazení a poté bychom vyřešili jeden GEM s více pravými stranami).
Jak tato matice souvisí se zobrazením (viz definice pomocí funkce výše)?
Stručně řečeno, souvislost mezi lineárním zobrazením a jeho maticí vzhledem k jistým bázím je následující:
Ukažme si to opět na našem vektoru . Z pohledu je to jednoduché.
w = V([1, 2, 3, 4])
print("vzor:")
show(w)
print("obraz:")
show(A(w))
vzor:
obraz:
Aplikujme matici (zleva) zobrazení na souřadnice vektoru v bázi . Dostaneme souřadnice výstupního vektoru v bázi :
cyAw = XAY * V(VX.coordinates(w))
show(cyAw)
Pokud pomocí těchto souřadnic napočteme zpětně , měli bychom dostat stejný výsledek jako výše.
# Aw =
sum([ cyAw[j] * Y[j] for j in range(4) ])
(1, -1, 7, 4)
Opravdu!
Co je dobré si uvědomit:
XAX = matrix(QQ, 4) # alokace prázdné matice
for j in range(4):
XAX[:, j] = V(VX.coordinates(A(X[j])))
show(XAX)
Nebo :
YAY = matrix(QQ, 4) # alokace prázdné matice
for j in range(4):
YAY[:, j] = V(VY.coordinates(A(Y[j])))
show(YAY)
Tyto různé matice reprezentují stále stejný operátor, jen počítají jeho působení z jiných bazí do jiných bazí, proto jsou to nutně jiné matice.
Vzhledem k tomu jak jsou matice lineárních zobrazení definované a jaký je jejich význam popsaný výše, tak by nemělo být překvapující jak souvisí se skládáním zobrazení. Pro přípustné báze a dvě lineární zobrazení zřejmě platí
Jen si představte co tento vztah říká, jsou dva ekvivalentní způsoby jak z spočítat :
Druhou ingrediencí, kterou budeme potřebovat, je jednoduché pozorování týkající se převodu souřadnic jednoho vektoru z jedné báze do druhé. K tomu lze využít identické zobrazení (které je jistě lineární), . Toto zobrazení tedy s vektorem nic neudělá. Z toho plyne, že příslušná matice zobrazení (tzv. matice přechodu) při násobení převádí souřadnice z báze do báze , tedy
Dáme-li si tyto dvě informace dohromady, tak
Pomocí matic přechodu, které je snadné sestavit, tak můžeme převádět matice zobrazení mezi libovolnými bázemi.
Jak tuto mašinérii použít v našem případě? Je snadné sestavit . Skutečně, stačí aplikovat a souřadnice výsledků ve standardní bázi máme ihned:
# standardní báze:
V.basis()
[ (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ]
EAE = matrix(QQ, 4)
for j in range(4):
EAE[:, j] = A(V.basis()[j])
show(EAE)
My však chceme
Matici je snadné sestavit, je to prostě matice mající bazické vektory báze ve sloupcích:
XtoE = matrix(QQ, X).transpose()
show(XtoE)
Podobně je snadné sestavit :
YtoE = matrix(QQ, Y).transpose()
show(YtoE)
My ovšem chceme :
EtoY = YtoE.inverse()
show(EtoY)
Konečně, pro naší matici platí
show(EtoY * EAE * XtoE)
Což je samozřejmě stejný výsledek.