Skalární součin
Standardní skalární součin
Pro standardní skalární součin $\langle \boldsymbol x,\boldsymbol y\rangle=\sum\limits_{i=1}^n x_i \overline{y_i}$ nad $\mathbb C^n$, resp $\mathbb R^n$ určete u následujících vektorů $\boldsymbol x$ a $\boldsymbol y$:
- skalární součin vektorů $\boldsymbol x$ a $\boldsymbol y$,
- euklidovské normy vektorů $\boldsymbol x$ a $\boldsymbol y$,
- vzdálenost vektorů $\boldsymbol x$ a $\boldsymbol y$,
- zdali jsou vektory $\boldsymbol x$ a $\boldsymbol y$ navzájem kolmé.
Nápověda:
Součiny x*y a x.dot_product(y) dávají $\sum\limits_{i=1}^n x_i y_i$ - a to i nad komplexními čísly!
Komplexně sdružený vektor je možné získat metodou .conjugate().
x = vector([4, 2, 3]); y = vector([1, 5, -2])
x = vector([3, 1, -2]); y = vector([1, -3, 2])
x = vector([2, -1, 4]); y = vector([5, 2, -2])
x = vector([2, 1, 4, -1]); y = vector([4, -1, 0, 2])
x = vector([2+i, 0, 4-5*i]); y = vector([1+i, 2+i, -1])
x = vector([1, 2, 1, -2*i]); y = vector([i, 2*i, i-1, 2])
Nestandardní skalární součin
Pro skalární součin na $\mathbb C^3$ daný předpisem $\langle \boldsymbol x,\boldsymbol y\rangle= x_1\overline{y_1} + x_2\overline{y_2} + 2x_3\overline{y_3} + x_3\overline{y_2} + x_2\overline{y_3}$ určete u následujících vektorů $\boldsymbol x$ a $\boldsymbol y$:
- skalární součin vektorů $\boldsymbol x$ a $\boldsymbol y$,
- normy vektorů $\boldsymbol x$ a $\boldsymbol y$,
- zdali jsou vektory $\boldsymbol x$ a $\boldsymbol y$ navzájem kolmé.
Nápověda:
V sage (pythonu) je možné si nadefinovat vlastní součin pomocí konstrukce:
def soucin(x,y):
return(x[0]* ... )
x = vector([4, 2, 3]); y = vector([1, 5, -2])
x = vector([3, 1, -2]); y = vector([1, -3, 2])
x = vector([2, -1, 4]); y = vector([5, 2, -2])
x = vector([2+i, 0, 4-5*i]); y = vector([1+i, 2+i, -1])
Gramova-Schmidtova ortonormalizace a kolmá projekce
V prostoru $\mathbb R^4$ se standardním skalárním součinem $\langle \boldsymbol x,\boldsymbol y\rangle=\sum\limits_{i=1}^4 x_iy_i$
určete podle Gramova-Schmidtova předpisu ortonormální bázi $Z=\{\boldsymbol z_1,\dots,\boldsymbol z_r\}$ řádkového prostoru následujících matic:
Nápověda:
Projekci vektoru $\boldsymbol u$ na vektor $\boldsymbol v$ jednotkové délky, čili $\langle \boldsymbol u,\boldsymbol v\rangle\boldsymbol v$, lze pro reálné vektory získat výrazem (uv)v.
První řádek matice $\boldsymbol A$ je A[0], atd.
matrix(SR, [
[0, 3, 4, 0],
[0, 0, 5, 0],
[2, 1, 0, 2]])
matrix(SR, [
[ 2, 0, 1, 2],
[ 4, 3, 2, 4],
[ 6, -5, 3, 6],
[ -4, 2, 4, 2]])
matrix(SR, [
[ 2, 4, 2, 1],
[ -1, -2, -2, -1],
[ 1, 2, 4, 2],
[ 1, 2, 3, 4]])
Rozšiřte ortonormální báze z předchozí úlohy na ortonormální báze $\mathbb R^4$.
Nápověda:
Při výpočtu je možné využít odstupňovaný tvar matice A.rref().
A.stack(vector([1, 2, 3, 4])) vrátí matici, v níž je k matici $\boldsymbol A$ přidán řádek $1, 2, 3, 4$.
Pro matice z předchozí úlohy určete ortogonální projekci $\boldsymbol p$ vektoru $\boldsymbol a=(2,2,1,5)^{\mathrm T}$ do řádkového prostoru příslušné matice a souřadnice této projekce $[\boldsymbol p]_Z$ vzhledem k bázi $Z$.
a = vector([2, 2, 1, 5])
Přibližné řešení soustavy lineárních rovnic
Pomocí projekce najděte nejlepší přibližné řešení soustavy $\boldsymbol A\boldsymbol x=\boldsymbol b$.
Všimněte si, že sloupce matice $\boldsymbol A$ jsou vzájemně kolmé.
A = matrix([
[2 , 1 , 0],
[4 , 2 , 0],
[2 , -4 , -1],
[1 , -2 , 2]])
b = vector([10, 5, 13, 9])
Báze prostorů souvisejících s maticí
Pro následující matici $\boldsymbol A$ najděte ortonormální bázi $\ker(\boldsymbol A)$ a poté ji rozšiřte na bázi $\mathbb R^5$.
Také najděte ortonormální bázi jejího řádkového prostoru $\boldsymbol A$ a poté ji rozšiřte na bázi $\mathbb R^5$.
Jak spolu nalezené báze souvisejí?
Úlohu lze řešit i s ortogonálními bázemi namísto ortonormálních, t.j. bez úpravy normy vektorů.
Nápověda:
Jádro matice $\boldsymbol A$ dává metoda A.right_kernel().
Abychom z tohoto podprostoru získali matici, jejíž řádky tvoří bázi jádra, je třeba zavolat matrix( A.right_kernel().basis() ) .
Metoda A.gram_schmidt() vrací dvě matice: v první je ortogonální báze řádkového prostoru matice $\boldsymbol A$ a ve druhé matice úprav použitých při Gramově-Schmidtově ortonormalizaci.
A = matrix([
[ 2, 0, 3, -6, 0],
[ -5, 0, 3, 8, 0],
[ 7, 4, 0, -14, 3],
[ -1, 1, -12, 10, 7],
[ 5, 7, -3, -8, -1]])
Matice isometrie
Rozhodněte, zdali následující matice jsou matice isometrií vzhledem ke standardnímu skalárnímu součinu na prostoru $\mathbb R^d$ odpovídající dimenze $d$.
1/2*matrix([
[ 1, 1, 1, 1],
[ 1, 1, -1, -1],
[ 1, -1, 0, 0],
[ 0, 0, -1, 1]])
1/2*matrix([
[ 1, 1, 1, 1],
[ 1, 1, -1, -1],
[ 1, -1, -1, 1],
[ 1, -1, 1, -1]])
1/sqrt(2)*matrix([
[ 1, 1, 0, 0],
[ 1, -1, 0, 0],
[ 0, 0, -1, 1],
[ 0, 0, -1, -1]])
1/7*matrix([
[ 3, 2, -6],
[ -6, 3, 2],
[ 2, -6, 3]])
1/7*matrix([
[ 3, 2, 6],
[ -6, 3, 2],
[ 2, 6, -3]])
Řešení
Pokud si nevíte rady, můžete zde kliknout a ukáže se vám řešení (nebo alespoň jeho podstatná část):
Standardní skalární součin
Standardní skalární součin vektorů $\boldsymbol x$ a $\boldsymbol y$ se vypočte přímo
x * y
případně v komplexním oboru
x * conjugate(y)
Vektory jsou navzájem kolmé, pokud je jejich skalární součin roven 0. Norma vektoru $\boldsymbol x$ je
sqrt( x * x )
případně v komplexním oboru
sqrt( x * conjugate(x) )
Nestandardní skalární součin
Stačí definovat součin podle nápovědy:
def soucin(x,y):
return( x[0] * conjugate(y[0]) + x[1] * conjugate(y[1]) + 2 * x[2] * conjugate(y[2]) + x[2] * conjugate(y[1]) + x[1] * conjugate(y[2]) )
soucin(x,y)
Gramova-Schmidtova ortonormalizace
Postup lze odkrokovat
A = matrix(SR, [
[0, 3, 4, 0],
[0, 0, 5, 0],
[2, 1, 0, 2]])
B = copy(A)
C = copy(A)
B[0] = A[0]
C[0] = ( 1 / sqrt( B[0] * B[0] ) ) * B[0]
B[1] = A[1] - (A[1] * C[0] ) * C[0]
C[1] = ( 1 / sqrt( B[1] * B[1] ) ) * B[1]
B[2] = A[2] - (A[2] * C[0] ) * C[0] - (A[2] * C[1] ) * C[1]
C[2] = ( 1 / sqrt( B[2] * B[2] ) ) * B[2]
nebo přímo napsat celý algoritmus
A = matrix(SR, [
[ 2, 0, 1, 2],
[ 4, 3, 2, 4],
[ 6, -5, 3, 6],
[ -4, 2, 4, 2]])
B = copy(A)
C = copy(A)
for i in range(A.nrows()) :
B[i] = A[i]
for j in range(i) :
B[i] = B[i] - (A[i] * C[j] ) * C[j]
print(i)
print(B[i])
norm = sqrt( B[i] * B[i] )
if norm != 0 :
C[i] = ( 1 / norm ) * B[i]
else :
C[i] = B[i];
print(C[i])
Pozn. za těleso je možné volit algebraická čísla AA, zde pro přehlednost též symbolický okruh SR.
Při použití desetinných reálných čísel RR by namísto testování na nulu norm != 0 bylo vhodné volit test na zaokrouhlovací chybu.
Gramova-Schmidtova ortonormalizace - doplnění báze
Odstupňovaný tvar matice A.rref() nebo seznam sloupců s pivoty A.pivots() napoví, které vektory jsou nutně lineárně nezávislé na vektorech řádkového prostoru - např. ty, jejichž doplněním získáme nové pivoty.
Jim příslušné řádky lze doplnit do matice A a zopakovat ortonormalizaci.
Například přidání pivotu do posledního sloupce lze provést příkazem:
A = A.stack( vector([0, 0, 0, 1]) )
Gramova-Schmidtova ortonormalizace - kolmá projekce
Pro získání koeficientů stačí spočítat příslušné skalární součiny. Vzhledem k tomu, že jde o standardní skalární soucin, lze využít maticový součin:
C * a
Projekci pak získáme jako lineární kombinaci s právě spočtenými koeficienty:
(C * a) * C
nebo
C.transpose() * (C * a)
Přibližné řešení soustavy lineárních rovnic
Vektory jsou již kolmé, stačí je tedy normalizovat. Buď s využitím části kódu Gramovy-Schmidtovy ortonormalizace nebo stručněji vynásobením $(\boldsymbol A^\mathrm{T}\boldsymbol A)^{-1} $
Odkrokujte si:
A.transpose() * A
( A.transpose() * A ).inverse()
A * ( ( A.transpose() * A ).inverse() )
Podobně jako v předchozí úloze jsou přibližným Fourierovy koeficenty. S jejich pomocí lze dopočítat i požadovanou projekci:
b * A * ( ( A.transpose() * A ).inverse() )
A * ( b * A * ( ( A.transpose() * A ).inverse() ) )
nebo lépe se zřetelem na typy matic:
b * ( A * ((A.transpose() * A ).inverse()) * A.transpose())
Lze ukázat, že uvedený maticový součin funguje i když sloupce $\boldsymbol A$ nejsou navzájem kolmé. Jinými slovy matice $\boldsymbol A(\boldsymbol A^\mathrm{T} \boldsymbol A)^{-1} \boldsymbol A^\mathrm{T}$ je vždy maticí kolmé projekce.
Báze prostorů souvisejících s maticí
Odkrokujte si:
A.right_kernel()
C = matrix( A.right_kernel().basis() )
C.pivots()
identity_matrix(5)[1:]
C.stack( identity_matrix(5)[1:] )
a pak postupujte podobně jako v úloze o ortonormalizaci.
Alternativně, použijte A.gram_schmidt(). Normalizovat sice není nutné, ale lze je zařídit přímočaře:
for i in range(a.ncols()):
v = a.column(i)
if v.norm() <> 0 :
a[:,i] = v/v.norm()
Matice isometrie
Stačí ověřit, zdali matice $\boldsymbol A$ je ortogonální, neboli porovnat součin $\boldsymbol A\boldsymbol A^\mathrm{T}$ s jednotkovou maticí.