SymPy-demo 2: Generelle vektorrum#
Demo af Jakob Lemvig, Christian Mikkelstrup, Hans Henrik Hermansen, Karl Johan Måstrup Kristiansen og Magnus Troen. Revideret 22-10-26 af shsp.
from sympy import *
init_printing()
Udvalgte vektoroperationer#
Betragt følgende vektorer:
xs = symbols('x1:7')
v1 = Matrix(xs[:3])
v2 = Matrix(xs[3:])
v1,v2
Det sædvanlige prikprodukt og krydsprodukt er defineret i SymPy som .dot() og .cross().
v1.dot(v2), v1.cross(v2)
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()
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\):
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
så er det denne matrix’ søjlerum, vi efterspørger. Dette kan SymPy finde for os med kommandoen .columnspace():
V.columnspace()
Fra ovenstående output ser vi, at
Basis#
Lad de fire matricer \(\mathbf A\), \(\mathbf B\), \(\mathbf C\) og \(\mathbf D\) udspænde et underrum i \(\mathbb R^{2\times 2}\):
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
Vi ønsker at finde dimensionen af og en basis for dette underrum, \(\mathrm{span}(\mathbf{A},\mathbf{B},\mathbf{C},\mathbf{D})\). Den ordnede standardbasis for \(\mathbb R^{2 \times 2}\) er:
og SymPy kan generere vektorrepræsentationen af hver matrix med hensyn til denne ordnede basis med kommandoen .vec():
A.vec(),B.vec(),C.vec(),D.vec()
Ovenstående output er altså matricernes koordinatvektorer med hensyn til den ordnede standardbasis. Disse samles som søjler i en koordinatmatrix:
V = Matrix.hstack(A.vec(),B.vec(),C.vec(),D.vec())
V
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()
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 underrummet.
Metode 2 - Undersøg den reducerede trappeform#
Benyt .rref()-kommandoen:
V.rref()
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 ordnede basis, der består af basisvektorerne \(\mathbf A\) og \(\mathbf B\) i denne rækkefølge. Nye koordinater for \(\mathbf C\) og \(\mathbf D\) med hensyn til den ordnede basis \(\beta\) findes ved at løse følgende ligningssystemer:
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)))
# Løser for D
linsolve((V_12, V.col(3)))
Koefficienterne er nu kendt, og vi har linearkombinationerne:
så koordinatvektorerne for matricerne \(\mathbf C\) og \(\mathbf D\) i den ordnede basis \(\beta\) er dermed:
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)