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().

In [ ]:
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]* ... )

In [1]:
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.

In [6]:
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$.

In [ ]:
 

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

In [ ]:
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é.

In [ ]:
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.

In [9]:
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$.

In [10]:
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í.