SymPy-demo 2: Generelle vektorrum#

Demo af Jakob Lemvig, Christian Mikkelstrup, Hans Henrik Hermansen, Karl Johan Måstrup Kristiansen og Magnus Troen. Revideret 24-10-24 af shsp.

from sympy import *
init_printing()

Udvalgte vektoroperationer#

Betragt følgende vektorer:

xs = symbols('x:7')
v1 = Matrix(xs[:3])
v2 = Matrix(xs[4:])
v1,v2
\[\begin{split}\displaystyle \left( \left[\begin{matrix}x_{0}\\x_{1}\\x_{2}\end{matrix}\right], \ \left[\begin{matrix}x_{4}\\x_{5}\\x_{6}\end{matrix}\right]\right)\end{split}\]

Det sædvanlige prikprodukt og krydsprodukt er defineret i SymPy som .dot() og .cross().

v1.dot(v2), v1.cross(v2)
\[\begin{split}\displaystyle \left( x_{0} x_{4} + x_{1} x_{5} + x_{2} x_{6}, \ \left[\begin{matrix}x_{1} x_{6} - x_{2} x_{5}\\- x_{0} x_{6} + x_{2} x_{4}\\x_{0} x_{5} - x_{1} x_{4}\end{matrix}\right]\right)\end{split}\]

Vektornormen er defineret ved .norm(ord = None). Som standard anvender SymPy den euklidiske 2-norm - andre typer normer og deres anvendelser kan findes i SymPys Matrix-dokumentation.

v1.norm()
../_images/124c735ef8c641cf54c2befaf3b24545d39e76006465bc71222dcd913dc6f17c.png

Bemærk, at det gør en stor forskel for normen, om symbolerne defineres som reelle eller komplekse.

Udtynding af en udspænding#

Betragt følgende fire vektorer i \(\mathbb{C}^4\):

\[\begin{split} v_1 = \left[\begin{matrix}1 + i\\3\\0\\7 i\end{matrix}\right], \ v_2 = \left[\begin{matrix}2\\4 - i\\2 i\\8 - i\end{matrix}\right], \ v_3 = \left[\begin{matrix}3 + i\\7 - i\\2 i\\8 + 6 i\end{matrix}\right], \ v_4 = \left[\begin{matrix}3\\-1 - i\\7 i\\0\end{matrix}\right]. \end{split}\]
v1 = Matrix([1+I, 3, 0 , 7*I])
v2 = Matrix([2, 4-I, 2*I, 8-I])
v3 = Matrix([3+I, 7-I, 2*I, 8+6*I])
v4 = Matrix([3,-1-I, 7*I, 0])

Disse vektorer udspænder et vektorrum, \(\operatorname{span}(\mathbf v_1,\mathbf v_2,\mathbf v_3,\mathbf v_4)\). Men kan udspændingen udtrykkes med færre vektorer? Det, vi efterspørger, er den størst mulige lineært uafhængige delmængde af dem. Hvis de fire vektorer samles som søjler i en matrix:

V = Matrix.hstack(v1,v2,v3,v4)
V
\[\begin{split}\displaystyle \left[\begin{matrix}1 + i & 2 & 3 + i & 3\\3 & 4 - i & 7 - i & -1 - i\\0 & 2 i & 2 i & 7 i\\7 i & 8 - i & 8 + 6 i & 0\end{matrix}\right]\end{split}\]

så er det denne matrix’ søjlerum, vi efterspørger. Dette kan SymPy finde for os med kommandoen .columnspace():

V.columnspace()
\[\begin{split}\displaystyle \left[ \left[\begin{matrix}1 + i\\3\\0\\7 i\end{matrix}\right], \ \left[\begin{matrix}2\\4 - i\\2 i\\8 - i\end{matrix}\right], \ \left[\begin{matrix}3\\-1 - i\\7 i\\0\end{matrix}\right]\right]\end{split}\]

Fra ovenstående output ser vi, at

\[ \operatorname{span}(\mathbf v_1,\mathbf v_2,\mathbf v_3,\mathbf v_4) = \{c_1\mathbf v_1 + c_2\mathbf v_2 + c_4\mathbf v_4 \,|\, c_1,c_2,c_3 \in \mathbb{C}\}=\operatorname{span}(\mathbf v_1,\mathbf v_2,\mathbf v_4). \]

Basis#

Lad de fire matricer \(\mathbf A\), \(\mathbf B\), \(\mathbf C\) og \(\mathbf D\) udspænde et underrum i \(\mathbb R^{2\times 2}\):

\[ \begin{align}\begin{aligned}\begin{split} \mathbf{A} = \begin{bmatrix} 1 & -6 \\ 2 & 0 \end{bmatrix}, \mathbf{B} = \begin{bmatrix} 1 & 2 \\ -2 & 0 \end{bmatrix} \\\end{split}\\\begin{split} \mathbf{C} = \begin{bmatrix} -2 & 2 \\ 1 & 0 \end{bmatrix}, \mathbf{D} = \begin{bmatrix} 3 & -4 \\ -1 & 0 \end{bmatrix}. \end{split}\end{aligned}\end{align} \]
A = Matrix([[1,-6],[2,0]])
B = Matrix([[1,2],[-2,0]])
C = Matrix([[-2,2],[1,0]])
D = Matrix([[3,-4],[-1,0]])
A, B, C, D
\[\begin{split}\displaystyle \left( \left[\begin{matrix}1 & -6\\2 & 0\end{matrix}\right], \ \left[\begin{matrix}1 & 2\\-2 & 0\end{matrix}\right], \ \left[\begin{matrix}-2 & 2\\1 & 0\end{matrix}\right], \ \left[\begin{matrix}3 & -4\\-1 & 0\end{matrix}\right]\right)\end{split}\]

Vi ønsker at finde dimensionen af og en basis for dette underrum, \(\mathrm{span}(\mathbf{A},\mathbf{B},\mathbf{C},\mathbf{D})\). Standardbasen for \(\mathbb{R}^{2 \times 2}\) er:

\[\begin{split} E_{\mathbb {R_{2\times 2}}} = \left( \left[\begin{matrix}1 & 0\\0 & 0\end{matrix}\right], \ \left[\begin{matrix}0 & 0\\1 & 0\end{matrix}\right], \ \left[\begin{matrix}0 & 1\\0 & 0\end{matrix}\right], \ \left[\begin{matrix}0 & 0\\0 & 1\end{matrix}\right]\right), \end{split}\]

og SymPy kan generere vektorrepræsentationen af hver matrix med hensyn til denne basis med kommandoen .vec():

A.vec(),B.vec(),C.vec(),D.vec()
\[\begin{split}\displaystyle \left( \left[\begin{matrix}1\\2\\-6\\0\end{matrix}\right], \ \left[\begin{matrix}1\\-2\\2\\0\end{matrix}\right], \ \left[\begin{matrix}-2\\1\\2\\0\end{matrix}\right], \ \left[\begin{matrix}3\\-1\\-4\\0\end{matrix}\right]\right)\end{split}\]

Ovenstående output er altså matricernes koordinatvektorer med hensyn til standardbasen. Disse samles som søjler i en koordinatmatrix:

V = Matrix.hstack(A.vec(),B.vec(),C.vec(),D.vec())
V
\[\begin{split}\displaystyle \left[\begin{matrix}1 & 1 & -2 & 3\\2 & -2 & 1 & -1\\-6 & 2 & 2 & -4\\0 & 0 & 0 & 0\end{matrix}\right]\end{split}\]

Lad os nu se på nogle metoder til at finde frem til en basis for samt dimensionen af underrummet.

Metode 1 - Undersøg søjlerummet af \(\mathbf V\)#

Benyt .columnspace()-kommandoen:

V.columnspace()
\[\begin{split}\displaystyle \left[ \left[\begin{matrix}1\\2\\-6\\0\end{matrix}\right], \ \left[\begin{matrix}1\\-2\\2\\0\end{matrix}\right]\right]\end{split}\]

Outputtet indeholder to vektorer, som vi genkender som koordinatvektorerne for matricerne \(\mathbf A\) og \(\mathbf B\). Underrummet \(\mathrm{span}(\mathbf{A},\mathbf{B},\mathbf{C},\mathbf{D})\) har altså dimensionen \(2\) og udspændes af \(\textbf A\) og \(\textbf B\), dvs. disse to matricer udgør en basis for rummet.

Metode 2 - Undersøg den reducerede trappeform#

Benyt .rref()-kommandoen:

V.rref()
\[\begin{split}\displaystyle \left( \left[\begin{matrix}1 & 0 & - \frac{3}{4} & \frac{5}{4}\\0 & 1 & - \frac{5}{4} & \frac{7}{4}\\0 & 0 & 0 & 0\\0 & 0 & 0 & 0\end{matrix}\right], \ \left( 0, \ 1\right)\right)\end{split}\]

Da den reducerede trappeform afslører en rang på \(2\), er dimensionen af \(\mathrm{span}(\mathbf{A},\mathbf{B},\mathbf{C},\mathbf{D})\) også \(2\). Fra den reducerede trappeform aflæser vi, at \(\mathbf A\) og \(\mathbf B\) er lineært uafhængige, da kun disses søjler indeholder pivoter, og derfor udgør de en basis for \(\mathrm{span}(\mathbf{A},\mathbf{B},\mathbf{C},\mathbf{D})\) - se lærebogen for den relevante definition. Lad os ved \(\beta\) betegne den basis, der består af basisvektorerne \(\mathbf A\) og \(\mathbf B\). Nye koordinater for \(\mathbf C\) og \(\mathbf D\) med hensyn til basis \(\beta\) findes ved at løse følgende ligningssystemer:

\[\begin{split} x_1 \cdot \mathbf{A} + x_2 \cdot \mathbf{B} = \mathbf{C}\\ x_3 \cdot \mathbf{A} + x_4 \cdot \mathbf{B} = \mathbf{D}. \end{split}\]

Disse løses ved at opstille totalmatricer med koordinatvektorerne for \(\mathbf A\) og \(\mathbf B\) som søjler i koefficientmatricen, og koordinatvektoren for \(\mathbf C\), hhv. \(\mathbf D\), som højreside. Bemærk, at koordinatvektoren for \(\mathbf C\) er tredje søjle i V, hhv. fjerde søjle for \(\mathbf D\).

# Koefficientmatrix
V_12 = V[:,[0,1]] # Dette udtrækker koordinatvektorerne for A og B

# Løser for C
linsolve((V_12, V.col(2)))
../_images/dc0bad8428e61bf60e6344b4f476a53d4ca6a0b58e972192f039d027dcec42c9.png
# Løser for D
linsolve((V_12, V.col(3)))
../_images/50af93d448d4644d936351facab833f1e270f0d9420e65482141afd489026833.png

Koefficienterne er nu kendt, og vi har linearkombinationerne:

\[ \mathbf{C} = -\frac{3}{4} \cdot \mathbf{A} -\frac{5}{4} \cdot \mathbf{B}\quad\text{og}\quad \mathbf{D} = \frac{5}{4} \cdot \mathbf{A} + \frac{7}{4} \cdot \mathbf{B}, \]

så koordinatvektorerne for matricerne \(\mathbf C\) og \(\mathbf D\) i basis \(\beta\) er dermed:

\[\begin{split} [\mathbf{C}]_\beta = \begin{bmatrix} -\frac 3 4 \\[3pt] -\frac 5 4 \end{bmatrix} \quad\text{og}\quad [\mathbf{D}]_\beta = \begin{bmatrix} \frac 5 4 \\[3pt] \frac 7 4 \end{bmatrix}. \end{split}\]

Et tjek for en sikkerheds skyld:

Eq(C,-A * Rational(3/4) - Rational(5/4) * B), \
Eq(D, Rational(5/4) * A + Rational(7/4) * B)
../_images/41b5fef7dd7168fe53773e0bdbbc70ab178324f56fa43ca1cb4a63eeeee47037.png

Forskel mellem reelle og komplekse vektorrum#

Betragt følgende tre vektorer i \(\mathbb{C}^3\):

\[\begin{split} \mathbf v_1 = \left[\begin{matrix}1 + i\\3\\0\end{matrix}\right], \ \mathbf v_2 = \left[\begin{matrix}2\\4 - i\\2 i\end{matrix}\right], \ \mathbf v_3 = \left[\begin{matrix}2 + 2 i\\7 + 2 i\\2 i\end{matrix}\right] . \end{split}\]
v1 = Matrix([1+I, 3, 0])
v2 = Matrix([2, 4-I, 2*I])
v3 = Matrix([2 + 2*I, 7 + 2*I, 2*I])
A = Matrix.hstack(v1,v2,v3)
A
\[\begin{split}\displaystyle \left[\begin{matrix}1 + i & 2 & 2 + 2 i\\3 & 4 - i & 7 + 2 i\\0 & 2 i & 2 i\end{matrix}\right]\end{split}\]

Vi vil undersøge, hvorvidt \(\mathbf v_1,\mathbf v_2,\mathbf v_3\) udgør en basis for hhv. det reelle vektorrum \(\mathbb C^3\) (så over \(\mathbb R\)) og for det komplekse vektorrum \(\mathbb C^3\) (så over \(\mathbb C\)). \(\mathbb C^3\) er 3-dimensionelt, og de tre vektorer udgør en basis for et vektorrum med dimension \(3\), netop hvis de er lineært uafhængige (se det relevante theorem i kursuslærebogen).

Da \(\mathbf A = [\mathbf v_1,\mathbf v_2,\mathbf v_3] \in \mathbb{C}^{3 \times 3}\) er en kvadratisk matrix, kan vi benytte determinanten til at undersøge for lineær uafhængighed af \(\mathbf v_1,\mathbf v_2,\mathbf v_3\) (se den relevante sætning i lærebogen). Dette er tilstrækkeligt til at undersøge, om vektorerne er lineært uafhængige i - og dermed om de udgør en basis for - vektorrummet \(\mathbb C^3\) over \(\mathbb C\). Men det er ikke nok til at fastslå lineær uafhængighed over \(\mathbb R\). For at undersøge dette betragter vi i stedet deres linearkombination (se den relevante definition i lærebogen).

Lad \(c_1,c_2,c_3 \in \mathbb F\). Vektorerne er lineært uafhængige, hvis ligningen

\[ c_1 \mathbf v_1 + c_2 \mathbf v_2 + c_3 \mathbf v_3 = \mathbf 0 \]

kun er sand for \(c_1= c_2= c_3 = 0\). Skrevet som et matrix-vektorprodukt,

\[\begin{split} \left[\begin{matrix}1 + i & 2 & 2 + 2 i\\3 & 4 - i & 7 + 2 i\\0 & 2 i & 2 i\end{matrix}\right]\left[\begin{matrix}c_{1}\\c_{2}\\c_{3}\end{matrix}\right] = \left[\begin{matrix}0\\0\\0\end{matrix}\right], \end{split}\]

kan vi løse som følger:

cs = symbols('c1:4', real=True)
sol = linsolve((A, zeros(3,1)))
Eq(Matrix(cs), Matrix(list(sol)[0]))
\[\begin{split}\displaystyle \left[\begin{matrix}c_{1}\\c_{2}\\c_{3}\end{matrix}\right] = \left[\begin{matrix}\tau_{0} \left(-1 - i\right)\\- \tau_{0}\\\tau_{0}\end{matrix}\right]\end{split}\]

Vi ser, at der er andre løsninger end nulløsningen, så ved første øjekast kunne vi tro, at dette fastslår lineær afhængighed - men vi skal ikke være for hurtige!

  • Det er korrekt, at \(\mathbf v_1,\mathbf v_2,\mathbf v_3\) er lineært afhængige i det komplekse vektorrum \(\mathbb C^3\) (så over \(\mathbb C\)), netop fordi der findes værdier af \(c_1,c_2,c_3 \in \mathbb C\), som ikke er nul, der opfylder linearkombinationen.

  • Men et nærmere kig på løsningen viser, at den indeholder imaginære, ikke-reelle værdier. I vektorrummet \(\mathbb C^3\) over \(\mathbb R\) skal vi have \(c_1,c_2,c_3 \in \mathbb R\). Dette opfyldes kun, når \(\tau_0 = 0\), hvilket betyder, at \(c_1 = c_2 = c_3 = 0\) er den eneste løsning i dette tilfælde. Derfor er \(\mathbf v_1,\mathbf v_2,\mathbf v_3\) lineært uafhængige i det reelle vektorrum \(\mathbb C^3\) (så over \(\mathbb R\)), og de udgør dermed en basis for \(\mathbb C^3\) over \(\mathbb R\).